-
Я пишу плагин для 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;
-
А разве OkButton.CreateWindow
OkButton.Visible обязательно? А CancelButton.Style := bs_center, такого стиля и нет вроде...
-
Мне кажется, надо бы так
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;
Result := Dialog.ShowModal = 1;
Dialog.Free;
Dialog := nil;
HWND(Addr(Applet.Handle)^) := W;
Free_And_Nil(Applet);
Или вроде того...
-
А разве
OkButton.CreateWindow
OkButton.Visible
обязательно?
А CancelButton.Style := bs_center, такого стиля и нет вроде...
Без CreateWindow вообще на форме ничего не рисовалось. А bs_center - да, есть такой. OkButton.Add2AutoFree(Dialog); Это ничем не помогло.
-
Не совсем понятно, что за конструкция: > HWND(Addr(Applet.Handle)^) := Parent;
-
Не надо делать вручную Add2Autofree к контролам. Ничего, кроме падения из-за повторного освобождение памяти, не будет.
А конструкция и правда весёлая. Не могу поверить, что компилируется в Delphi. Не надо пытаться присвоить Handle существующее, да еще чужое окно. Вместо этого лучше поменять оконного родителя _формы_ (Windows.SetParent). По крайней мере, попробовать.
-
А конструкция и правда весёлая. Не могу поверить, что компилируется в Delphi. Не надо пытаться присвоить Handle существующее, да еще чужое окно. Вместо этого лучше поменять оконного родителя _формы_ (Windows.SetParent). По крайней мере, попробовать. Ничего удивительного. property Handle: HWnd read fHandle; Это обычное свойство объекта, у которого есть свой адрес. Addr возвращает этот адрес, следовательно данные по этому адресу можно изменить. Так как write не прописан и подругому в PControl изменение этого хендла не предусмотрено почему-то, делаю именно так. Мне просто надо сделать так чтобы новое окошко было дочерним по отношению к окну Total Commander'a. И проблема то не в этом, а в кнопках и деактивации окна.
-
Windows.SetParent не помогает. При создании окошко сразу исчезает.
-
> и создании окошко сразу исчезает.
А ShowModalEx?
> Не надо делать вручную Add2Autofree к контролам. Ничего, > кроме падения из-за повторного освобождение памяти, не > будет.
Не знал. Исправлюсь. Хотя у меня ничего не падало...
Кстати, Владимир, в вашем демо про две формы из длл делается SetParent. Так вот у меня тоже есть такое, но после этого GetParent как возвращал 0, так и возвращает. Почему бы это?
-
Могу выложить плагин, если пользуетесь Total'ом, посмотрите как этот ужас выглядит.
-
Можно ссылочку на демо?
-
ShowModalEx начинается с тех же строк что и ShowModal:
if (fIsControl) or (fParent = nil) then
begin
Show;
Exit;
end; Как раз из-за этого окошко исчезает сразу после того как появится.
-
А если написать okbutton.Style := okbutton.Style or bs_center; Cancelbutton.Style := Cancelbutton.Style or bs_center; ?
-
Так лучше и крестик стал работать, спасибо большое. :) А вот мне интересно почему такой глюк был с этим крестиком?
-
Когда-то тоже бился с этим. Получилось вроде этого:
var
App:Pcontrol;
wnd:HWND;
function OnShow( Sender:Pobj; var Msg: TMsg; var Rslt: Integer ): Boolean ;
begin
SetParent(App.Handle, wnd);
end;
Function SGAOptionsDialogExecute(Parent: HWND): Boolean;
Var
Dialog,OkButton, CancelButton: PControl;
begin
wnd:=Parent;
app:=NewApplet('');
App.Visible:=False;
Dialog := NewForm(app, '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.Style := OkButton.Style or bs_center;
CancelButton := NewButton(Dialog, 'Cancel').SetSize(70, 21);
CancelButton.Style := CancelButton.Style or 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;
Dialog.OnShow:=TOnEvent(MakeMethod(nil,@OnShow));
Dialog.Visible:=True;
Result := True;
Run(App);
end;
Может и смешно, но работает:)
-
Так вот. Чтобы не прибегать к подобным ухищрениям, нужно в КОЛ добавить функцию создания апплета на основе существующего окна. Было бы здорово.
-
> Не надо делать вручную Add2Autofree к контролам.
Постойте. А как же в вашем демо в KOLUnit1_1.inc Add2Autofree применяется ко всем контролам. И ничего. Почему же тогда нельзя делать это вручную?
-
"KOLUnit1_1.inc" генерируется MCK!, а речь идет о коде который пишет программист.
-
а, да... что-то я протормозил
-
Внимательнее посмотрите. К контролам Add2Autofree как раз не применяется никогда.
|