Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

Перетаскивание GroupBox   Найти похожие ветки 

 
Mops ©   (2006-09-02 22:24) [0]

Привет всем. Скажите пожалуйста, как можно перетаскивать GroupBox по форме во время исполнения созданного проекта?


 
Юрий Зотов ©   (2006-09-02 22:53) [1]

procedure TForm1.GroupBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 ReleaseCapture;
 SendMessage(GroupBox1.Handle, WM_SYSCOMMAND, $F012, 0)
end;


 
unknown ©   (2006-09-03 00:05) [2]


> Юрий Зотов ©   (02.09.06 22:53) [1]

не OnMouseMove а OnMouseDown.


 
Пусик ©   (2006-09-03 00:08) [3]


> не OnMouseMove а OnMouseDown.


Без разницы.


 
unknown ©   (2006-09-03 00:14) [4]


> Пусик ©   (03.09.06 00:08) [3]
> Без разницы.

Да ну?
В OnMouseDown
ReleaseCapture;
SendMessage(GroupBox1.Handle, WM_SYSCOMMAND, $F012, 0)

отработает только один раз. А в OnMouseMove ?

Хотите проверить? Пожалуйста :
var
 Form1: TForm1;
 z:     integer = 0;

implementation

{$R *.dfm}

procedure TForm1.GroupBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
begin
 ReleaseCapture;
 SendMessage(GroupBox1.Handle, WM_SYSCOMMAND, $F012, 0);
 Inc(z);
end;

procedure TForm1.FormClick(Sender: TObject);
begin
 ShowMessage(IntToStr(z));
end;


 
Пусик ©   (2006-09-03 00:18) [5]


> unknown ©   (03.09.06 00:14) [4]
>
> > Пусик ©   (03.09.06 00:08) [3]
> > Без разницы.
>
> Да ну?


Баранки гну.

Работает совершенно одинаково.


 
unknown ©   (2006-09-03 00:22) [6]


> Пусик ©   (03.09.06 00:18) [5]

Моя нет слов =)


 
Пусик ©   (2006-09-03 00:25) [7]


> unknown ©   (03.09.06 00:22) [6]
>
> > Пусик ©   (03.09.06 00:18) [5]
>
> Моя нет слов =)


И?
Работает одинаково. Проверено на твоем примере.


 
Юрий Зотов ©   (2006-09-03 00:51) [8]

> unknown ©   (03.09.06 00:14) [4]

Воспользуюсь Вашими же словами: Хотите проверить? Пожалуйста.

Только проверять надо так, чтобы проверялось именно то, что нужно. А не то, непонятно что.

procedure TForm1.GroupBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
begin
 Inc(z);
 Caption := IntToStr(z);
 ReleaseCapture;
 SendMessage(GroupBox1.Handle, WM_SYSCOMMAND, $F012, 0);
end;

И видим, что при перетаскивании Z не увеличивается. А Ваш код показывает рост Z не при перетаскивании, а при обычном движении мыши с ОТЖАТОЙ кнопкой. Что и должно быть.


 
unknown ©   (2006-09-03 00:52) [9]


> Пусик ©   (03.09.06 00:25) [7]

OnMouseDown отработывает при нажатии кнопки мыши на контроле.
OnMouseMove отработывает при движении (изменении позиции) мыши над контролом.
Вопрос :
Сколько раз вызовется OnMouseMove при перемещени курсора от правой
границы контрола до его середины, если ширина (width) контрола (GroupBox в
данном случае) равна 186?
Ответ:
В идеале вызовется 93 раза.


 
Юрий Зотов ©   (2006-09-03 01:03) [10]

> unknown ©   (03.09.06 00:52) [9]

А Вы все же проверьте...
:о)

Ваша ошибка вот в чем: после SendMessage(..., WM_SYSCOMMAND, $F012...) контрол уже не получает сообщений WM_MOUSEMOVE до тех пор, пока не будет отпущена кнопка мыши. Соответственно, и лишних событий OnMouseMove тоже не возникает.


 
unknown ©   (2006-09-03 01:05) [11]


> Юрий Зотов ©   (03.09.06 00:51) [8]

Ок. Вы сами все разложили по полочкам.
Теперь убедите меня, что бесконечное множество вызовов
 ReleaseCapture;
SendMessage(GroupBox1.Handle, WM_SYSCOMMAND, $F012, 0);

при движении мыши над контролом - это хороший тон.


 
Юрий Зотов ©   (2006-09-03 01:07) [12]

> unknown ©   (03.09.06 01:05) [11]

Не буду убеждать. Лучше соглашусь, что это действительно плохой тон.
:о)


 
unknown ©   (2006-09-03 01:10) [13]


> Юрий Зотов ©   (03.09.06 01:03) [10]
> и лишних событий OnMouseMove тоже не возникает

Да. НО до нажатия кнопки OnMouseMove очень даже работает.
А юзер может кнопкой и не щелкать, а просто водить мышкой над
ним. Даже до нажатия кнопки ему надо сначала подвести курсор
(к середине контрола, например). За это время OnMouseMove отработает
ой как много раз.


 
unknown ©   (2006-09-03 01:27) [14]

Если желаете - вот тест на кол-во принимаемых контролом $F012 :
type
 TGrBox = class(TGroupBox)
 private
   FWMCount: integer;
   procedure WMC(var Message: TMessage); message WM_SYSCOMMAND;
 public
   constructor Create(AOwner: TComponent); override;
   property WMCnt: integer Read FWMCount Write FWMCount;
 end;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure GrMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure GroupBox1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 Gr:    TGrBox;

implementation

{$R *.dfm}

constructor TGrBox.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FWMCount := 0;
end;

procedure TGrBox.WMC(var Message: TMessage);
begin
 if Message.Wparam = $F012 then
   Inc(FWMCount);
end;

procedure TForm1.GrMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
begin
 ReleaseCapture;
 SendMessage(TGrBox(Sender).Handle, WM_SYSCOMMAND, $F012, 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Gr      := TGrBox.Create(Self);
 Gr.Parent := Self;
 Gr.OnMouseMove := GrMouseMove;
 Gr.Left := 10;
 Gr.Top  := 10;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(IntToStr(Gr.WMCnt));
end;

Здесь нетрудно проверить и обработку OnMouseDown (я проверил, если что -
могу и код дописАть :).
В общем, признайте ошибку.


 
Юрий Зотов ©   (2006-09-03 01:36) [15]

> unknown ©   (03.09.06 01:27) [14]

Скажите, а сколько раз нужно с Вами соглашаться, чтобы Вы поняли, что с Вами согласились?


 
unknown ©   (2006-09-03 01:38) [16]


> Юрий Зотов ©   (03.09.06 01:36) [15]

Прошу прощения, не узрел [12] :)


 
Mops ©   (2006-09-03 20:05) [17]

Всё парни, спасибо вам большое! Я ожидал что-то вроде: так и так. А вы мне тут продискутировали как правильно надо делать и почему. Вообщем, спасибо.!!!



Страницы: 1 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.027 c
3-1153385859
Mintos
2006-07-20 12:57
2006.09.24
Отчет с отчета (QuikReport)


3-1153398683
zorik
2006-07-20 16:31
2006.09.24
Как изменить CHARACTER SET для всей БД?


15-1157363915
umbra
2006-09-04 13:58
2006.09.24
Линукс. Как из tar-фрхива извлечь конкретный файл/каталог?


1-1155283897
vamp_avp
2006-08-11 12:11
2006.09.24
Эмуляция нажатия клавиши в неактивном сонсольном приложении


3-1153737167
yaral
2006-07-24 14:32
2006.09.24
Результаты выполнение ХП с индексами и без