Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2012, 14:33   #1
ltWolfik
 
Регистрация: 30.03.2012
Сообщений: 4
По умолчанию Как оптимально передвигать формы в Delphi?

Здравствуйте, есть проблема...
Создана форма, для которой я обрабатываю события FormMouseDown и FormMouseMove, в первой процедуре запоминаются координаты точки клика, далее во второй процедуре отслеживается изменение положения курсора(если кнопка мыши нажата) и в зависимости от этого двигается, форма, получается довольно очень медленно, форма не передвигается, а плавает за курсором ( к тому же помимо этой формы необходимо двигать одновременно ещё две формы ) вот код:
Код:
procedure THlpTxtFrm.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (Sender=HlpTxtFrm) then
  begin
     if (Y>Width-X) then
     begin
        _MouseDown:=True;
        PointOfClick.X:=X; //вот я запоминаю координаты клика
        PointOfClick.Y:=Y; //
        Contur:=TBitmap.Create;
        with Contur do // это я там ещё одновременно рисую на форме
        begin
            Height:=TextForm.Height+502; 
            Width:=TextForm.Width+502;   
            Canvas.Brush.Color:=unit1.Trans_color;
            Canvas.Pen.Color:=unit1.Trans_color;
            Canvas.Rectangle(0,0,Width,Height);
            Canvas.Pen.Color:=unit1.ColorOfFrame;
            Canvas.Pen.Style:=psDash;
            Canvas.Rectangle(251,251,Width-251,Height-251);
        end;
     end
     else
     begin
        //...Optiuns
     end;
   end;
end;

procedure THlpTxtFrm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (Sender=HlpTxtFrm) then
  begin
    if (_MouseDown) then
    begin
       Left:=Left+(X-PointOfClick.X);  //вот я передвигаю форму
       Top:=Top+(Y-PointOfClick.Y);
       TextForm.Left:=Left+Width+1;  //передвигаю ещё одну форму
       TextForm.Top:=Top+Height+1;
       BitBlt(FormHelp.Canvas.Handle,Left+Width-250,Top+Height-250, 
              Contur.Width,Contur.Height, Contur.Canvas.Handle,0,0,SrcCopy);
       Canvas.MoveTo(0,Height);    // это уже левое
       Canvas.Pen.Color:=ColorOfHlpFrm;
       Canvas.LineTo(Width,0);
       Canvas.Brush.Color:=ColorOfHlpFrm;
       Canvas.Floodfill(1,1, ColorOfHlpFrm, fsBorder);  
       //двигается третья форма
       HlpTxtFrm2.Top:=TextForm.Top+TextForm.Height-(HlpTxtFrm2.Width div 2);
       HlpTxtFrm2.Left:=TextForm.Left+TextForm.Width-(HlpTxtFrm2.Width div 2); 
    end; //if (_MouseDown) then
  end; //if (Sender=HlpTxtFrm) then
end;
кол-во вычислений попробую уменьшить за счет использования памяти, так как процессор задыхается... но даже только с этими двумя строками:
Код:
Left:=Left+(X-PointOfClick.X);  //вот я передвигаю форму
       Top:=Top+(Y-PointOfClick.Y);
работает медленно
Подскажите пожалуйста какой-нибудь другой оптимальный метод ( в Винде же даже очень сложные окошка двигаются быстро)
ltWolfik вне форума Ответить с цитированием
Старый 04.05.2012, 18:50   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Во-первых, нарисуйте то, что вам нужно, 1 раз на paintbox или image.
Во-вторых, лучше выложите проект целиком, чтобы его можно было "пощупать".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.05.2012, 13:14   #3
ltWolfik
 
Регистрация: 30.03.2012
Сообщений: 4
По умолчанию

BDA, использовал Image - все норм стало, код сейчас в читабельный вид приведу и покажу...
тут ещё вопросик возник:
есть форма с Image;
я создаю две копии этой формы, и для двух форм мне необходимо обрабатывать Image, однако компилятор начинает ругаться, когда я во второй копии начинаю упоминать про Image: (соответственно две копии: HlpTxtFrm и HlpTxtFrm2; когда я обрабатывал не Image, а форму - то все работало)

