![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с отображением кнопок и не только. [Delphi]
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, такого стиля и нет вроде...