Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с отображением кнопок и не только. [Delphi]


Страницы:   1 2

xasha666 ©   (2007-05-06 17:50:00) 

Я пишу плагин для Total Commander'a, и вот возникла такая проблема c окошком настроек:
http://ex-ve.ucoz.ru/files/KOL.png

Я не могу понять, что с кнопками - что это за чёрная обводка вокруг них?
И почему после создания кнопок форма стаёт неактивной (работает только перемещение формы, а крестик не нажимается), хотя сами кнопки активны.

Программа вызывает это окошко через такую процедуру:
Procedure ConfigurePacker(Parent: HWND; DLLInstance: HINST);
begin
SGAOptionsDialogExecute(Parent);
end;


А вот мой код создания формы:

Function SGAOptionsDialogExecute(Parent: HWND): Boolean;
Var W: HWND; OkButton, CancelButton: PControl;
begin
Applet := NewApplet('');
W := HWND(Addr(Applet.Handle)^);
HWND(Addr(Applet.Handle)^) := Parent;
Dialog := NewForm(Applet, 'SGA Options');
Dialog.Width := 256;
Dialog.Height := 256;
Dialog.Left := (ScreenWidth - Dialog.Width) div 2;
Dialog.Top := (ScreenHeight - Dialog.Height) div 2;
Dialog.Style := WS_BORDER or WS_SYSMENU;
Dialog.ExStyle := WS_EX_TOOLWINDOW;
Dialog.Font.FontName := 'MS Sans Serif';
Dialog.Font.FontHeight := -11;
Dialog.Font.FontPitch := fpDefault;
Dialog.Font.FontStyle := [];
OkButton := NewButton(Dialog, 'OK').SetSize(70, 21);
OkButton.CreateWindow;
OkButton.Style := bs_center;
CancelButton := NewButton(Dialog, 'Cancel').SetSize(70, 21);
CancelButton.CreateWindow;
CancelButton.Style := bs_center;
OkButton.Left := (Dialog.Width - (OkButton.Width + 40 + CancelButton.Width)) div 2;
CancelButton.Left := OkButton.Left + OkButton.Width + 40;
OkButton.Top := Dialog.Height - 64;
CancelButton.Top := OkButton.Top;
OkButton.OnClick := TOnEvent(MakeMethod(NIL, @OkClick));
CancelButton.OnClick := TOnEvent(MakeMethod(NIL, @CancelClick));
OkButton.Visible := True;
CancelButton.Visible := True;
Applet.Enabled := False;
Result := Dialog.ShowModal = 1;
Applet.Enabled := True;
CancelButton.Free;
OkButton.Free;
Dialog.Free;
HWND(Addr(Applet.Handle)^) := W;
Applet.Free;
end;


xasha666   (2007-05-06 21:36:00) [21]

ShowModalEx начинается с тех же строк что и ShowModal:

 if (fIsControl) or (fParent = nil) then
 begin
   Show;
   Exit;
 end;

Как раз из-за этого окошко исчезает сразу после того как появится.


xasha666   (2007-05-06 21:32:00) [22]

Можно ссылочку на демо?


xasha666   (2007-05-06 21:31:00) [23]

Могу выложить плагин, если пользуетесь Total'ом, посмотрите как этот ужас выглядит.


Dmitry___   (2007-05-06 21:31:00) [24]


> и создании окошко сразу исчезает.

А ShowModalEx?


> Не надо делать вручную Add2Autofree к контролам. Ничего,
>  кроме падения из-за повторного освобождение памяти, не
> будет.

Не знал. Исправлюсь. Хотя у меня ничего не падало...

Кстати, Владимир, в вашем демо про две формы из длл делается SetParent. Так вот у меня тоже есть такое, но после этого GetParent как возвращал 0, так и возвращает. Почему бы это?


xasha666   (2007-05-06 21:24:00) [25]

Windows.SetParent не помогает. При создании окошко сразу исчезает.


xasha666   (2007-05-06 21:19:00) [26]