Код:
procedure THlpTxtFrm.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (Sender=HlpTxtFrm.Image1) then  //здесь он видит Image
  begin
    if (_MouseDown) then
    begin
       delta_x:=X-PointOfClick.X;
       delta_y:=Y-PointOfClick.Y;
       Left:=Left+delta_x;  
       Top:=Top+delta_y;
       TextForm.Left:=TextForm.Left+delta_x;  
       TextForm.Top:=TextForm.Top+delta_y;
       BitBlt(FormHelp.Canvas.Handle,Left+Width-250,Top+Height-250,
              Contur.Width,Contur.Height, Contur.Canvas.Handle,0,0,SrcCopy);
       HlpTxtFrm2.Top:=HlpTxtFrm2.Top+delta_y;
       HlpTxtFrm2.Left:=HlpTxtFrm2.Left+delta_x;
    end; //if (_MouseDown) then
  end       //if (Sender=HlpTxtFrm) then
  else if (Sender=HlpTxtFrm2) then  // а здесь не видит Image
  begin
         if (_MouseDown2) then
      begin
         if ( ((Left+(Width div 2))>=TextForm.Left+(screen.Width div 30)-2) and ((Top+(Height div 2))>=TextForm.Top+(screen.Height div 30)-2) ) then
         begin
            delta_x:=X-PointOfClick.X;
            delta_y:=Y-PointOfClick.Y;
            Left:=Left+delta_x;  //äâèãàþ ñàìó ñåáÿ
            Top:=Top+delta_y;
            TextForm.Height:=TextForm.Height+delta_y;
            TextForm.Width:=TextForm.Left+delta_x;
            TextForm.RichEdit1.Height:=TextForm.Height;
            TextForm.RichEdit1.Width:=TextForm.Width;
            with FormHelp.Canvas do
            begin
               Pen.Color:=Trans_color;
               Rectangle(TextForm.Left, TextForm.Top,Screen.Width,Screen.Height);  // ïîêà òàê, ìîæåò ïïæ ïîìåíÿþ íà BitBlt
               Pen.Style:=psSolid;
               MoveTo(X,TextForm.Top-1);
               LineTo(screen.Width,TextForm.Top-1);
               MoveTo(TextForm.Left-1,Y);
               LineTo(TextForm.Left-1,screen.Height);
               Pen.Style:=psDash;
               Pen.Color:=ColorOfFrame;
               Rectangle(TextForm.Left-1, TextForm.Top-1,TextForm.Left+TextForm.Width+1,TextForm.Top+TextForm.Height+1);
               Pen.Color:=Trans_color;
            end;
         end else
         begin
              if (FormHelp.Canvas.Pen.Color=Trans_color) then
              begin
               Left:=TextForm.Left+(screen.Width div 30)-(Width div 2)-2;  //äâèãàþ ñàìó ñåáÿ
               Top:=TextForm.Top+(screen.Height div 30)-(Height div 2)-2;
               TextForm.Height:=(Screen.Height div 30)-2;
               TextForm.Width:=(Screen.Width div 30)-2;
               TextForm.RichEdit1.Height:=TextForm.Height;
               TextForm.RichEdit1.Width:=TextForm.Width;
               with FormHelp.Canvas do
               begin
                  Pen.Color:=Trans_color;
                  Rectangle(TextForm.Left, TextForm.Top,Screen.Width,Screen.Height);  // ïîêà òàê, ìîæåò ïïæ ïîìåíÿþ íà BitBlt
                  Pen.Style:=psSolid;
                  MoveTo(X,TextForm.Top-1);
                  LineTo(screen.Width,TextForm.Top-1);
                  MoveTo(TextForm.Left-1,Y);
                  LineTo(TextForm.Left-1,screen.Height);
                  Pen.Style:=psDash;
                  Pen.Color:=ColorOfFrame;
                  Rectangle(TextForm.Left-1, TextForm.Top-1,TextForm.Left+TextForm.Width+1,TextForm.Top+TextForm.Height+1);
                  _MouseDown2:=false;
               end;
              end;
           end;// if ( (X>TextForm.Left+(screen.Width div 30)) and (Y>TextForm.Top+(screen.Height div 30)) ) then
      end; //if (_MouseDown2) then
  end; //if (Sender=HlpTxtFrm) then

end;

Последний раз редактировалось ltWolfik; 05.05.2012 в 13:33.
ltWolfik вне форума Ответить с цитированием
Старый 06.05.2012, 01:32   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Лучше выложите проект целиком
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.05.2012, 18:13   #5
ltWolfik
 
Регистрация: 30.03.2012
Сообщений: 4
По умолчанию

Вот, обработку второй формы пока сделал так:
Код:
if (Sender<>HlpTxtFrm.Image1) then...
в программе, после запуска - нажми t, и кликни где-нибудь на рабочем столе - появится три окошка, верхним (где черным закрашено) - можно двигать все эти окошка, может подскажешь какой-нить другой способ (более быстрый) для перетаскивания этих окошек
Вложения
Тип файла: rar prog.rar (198.8 Кб, 8 просмотров)
ltWolfik вне форума Ответить с цитированием
Старый 08.05.2012, 03:00   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

А вообще, какова задумка?
А то у меня все как-то "подглюкивает".
Какая-то невидимая форма, по которой можно рисовать)...
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.05.2012, 19:55   #7
ltWolfik
 
Регистрация: 30.03.2012
Сообщений: 4
По умолчанию

BDA, эти три окошка - интерфейс для набора текста(ты ведь открывал как я говорил - t ...),(пока несуществующая кнопка opt будет настраивать Font...) далее буду реализовывать перерисовку текста на канву (на которой кстати ты и рисовал)
ltWolfik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение картинки наиболее оптимально Alex Cones Мультимедиа в Delphi 7 29.12.2010 12:33
Как передвигать объект если он не под формой.VB somebody94 Помощь студентам 1 29.06.2010 10:07
не могу передвигать с click-ом 19950525 Gamedev - cоздание игр: Unity, OpenGL, DirectX 7 26.06.2010 20:48
Как определить, что игроки играют оптимально? k1r1ch Помощь студентам 4 23.11.2009 22:31
Нужно передвигать окружность с ускорением/ Задачка по Делфи7 НУБ!!! Помощь студентам 4 20.05.2008 21:29