Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Formgröße proportional ändern (https://www.delphipraxis.net/117900-formgroesse-proportional-aendern.html)

phire_ 27. Jul 2008 19:04


Formgröße proportional ändern
 
Also Hallo erstmal,

ich habe folgendes Problem:

Ich möchte, das wenn ich die Größe einer Form ändere (Borderstyle = bsSizeable) sich Width und Height proportional mitändern. Das heißt konkret, das sich zum bsp. Width und Height im Verhältnis 4:3 ändern.

ich möchte also immer das gleiche Format des Forms beibehalten.
ich habe es mit diesem code im OnResize Event probiert, doch das geht auch nur wenn man die Formnach unten hin vergrößert bzw. verkleinert, aber auch nicht gut, da die Form hin und her springt.

Delphi-Quellcode:
  Width := Round((4/3)*Height);
ich freue mich auf eure antworten und hoffe ihr könnt mir helfen :D

mfg

omata 27. Jul 2008 22:51

Re: Formgröße proportional ändern
 
Dabei stellt sich die Grundsätzliche Frage: Ist das Sinnvoll?
Die Antwort lautet dann ganz klar: Nein.

Wenn ich zum Beispiel einen tollen neuen TFT mein eigen nenne und ich mich über die tolle nicht 4:3 Auflösung freue, dann kommt da dein tolles Programm daher und nimmt mir jeglichen Spass an der neuen Hardware. Ich möchte gern das Fenster einer Anwendung auch maximieren können. Da sind irgendwelche Manipulationen absolut wiederlich.
Leider hast du uns ja nicht verraten was du da eigentlich machen willst...

Trotzdem mal ein Vorschlag: Lass das Fenster so wie es ist und lasse die Elemente auf deiner Form mitwachsen. Oder wenn es sich z.B. um ein Spielfeld handelt, kannst du dieses automatisch anpassen. Dies geht, wenn du dich dann immer an der kürzesten Länge (Width, Height) orientierst.

Ein Beispiel siehe hier.

lbccaleb 27. Jul 2008 23:19

Re: Formgröße proportional ändern
 
oder anchors, benutzen...

omata 27. Jul 2008 23:48

Re: Formgröße proportional ändern
 
Zitat:

Zitat von lbccaleb
oder anchors, benutzen...

das verbarg sich hinter "mitwachsen"

Muetze1 27. Jul 2008 23:50

Re: Formgröße proportional ändern
 
Moin!

Zitat:

Zitat von phire_
Delphi-Quellcode:
  Width := Round((4/3)*Height);
ich freue mich auf eure antworten und hoffe ihr könnt mir helfen :D

Überschreibe die Delphi-Referenz durchsuchenSetBounds() Methode und reiche die veränderten Parameter im inherited Aufruf weiter.

MfG
Muetze1

lbccaleb 28. Jul 2008 00:13

Re: Formgröße proportional ändern
 
Zitat:

Zitat von omata
Zitat:

Zitat von lbccaleb
oder anchors, benutzen...

das verbarg sich hinter "mitwachsen"

muss man nicht, kann es natürlich auch selber proggen..

phire_ 28. Jul 2008 00:14

Re: Formgröße proportional ändern
 
Danke Muetze1

das Stichwort SetBounds() hat mir geholfen!

Hier ein guter Link dazu: http://www.bsdg.org/SWAG/DELPHI/0076.PAS.html

Edit:

Also ich habe es jetzt so gemacht:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
  public
    procedure SetBounds(aLeft, aTop, aWidth, aHeight: Integer); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SetBounds(aLeft, aTop, aWidth, aHeight: Integer);
begin
  aWidth := Round((4/3)*aHeight);
  inherited SetBounds(aLeft, aTop, aWidth, aHeight);
end;

end.
Das funktionier jedoch nicht. es ist wie vorher.
hoffe auf hilfe :)

mfg

Muetze1 28. Jul 2008 01:13

Re: Formgröße proportional ändern
 
Moin!

Mein Fehler. Diese Methode mit der SetBounds() Methode funktioniert nur bei Komponenten. Bei Formularen müsstest du die WM_SIZING Botschaft behandeln. Dir werden die aktuellen Werte übergeben, die du frei abändern kannst.

/EDIT: Here it is...
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    procedure WMSizing(var Message: TMessage); message WM_SIZING;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.WMSizing(var Message: TMessage);
var
  lRect: PRect;
begin
  lRect := Pointer(Message.lParam);

  lRect.Right := lRect.Left + round((4/3)*(lRect.Bottom - lRect.Top));
end;

end.
MfG
Muetze1

guidok 28. Jul 2008 07:50

Re: Formgröße proportional ändern
 
Zitat:

Zitat von phire_
Also Hallo erstmal,

ich habe folgendes Problem:

Ich möchte, das wenn ich die Größe einer Form ändere (Borderstyle = bsSizeable) sich Width und Height proportional mitändern. Das heißt konkret, das sich zum bsp. Width und Height im Verhältnis 4:3 ändern.

ich möchte also immer das gleiche Format des Forms beibehalten.
ich habe es mit diesem code im OnResize Event probiert, doch das geht auch nur wenn man die Formnach unten hin vergrößert bzw. verkleinert, aber auch nicht gut, da die Form hin und her springt.

Delphi-Quellcode:
  Width := Round((4/3)*Height);
ich freue mich auf eure antworten und hoffe ihr könnt mir helfen :D

mfg

Ich habe das jetzt mal probiert. Funktioniert einwandfrei, wenn man es so macht:

Delphi-Quellcode:
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  NewWidth := Round((4/3)*NewHeight);
end;
Edit: Ok, nicht ganz einwandfrei, weil es nicht geht, wenn man nur die Breite verändert...

spaxxn 28. Jul 2008 09:27

Re: Formgröße proportional ändern
 
Du setzt ja auch nur die Breite...

Delphi-Quellcode:
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  NewWidth := Round((4/3)*NewHeight);
end;
Probier mal:
Delphi-Quellcode:
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  if NewWidth <> Self.Width then
    NewHeight := Round((3/4)*NewWidth)
  else if NewHeight <> Self.Height then
    NewWidth := Round((4/3)*NewHeight);
end;
Ist nicht getestet, aber wäre logisch ...

Edit: Habs gestestet und das geht, hab noch nen Zahlendreher in der Berechnung gehabt, also beachten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz