Форум: "KOL";
Текущий архив: 2009.06.07;
Скачать: [xml.tar.bz2];
ВнизПроблема с отображением кнопок и не только. Найти похожие ветки
← →
xasha666 (2007-05-06 17:50) [0]Я пишу плагин для 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;
← →
Dmitry___ (2007-05-06 18:52) [1]А разве
OkButton.CreateWindow
OkButton.Visible
обязательно?
А CancelButton.Style := bs_center, такого стиля и нет вроде...
← →
Dmitry___ (2007-05-06 19:05) [2]Мне кажется, надо бы так
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);
Или вроде того...
← →
xasha666 (2007-05-06 20:09) [3]
А разве
OkButton.CreateWindow
OkButton.Visible
обязательно?
А CancelButton.Style := bs_center, такого стиля и нет вроде...
Без CreateWindow вообще на форме ничего не рисовалось.
А bs_center - да, есть такой.OkButton.Add2AutoFree(Dialog);
Это ничем не помогло.
← →
Дмитрий К (2007-05-06 20:21) [4]Не совсем понятно, что за конструкция:
>HWND(Addr(Applet.Handle)^) := Parent;
← →
Vladimir Kladov (2007-05-06 20:40) [5]Не надо делать вручную Add2Autofree к контролам. Ничего, кроме падения из-за повторного освобождение памяти, не будет.
А конструкция и правда весёлая. Не могу поверить, что компилируется в Delphi. Не надо пытаться присвоить Handle существующее, да еще чужое окно. Вместо этого лучше поменять оконного родителя _формы_ (Windows.SetParent). По крайней мере, попробовать.
← →
xasha666 (2007-05-06 21:19) [6]
А конструкция и правда весёлая. Не могу поверить, что компилируется в Delphi. Не надо пытаться присвоить Handle существующее, да еще чужое окно. Вместо этого лучше поменять оконного родителя _формы_ (Windows.SetParent). По крайней мере, попробовать.
Ничего удивительного.
property Handle: HWnd read fHandle;
Это обычное свойство объекта, у которого есть свой адрес. Addr возвращает этот адрес, следовательно данные по этому адресу можно изменить. Так как write не прописан и подругому в PControl изменение этого хендла не предусмотрено почему-то, делаю именно так.
Мне просто надо сделать так чтобы новое окошко было дочерним по отношению к окну Total Commander"a.
И проблема то не в этом, а в кнопках и деактивации окна.
← →
xasha666 (2007-05-06 21:24) [7]Windows.SetParent не помогает. При создании окошко сразу исчезает.
← →
Dmitry___ (2007-05-06 21:31) [8]
> и создании окошко сразу исчезает.
А ShowModalEx?
> Не надо делать вручную Add2Autofree к контролам. Ничего,
> кроме падения из-за повторного освобождение памяти, не
> будет.
Не знал. Исправлюсь. Хотя у меня ничего не падало...
Кстати, Владимир, в вашем демо про две формы из длл делается SetParent. Так вот у меня тоже есть такое, но после этого GetParent как возвращал 0, так и возвращает. Почему бы это?
← →
xasha666 (2007-05-06 21:31) [9]Могу выложить плагин, если пользуетесь Total"ом, посмотрите как этот ужас выглядит.
← →
xasha666 (2007-05-06 21:32) [10]Можно ссылочку на демо?
← →
xasha666 (2007-05-06 21:36) [11]ShowModalEx начинается с тех же строк что и ShowModal:
if (fIsControl) or (fParent = nil) then
begin
Show;
Exit;
end;
Как раз из-за этого окошко исчезает сразу после того как появится.
← →
Дмитрий К (2007-05-06 21:55) [12]А если написать
okbutton.Style := okbutton.Style or bs_center;
Cancelbutton.Style := Cancelbutton.Style or bs_center; ?
← →
xasha666 (2007-05-06 22:07) [13]Так лучше и крестик стал работать, спасибо большое. :)
А вот мне интересно почему такой глюк был с этим крестиком?
← →
Compiler © (2007-05-06 23:35) [14]Когда-то тоже бился с этим. Получилось вроде этого:
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-07 14:04) [15]Так вот. Чтобы не прибегать к подобным ухищрениям, нужно в КОЛ добавить функцию создания апплета на основе существующего окна. Было бы здорово.
← →
Dmitry___ (2007-05-08 17:38) [16]
> Не надо делать вручную Add2Autofree к контролам.
Постойте. А как же в вашем демо в KOLUnit1_1.inc Add2Autofree применяется ко всем контролам. И ничего. Почему же тогда нельзя делать это вручную?
← →
AndreyRus (2007-05-08 18:01) [17]"KOLUnit1_1.inc" генерируется MCK!, а речь идет о коде который пишет программист.
← →
Dmitry___ (2007-05-08 18:17) [18]а, да... что-то я протормозил
← →
Vladimir Kladov (2007-05-08 21:46) [19]Внимательнее посмотрите. К контролам Add2Autofree как раз не применяется никогда.
← →
имя (2007-08-08 20:58) [20]Удалено модератором
← →
имя (2007-10-03 10:21) [21]Удалено модератором
← →
имя (2007-10-09 12:42) [22]Удалено модератором
← →
Dawn-tn (2007-11-27 07:08) [23]Удалено модератором
← →
имя (2007-12-12 00:11) [24]Удалено модератором
← →
имя (2007-12-12 00:11) [25]Удалено модератором
← →
имя (2007-12-12 06:42) [26]Удалено модератором
← →
имя (2007-12-12 13:32) [27]Удалено модератором
← →
имя (2008-01-16 21:45) [28]Удалено модератором
← →
имя (2008-01-27 17:29) [29]Удалено модератором
← →
имя (2008-01-28 13:53) [30]Удалено модератором
← →
имя (2008-01-28 19:50) [31]Удалено модератором
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2009.06.07;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.004 c