Delphi-PRAXiS

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 Formular und deren Komponenten skalierbar (https://www.delphipraxis.net/104623-formular-und-deren-komponenten-skalierbar.html)

guevaradelaserna 7. Dez 2007 16:58


Formular und deren Komponenten skalierbar
 
Hallo!

Vielleicht könnt ihr mir helfen. Habe nun schon lange nach der Lösung des Problems gesucht, sie aber für mein spezielles Problem nicht gefunden. Ich möchte ein Formular haben, was seine Komponenten je nach Größe des Formulars skaliert. Dabei sollen sich die Komponenten aber nicht relativ zum Formular in ihrer Position verändern. Ich hoffe ihr habt mein Problem verstanden und könnt mir helfen.

Che

Poolspieler 7. Dez 2007 17:06

Re: Formular und deren Komponenten skalierbar
 
Hi,
guckst Du hier:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
  // Fenstergröße verdoppeln
  Form1.ScaleBy(Form1.PixelsPerInch * 2, Screen.PixelsPerInch);
  Form1.Realign;
  Form1.Repaint;
  Form1.Refresh;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  // Fenstergröße halbieren
  Form1.ScaleBy(round(Form1.PixelsPerInch / 2), Screen.PixelsPerInch);
  Form1.Realign;
  Form1.Repaint;
  Form1.Refresh;
end;
Gruß,
Poolspieler

guevaradelaserna 7. Dez 2007 18:38

Re: Formular und deren Komponenten skalierbar
 
Hey!
Das hilft mir nicht wirklich ...

Es sollen sich die Buttons je nach skalierung des Formulars automatisch in der Größe anpassen. Jedoch sollen sie dabei auch ihre Position verändern können. Beispiel wäre, dass ich das Formular so klein ziehe, dass der Button normalerweise nicht mehr sichtbar wäre.

Che

DeddyH 7. Dez 2007 18:41

Re: Formular und deren Komponenten skalierbar
 
Könntest Du das nicht mit Anchors machen? Oder versteh ich mal wieder alles falsch?

guevaradelaserna 7. Dez 2007 18:46

Re: Formular und deren Komponenten skalierbar
 
Mit anchors habe ich es schon probiert. Jedoch kann es dann passieren, dass sich die Buttons überlagern, wenn man das Formular zu groß zieht.

Che

Poolspieler 8. Dez 2007 11:23

Re: Formular und deren Komponenten skalierbar
 
Hi,
Du sagst, es hilft nicht wirklich...
Mein Post sollte ja nur ein Denkanstoss sein.

Prinzipiell denke ich schon, dass man mit ScaleBy arbeiten könnte.
Unten habe ich einen weiteren DENKASTOSS (KEINE LÖSUNG) gegeben, wie man die WM_SIZE Message behandeln könnte.
Das Beispiel funktioniert NUR für die Änderung der Breite - und hat jede Menge Schönheitsfehler...

Probleme dabei:
- bei mehrfachem Zoom ändern sich die Schriftgrößen --> müsste also durch "intelligentes" Runden der Zoomfaktoren abgefangen sein
- wenn man die höhe und breite des Fensters gleichzeitig ändert, dann muss man dafür sorgen, dass die Proportionen beibehalten werden...
- es sollte verhindert werden, dass das Fenster kleiner gezoomt werden kann, als es beim Programmstart war

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    ComboBox1: TComboBox;
    ProgressBar1: TProgressBar;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    breite_original: integer;
    breite_mininmal: integer;
  public
    { Public-Deklarationen }
    procedure WndProc(var Message: TMessage); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WndProc(var Message: TMessage);
var
  breite_neu: integer;
begin
  if Message.Msg = WM_SIZING then begin
    // die neuen Dimensionen merken
    breite_neu := Form1.Width;

    // Breite auf die ursprüngliche Breite zurückstellen - sonst funktionier das Skalieren nicht
    Form1.Width := breite_original;

    // das Fenster soll nicht kleiner gezoomt werden können, als es bei Programmstart war
    if breite_neu < breite_mininmal then begin
      breite_neu := breite_mininmal;
    end;
   
    // Fenster skalieren
    Form1.ScaleBy(breite_neu , breite_original);

    // alles neu zeichnen
    Form1.Realign;
    Form1.Repaint;
    Form1.Refresh;

    // die aktuelle Breite merken
    breite_original := Form1.Width;
  end;

  inherited WndProc(Message);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  breite_original := Form1.Width;
  breite_mininmal := breite_original;
end;

end.
Mit Anchors habe ich auch schon mal probiert - bin aber auch nicht glücklich damit geworden... :?

Falls Du eine Lösung findest, interessiert es mich...

Gruß,
Poolspieler

guevaradelaserna 11. Dez 2007 11:13

Re: Formular und deren Komponenten skalierbar
 
Hallo!

Ich habe mich nun mittels easysize beholfen. Damit konnte ich mein Formular und die Komponenten skalieren. Jedoch funktioniert es nicht bei Frames.

Ciao Alex

Rudirabbit 30. Dez 2008 14:45

Re: Formular und deren Komponenten skalierbar
 
Hallo
Stand vor dem gleichen Problem, mit Anchors wie so oft zu lesen ist funktioniert es nicht wirklich.

Sowas selbst zu schreiben, stellt einen nicht unerheblichen Aufwand dar.

Besten Dank :-D

Easysize positiv getestet auf Delphi 7

Grüsse

PS: Sowas sollte Delphi von Haus aus an Board haben.
Von den Bocksprüngen die wir machen müssen um eine moderne Optik hinzubekommen will ich erst gar nicht reden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr.

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