Delphi 7 forms, anchors not working in Vista

后端 未结 6 701
失恋的感觉
失恋的感觉 2020-12-30 06:08

The software is built on Delphi 7.

On my XP machine, the form resizes as I expect. However, on two Vista machines, I have components with anchors set to [akLeft, akT

相关标签:
6条回答
  • 2020-12-30 06:47

    Before anchors were introduced in Delphi 4, we resized components dynamically to achieve the same effect. You can easily move/adjust the components in the form's onresize event.

    Setting the form's doublebuffered property to true may reduce flicker, by buffering the paint method. I recall we used to have to implement that ourselves, too!

    0 讨论(0)
  • 2020-12-30 06:49

    It might be because of the transparent frame which is shown by Vista. (In order to give different windows same transparent appearance.

    Try using "Align" (alClient) instead of anchors. Since you are using all anchors, that makes more sense.

    0 讨论(0)
  • 2020-12-30 07:02

    Try running the program in XP compatibility mode on Vista. Programs compiled by Delphi 7 may not fully support Vista native mode (no surprise there, really).

    0 讨论(0)
  • 2020-12-30 07:03

    It looks this is pretty old question, anyway here's the only one solution for this problem in the Universe : Use the old style Windows programming sizing method using API trapping WM_SIZE and WM_SIZING, that's the infalible one and will function in every Windows you'll know.

    Of course this means you have to use mainly GetClientRect() to determine witdhs and heights and then resize controls based on such values, sure that may sound like trying to ignite a spaceship but it's the best.

    Otherwise you could do something more practical and quickly in a resizing procedure like :

    Control1.Left := Control2.Left + (buttonControl.Width div 2) - (buttonControl3.Width div 2);
    //for example widths
    Control4.Width    := (Control.Width * 4) + (Control.Left * 8) + 54 ;
    

    I do that kind of coding and functions in just all Windows no matter wich version it would be.

    You only need some values on the screen resolution for reference doing something like this :

    iCXSCREEN := GetSystemMetrics(SM_CXSCREEN);
    iCYSCREEN := GetSystemMetrics(SM_CYSCREEN);
    
        if ((iCXSCREEN = 1280) and (iCYSCREEN = 720)) or  ((iCXSCREEN = 1280) and (iCYSCREEN = 700)) or ((iCXSCREEN = 1280) and (iCYSCREEN = 600)) then begin
    
    // blah blah
    
    end;
    

    Hope helps someone else!

    Cheers!

    0 讨论(0)
  • 2020-12-30 07:05

    Maybe it is related to the "Windows Kernel stack overflow" problem that occurs if your control has many parents. And if you run it on a 64 bit system the kernel stack overflow happens much faster. (more about this here: http://news.jrsoftware.org/news/toolbar2000/msg07779.html)

    On Embarcadero's CodeCentral is a workaround for this bug (which is also copied almost 1:1 into the Delphi 2009 VCL): http://cc.embarcadero.com/Item/25646

    0 讨论(0)
  • 2020-12-30 07:05

    As an alternative to the dynamic resizing I suggested, based on Hemant's suggestion I slapped together some working code (below). Just create a VCL forms application, drop on a tpanel that does not touch any edge of the form (by default, Align = alNone) and replace Unit1 with the code below. When you run it, you'll see 4 yellow panels surrounding the one initially added, and the central panel will resize with the form (as if all anchors were true).

    unit Unit1;
    
    interface
    
    uses
      Windows, Classes, Controls, Forms, ExtCtrls, Graphics;
    
    type
      TPanelPos = (ppLeft, ppRight, ppTop, ppBottom);
      TForm1 = class(TForm)
        Panel1: TPanel;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        Panels : array[TPanelPos] of tpanel;
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      PanelPos : TPanelPos;
    begin
      for PanelPos := ppLeft to ppBottom do
      begin
        Panels[PanelPos] := tpanel.Create(Form1);
        Panels[PanelPos].Parent := Form1;
        Panels[PanelPos].Color := clYellow;
        case PanelPos of
         ppLeft :
           begin
             Panels[PanelPos].Align := alLeft;
             Panels[PanelPos].Width := Panel1.Left - 1;
           end;
         ppRight :
           begin
             Panels[PanelPos].Align := alRight;
             Panels[PanelPos].Width := Form1.Width - Panel1.Left - Panel1.Width;
           end;
         ppTop :
           begin
             Panels[PanelPos].Align := alTop;
             Panels[PanelPos].Height := Panel1.Top - 1;
           end;
         ppBottom :
           begin
             Panels[PanelPos].Align := alBottom;
             Panels[PanelPos].Height := Form1.Height - Panel1.Top - Panel1.Height;
           end;
        end;
        Panel1.Align := alClient;
      end;
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    var
      PanelPos : TPanelPos;
    begin
      for PanelPos := ppLeft to ppBottom do
        Panels[PanelPos].Free;
    end;
    
    end.
    
    0 讨论(0)
提交回复
热议问题