Форум: "Начинающим";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
ВнизПеретаскивание 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]
> Без разницы.
Да ну?
В OnMouseDownReleaseCapture;
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.044 c