А конструкция и правда весёлая. Не могу поверить, что компилируется в Delphi. Не надо пытаться присвоить Handle существующее, да еще чужое окно. Вместо этого лучше поменять оконного родителя _формы_ (Windows.SetParent). По крайней мере, попробовать.

Ничего удивительного.
   property Handle: HWnd read fHandle;
Это обычное свойство объекта, у которого есть свой адрес. Addr возвращает этот адрес, следовательно данные по этому адресу можно изменить. Так как write не прописан и подругому в PControl изменение этого хендла не предусмотрено почему-то, делаю именно так.
Мне просто надо сделать так чтобы новое окошко было дочерним по отношению к окну Total Commander'a.
И проблема то не в этом, а в кнопках и деактивации окна.


Vladimir Kladov   (2007-05-06 20:40:00) [27]

Не надо делать вручную Add2Autofree к контролам. Ничего, кроме падения из-за повторного освобождение памяти, не будет.

А конструкция и правда весёлая. Не могу поверить, что компилируется в Delphi. Не надо пытаться присвоить Handle существующее, да еще чужое окно. Вместо этого лучше поменять оконного родителя _формы_ (Windows.SetParent). По крайней мере, попробовать.


Дмитрий К   (2007-05-06 20:21:00) [28]

Не совсем понятно, что за конструкция:

> HWND(Addr(Applet.Handle)^) := Parent;


xasha666   (2007-05-06 20:09:00) [29]

А разве
OkButton.CreateWindow
OkButton.Visible
обязательно?
А CancelButton.Style := bs_center, такого стиля и нет вроде...


Без CreateWindow вообще на форме ничего не рисовалось.
А bs_center - да, есть такой.

OkButton.Add2AutoFree(Dialog);
Это ничем не помогло.


Dmitry___   (2007-05-06 19:05:00) [30]

Мне кажется, надо бы так

Applet := NewApplet('');
 W := HWND(Addr(Applet.Handle)^);
 HWND(Addr(Applet.Handle)^) := Parent;
 Dialog := NewForm(Applet, 'SGA Options');
 Dialog.Width := 256;
 Dialog.Height := 256;
 Dialog.Left := (ScreenWidth - Dialog.Width) div 2;
 Dialog.Top := (ScreenHeight - Dialog.Height) div 2;
 Dialog.Style := Dialog.Style or WS_BORDER or WS_SYSMENU;
 Dialog.ExStyle := Dialog.ExStyle or WS_EX_TOOLWINDOW;
 Dialog.CanResize := False;
 Dialog.Font.FontName := 'MS Sans Serif';
 Dialog.Font.FontHeight := -11;
 Dialog.Font.FontPitch := fpDefault;
 Dialog.Font.FontStyle := [];
 OkButton := NewButton(Dialog, 'OK').SetSize(70, 21);
 OkButton.Add2AutoFree(Dialog);
 CancelButton := NewButton(Dialog, 'Cancel').SetSize(70, 21);
 CancelButton.Add2AutoFree(Dialog);
 OkButton.Left := (Dialog.Width - (OkButton.Width + 40 + CancelButton.Width)) div 2;
 CancelButton.Left := OkButton.Left + OkButton.Width + 40;
 OkButton.Top := Dialog.Height - 64;
 CancelButton.Top := OkButton.Top;
 //OkButton.OnClick := TOnEvent(MakeMethod(NIL, @OkClick));
 //CancelButton.OnClick := TOnEvent(MakeMethod(NIL, @CancelClick));
 Result := Dialog.ShowModal = 1;
 Dialog.Free;
 Dialog := nil;
 HWND(Addr(Applet.Handle)^) := W;
 Free_And_Nil(Applet);


Или вроде того...


Dmitry___   (2007-05-06 18:52:00) [31]

А разве
OkButton.CreateWindow
OkButton.Visible

обязательно?

А CancelButton.Style := bs_center, такого стиля и нет вроде...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо