Конференция "KOL" » Проблема с отображением кнопок и не только. [Delphi]
 
  • xasha666 (06.05.07 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___ (06.05.07 18:52) [1]
    А разве
    OkButton.CreateWindow
    OkButton.Visible


    обязательно?

    А CancelButton.Style := bs_center, такого стиля и нет вроде...
  • Dmitry___ (06.05.07 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 (06.05.07 20:09) [3]
    А разве
    OkButton.CreateWindow
    OkButton.Visible
    обязательно?
    А CancelButton.Style := bs_center, такого стиля и нет вроде...



    Без CreateWindow вообще на форме ничего не рисовалось.
    А bs_center - да, есть такой.

    OkButton.Add2AutoFree(Dialog);


    Это ничем не помогло.
  • Дмитрий К (06.05.07 20:21) [4]
    Не совсем понятно, что за конструкция:

    >
    HWND(Addr(Applet.Handle)^) := Parent;


  • Vladimir Kladov (06.05.07 20:40) [5]
    Не надо делать вручную Add2Autofree к контролам. Ничего, кроме падения из-за повторного освобождение памяти, не будет.

    А конструкция и правда весёлая. Не могу поверить, что компилируется в Delphi. Не надо пытаться присвоить Handle существующее, да еще чужое окно. Вместо этого лучше поменять оконного родителя _формы_ (Windows.SetParent). По крайней мере, попробовать.
  • xasha666 (06.05.07 21:19) [6]
    А конструкция и правда весёлая. Не могу поверить, что компилируется в Delphi. Не надо пытаться присвоить Handle существующее, да еще чужое окно. Вместо этого лучше поменять оконного родителя _формы_ (Windows.SetParent). По крайней мере, попробовать.



    Ничего удивительного.
       property Handle: HWnd read fHandle;
    Это обычное свойство объекта, у которого есть свой адрес. Addr возвращает этот адрес, следовательно данные по этому адресу можно изменить. Так как write не прописан и подругому в PControl изменение этого хендла не предусмотрено почему-то, делаю именно так.
    Мне просто надо сделать так чтобы новое окошко было дочерним по отношению к окну Total Commander'a.
    И проблема то не в этом, а в кнопках и деактивации окна.
  • xasha666 (06.05.07 21:24) [7]
    Windows.SetParent не помогает. При создании окошко сразу исчезает.
  • Dmitry___ (06.05.07 21:31) [8]

    > и создании окошко сразу исчезает.

    А ShowModalEx?


    > Не надо делать вручную Add2Autofree к контролам. Ничего,
    >  кроме падения из-за повторного освобождение памяти, не
    > будет.

    Не знал. Исправлюсь. Хотя у меня ничего не падало...

    Кстати, Владимир, в вашем демо про две формы из длл делается SetParent. Так вот у меня тоже есть такое, но после этого GetParent как возвращал 0, так и возвращает. Почему бы это?
  • xasha666 (06.05.07 21:31) [9]
    Могу выложить плагин, если пользуетесь Total'ом, посмотрите как этот ужас выглядит.
  • xasha666 (06.05.07 21:32) [10]
    Можно ссылочку на демо?
  • xasha666 (06.05.07 21:36) [11]
    ShowModalEx начинается с тех же строк что и ShowModal:

     if (fIsControl) or (fParent = nil) then
     begin
       Show;
       Exit;
     end;


    Как раз из-за этого окошко исчезает сразу после того как появится.
  • Дмитрий К (06.05.07 21:55) [12]
    А если написать
    okbutton.Style := okbutton.Style or bs_center;
    Cancelbutton.Style := Cancelbutton.Style or bs_center;
    ?
  • xasha666 (06.05.07 22:07) [13]
    Так лучше и крестик стал работать, спасибо большое. :)
    А вот мне интересно почему такой глюк был с этим крестиком?
  • Compiler © (06.05.07 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 (07.05.07 14:04) [15]
    Так вот. Чтобы не прибегать к подобным ухищрениям, нужно в КОЛ добавить функцию создания апплета на основе существующего окна. Было бы здорово.
  • Dmitry___ (08.05.07 17:38) [16]

    > Не надо делать вручную Add2Autofree к контролам.

    Постойте. А как же в вашем демо в KOLUnit1_1.inc Add2Autofree применяется ко всем контролам. И ничего. Почему же тогда нельзя делать это вручную?
  • AndreyRus (08.05.07 18:01) [17]
    "KOLUnit1_1.inc" генерируется MCK!, а речь идет о коде который пишет программист.
  • Dmitry___ (08.05.07 18:17) [18]
    а, да... что-то я протормозил
  • Vladimir Kladov (08.05.07 21:46) [19]
    Внимательнее посмотрите. К контролам Add2Autofree как раз не применяется никогда.
 
Конференция "KOL" » Проблема с отображением кнопок и не только. [Delphi]
Есть новые Нет новых   [134431   +12][b:0][p:0.004]