Главная страница
    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
15-1238405776
Alex_2009
2009-03-30 13:36
2009.06.07
windows 2000 пропал доступ к редактору реестра


15-1238775478
Garfunkel
2009-04-03 20:17
2009.06.07
TMidiGen - модуль для создания midi звуков


2-1240312554
ZeroCrash
2009-04-21 15:15
2009.06.07
Поиск поля для ввода текста и его замена


11-1201435065
Blackman
2008-01-27 14:57
2009.06.07
ограничения на размер PStrList


15-1235310066
Andy BitOff
2009-02-22 16:41
2009.06.07
Сотни DVD на диск размером с монету





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский