![]() |
| ||
|
|
Новости |
Поиск |
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;
(2008-01-28 19:50:00) [1]Удалено модератором
(2008-01-28 13:53:00) [2]Удалено модератором
(2008-01-27 17:29:00) [3]Удалено модератором
(2008-01-16 21:45:00) [4]Удалено модератором
(2007-12-12 13:32:00) [5]Удалено модератором
(2007-12-12 06:42:00) [6]Удалено модератором
(2007-12-12 00:11:00) [7]Удалено модератором
(2007-12-12 00:11:00) [8]Удалено модератором
Dawn-tn (2007-11-27 07:08:00) [9]Удалено модератором
(2007-10-09 12:42:00) [10]Удалено модератором
(2007-10-03 10:21:00) [11]Удалено модератором
(2007-08-08 20:58:00) [12]Удалено модератором
Vladimir Kladov (2007-05-08 21:46:00) [13]Внимательнее посмотрите. К контролам Add2Autofree как раз не применяется никогда.
Dmitry___ (2007-05-08 18:17:00) [14]а, да... что-то я протормозил
AndreyRus (2007-05-08 18:01:00) [15]"KOLUnit1_1.inc" генерируется MCK!, а речь идет о коде который пишет программист.
Dmitry___ (2007-05-08 17:38:00) [16]
> Не надо делать вручную Add2Autofree к контролам.
Постойте. А как же в вашем демо в KOLUnit1_1.inc Add2Autofree применяется ко всем контролам. И ничего. Почему же тогда нельзя делать это вручную?
xasha666 (2007-05-07 14:04:00) [17]Так вот. Чтобы не прибегать к подобным ухищрениям, нужно в КОЛ добавить функцию создания апплета на основе существующего окна. Было бы здорово.
Compiler (2007-05-06 23:35:00) [18]Когда-то тоже бился с этим. Получилось вроде этого:
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;
//OkButton.OnClick := TOnEvent(MakeMethod(NIL, @OkClick));
//CancelButton.OnClick := TOnEvent(MakeMethod(NIL, @CancelClick));
Dialog.OnShow:=TOnEvent(MakeMethod(nil,@OnShow));
Dialog.Visible:=True;
Result := True;
Run(App);
end;
Может и смешно, но работает:)
xasha666 (2007-05-06 22:07:00) [19]Так лучше и крестик стал работать, спасибо большое. :)
А вот мне интересно почему такой глюк был с этим крестиком?
Дмитрий К (2007-05-06 21:55:00) [20]А если написать
okbutton.Style := okbutton.Style orbs_center;
Cancelbutton.Style := Cancelbutton.Style orbs_center;?