Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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]
> Без разницы.

Да ну?
В 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.046 c
3-1153908793
Fishka
2006-07-26 14:13
2006.09.24
Interbase и кодировка при первой записи


15-1157282472
Aligator
2006-09-03 15:21
2006.09.24
Вопрос по поводу Graphics32


2-1157354134
Mamochka
2006-09-04 11:15
2006.09.24
Как посчитать сколько прошло ГГГГ.ММ.ДД


4-1148406407
Донской
2006-05-23 21:46
2006.09.24
Двухголовая машина


6-1146868280
KASioZ
2006-05-06 02:31
2006.09.24
Состояние сокета winsock





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский