Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.07;
Скачать: CL | DM;

Вниз

Проблема с отображением кнопок и не только.   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2009.06.07;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.014 c
15-1238782378
Petr V. Abramov
2009-04-03 22:12
2009.06.07
ave отечественый производитель ::)


2-1240379974
Лёша
2009-04-22 09:59
2009.06.07
Как вывести негруппируемое поле?


4-1210912319
Sirus
2008-05-16 08:31
2009.06.07
Управление печатью средствами Дельфи


11-1201454662
ntg13_
2008-01-27 20:24
2009.06.07
ищу редактор блок-схем на КОЛ


15-1238827193
dreamse
2009-04-04 10:39
2009.06.07
Плагины для IE