Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1240246030
alex989
2009-04-20 20:47
2009.06.07
Странности с математикой (real, extended)


2-1240423276
Igor2010
2009-04-22 22:01
2009.06.07
Form-ы


15-1238953192
ЭРИКА
2009-04-05 21:39
2009.06.07
С ДНЕМ РОЖДЕНИЯ!


2-1240333672
Дмитрий
2009-04-21 21:07
2009.06.07
Не работает программа.


15-1238776244
Pavia
2009-04-03 20:30
2009.06.07
Конвертация кодировок.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский