Конференция "KOL" » А баг всё равно есть [Delphi, 7, Vista]
 
  • Elec3C © (31.01.08 15:35) [0]
    http://pda.delphimaster.net/?id=1184948750&n=10

    Если запустить программу и при выполнении её изменить стиль на стандартный(или классический) и наоборот.
  • Elec3C © (04.02.08 17:41) [1]
    Нужно отлавливать WM_THEMECHANGED и изменять что-то, только вот что?
  • AndreyRus © (04.02.08 17:51) [2]
    > Если запустить программу и при выполнении её изменить стиль на стандартный(или классический) и наоборот.

    Не парься!
    Вероятность это события стремится к нулю.
  • Elec3C © (05.02.08 18:32) [3]

    > стремится к нулю.

    Но глюк, всё равно присутствует, частично.
  • Elec3C © (06.02.08 20:01) [4]
    Не могу понять, как обновить окно, чтобы избавиться от глюка[1]?
  • Дмитрий К © (06.02.08 20:33) [5]
    Запоминать ClientSize, по приходу WM_THEMECHANGED устанавливать его в прежнее значение.
  • Elec3C © (06.02.08 22:33) [6]
    Значит я делаю так:
    ...
    wWinSize : array[0..1] of Word;
    ...
    в OnCreate:
    wWinSize[0] := Form.ClientWidth; wWinSize[1] := Form.ClientHeight;
    ...
    OnMessage(WM_THEMECHANGED):
    Form.CanResize := True;
    Form.SetClientSize(wWinSize[0], wWinSize[1]);
    Form.CanResize := False;
    ...

    Всё равно криво работает! Или я что-то не так делаю?
  • Дмитрий К © (06.02.08 22:44) [7]
    Попробуй без смены состояния CanResize.
  • Elec3C © (07.02.08 00:31) [8]
    У меня форма изначально CanResize := False, а при этом размеры поменять, без CanResize := True, CanResize := False, нельзя.
  • Дмитрий К © (07.02.08 01:00) [9]
    Вот примерчик. Если не обременит, проверь, как форма будет себя вести.
    program thickframetest;

    uses
     Windows, Messages, KOL;

    type
     PForm1 = ^TForm1;
     TForm1 = object(TObj)
     private
       form, btn1, btn2: PControl;
       function formMessage(var Msg: TMsg; var Rslt: Integer): Boolean;
       procedure btn1Click(Sender: PObj);
     end;

    procedure NewForm1(var Result: PForm1; AParent: PControl);
    begin
     New(Result, Create);
     with Result^ do
     begin
       form := NewForm(AParent,'Test');
       form.Add2AutoFree(Result);
       form.OnMessage := formMessage;
       form.Style := form.Style and not (WS_THICKFRAME or WS_MAXIMIZEBOX);
       btn1 := NewButton(form, 'Button1');
       btn1.OnClick := btn1Click;
       btn2 := NewButton(form, 'Button2').PlaceRight.ResizeParent;
    //    form.CanResize := False;
     end;
    end;
    { TForm1 }

    procedure TForm1.btn1Click(Sender: PObj);
    var r: TRect;
    begin
     r := form.ClientRect;
     form.Style := form.Style xor (WS_THICKFRAME or WS_MAXIMIZEBOX);
     form.ClientWidth := r.Right - r.Left;
     form.ClientHeight := r.Bottom - r.top;
    end;

    function TForm1.formMessage(var Msg: TMsg; var Rslt: Integer): Boolean;
    begin
     result := false;
    {  if msg.message = wm_themechanged then
     begin

     end;}

    end;

    var Form1: PForm1;
    begin
     NewForm1(Form1, nil);
     Run(Form1.form);
    end.

  • Elec3C © (07.02.08 02:02) [10]
    При запуске программы и при смене тем окно остаётся нормальным, т.б. никаких глюков[1] не наблюдается!

    При нажатии на Button1 форма поднимается по диагонали справа на лево и опускается слева на право.
  • Elec3C © (07.02.08 02:13) [11]
    При создании нужно поставить and not (WS_THICKFRAME or WS_MAXIMIZEBOX) и всё нормально(или нужно вообще убрать его и asm'блерной части - хотя не проверял).

    А в XP нормально работает [9]?
  • Дмитрий К © (07.02.08 02:20) [12]
    Чтобы форма не прыгала нужно btn1Click изменить так:
    var r: TRect; p: TPoint; formsize: TSize;
    begin
     form.BeginUpdate;
     r := form.ClientRect;
     p := form.Position;
     formsize.cx := form.Width;
     formsize.cy := form.height;
     form.Style := form.Style xor (WS_THICKFRAME or WS_MAXIMIZEBOX);
     form.ClientWidth := r.Right - r.Left;
     form.ClientHeight := r.Bottom - r.top;
     form.Position := MakePoint(p.X + (formsize.cx - form.Width) div 2, p.y + (formsize.cy - form.Height) div 2);
     form.EndUpdate;
    end;



    > А в XP нормально работает [9]?

    Нормально.
  • Elec3C © (07.02.08 02:28) [13]
    Вопрос решён! Спасибо!
 
Конференция "KOL" » А баг всё равно есть [Delphi, 7, Vista]
Есть новые Нет новых   [134431   +14][b:0][p:0.002]