Announcement

Collapse
No announcement yet.

Änderung der Windowsfontgröße

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Änderung der Windowsfontgröße

    Hallo!

    Ich habe einige Forms mit Delphi designed. Dabei war in Windows "kleine Schriftarten 96dbi" eingestellt. Irgendwann bin ich dann auf die Idee gekommen die Schriftgröße (Start->Einstellungen->Systemsteuerung->Anzeige->Einstellungen->Weitere Optionen) auf "große Schriftgröße 120dbi" umzustellen. Das hatte ziemliche Auswirkungen auf die Delphi-Forms. Dadurch, daß der Font größer wurde, paßten einige Labels nicht mehr vollständig auf das Form, sondern wurden am Rand abgeschnitten.
    Weiters wurden Labels vor Eingabefeldern von diesen teilweise verschluckt. usw.

    Kann mir jemand sagen wie man solche Probleme unter Delphi umgehen bzw. lösen kann?

  • #2
    Hallo,

    die TForm-Eigenschaft <b>Scaled</b> legt fest, ob zur Laufzeit das Formular an geänderte Font-Größen (Large Fonts vs. Small Fonts) angepasst werden soll. Dazu wird der zur Compilierungszeit ermittelte Wert von <b>Screen.PixelsPerInch</b> gespeichert und beim Start des Programms mit dem aktuellen Wert verglichen. Stimmen beide Werte nicht überein, so nimmt Delphi alle Anpassungen automatisch vor. Diese bedeutet jedoch auch, das alle Controls die Eigeschaft <b>AutoSize</b> auf TRUE setzen müssen.

    Falls diese Automatismus den eigenen Anforderungen nicht genügt, kann man das auch von Hand korrigieren/verbessern. Das Formular wurde unter Small Fonts (96 dpi) entwickelt und passt sich automatisch der Umschaltung auf Large Fonts an, wenn die o.g. Bedingungen eingehalten werden:
    <pre>
    unit LargeFontsFrm;

    interface

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

    type
    TFormMain = class(TForm)
    StatusBar1: TStatusBar;
    Panel1: TPanel;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    RadioGroup1: TRadioGroup;
    Memo1: TMemo;
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    private
    { Private-Deklarationen }
    FDoFix : Boolean;
    FDesignRes : Integer;
    procedure FixSize;
    public
    { Public-Deklarationen }
    end;

    var
    FormMain: TFormMain;

    implementation

    {$R *.DFM}

    { TFormMain }

    procedure TFormMain.FormCreate(Sender: TObject);
    begin
    FDoFix := True;
    FDesignRes := 96;
    end;

    procedure TFormMain.FormShow(Sender: TObject);
    begin
    FixSize;
    end;

    {---------------------------------------------------------------}
    { Private Methoden }
    {---------------------------------------------------------------}

    procedure TFormMain.FixSize;
    begin
    if FDoFix then
    begin
    PixelsPerInch := Screen.PixelsPerInch;
    if (PixelsPerInch <> FDesignRes) then
    begin
    Width := LongInt(Width * PixelsPerInch) div FDesignRes;
    Height := LongInt(Height * PixelsPerInch) div FDesignRes;
    end;
    FDoFix := False;
    end;
    end;

    end.
    </pre&gt

    Comment


    • #3
      Hallo,

      ich habe das selbe Problem wie Herr Huber, nur umgekehrt.
      Mein Programm soll genau die selbe Gestalt bei 120 dpi haben, wie bei 96 dpi, d.h. alle Elemente sollen genauso groß sein und (mein Problem) die Schrift soll ebenfalls klein sein.
      Bin um jede Antwort dankbar

      Comment


      • #4
        Hallo,

        geht man streng nach der "Windows-Knigge" vor, darf die grosse Schriftart nicht vom Programm korrigiert werden - d.h. der Anwender soll immer das letzte Wort haben, was die Schriftgrösse angeht. Denn in den meisten Fällen gibt es einen Grund (Sehschwäche etc.), warum die grosse Schrift aktiviert wird.

        Wenn das eigene Programm trotzdem in jedem Fall die gleiche Schriftgrösse verwenden soll, bleibt wohl nichts anderes übrig, als über die <b>Components</b>-Eigenschaft die Fontgrösse aller entsprechenden Komponenten-Instanzen zu ändern

        Comment


        • #5
          Hallo,

          was heisst, über die Components-Eingenschaft die Fontgrösse aller Komponenten-Instanzen zu ändern????
          Ich habe genau das gleiche Problem, dass bei meiner Anwendung immer grosse Schriftarten aktiviert sein müssen, um eine korrekte Anzeige zu erhalten (Ich schreibe mit Courier New auf ein Canvas).
          Kann ich nur für meine Komponeten (Anwendung) die Schrift setzen? Tritt das Problem auf, weil ich auf die Systemschriftarten zugreifen? Könnte ich dies durch eine eigene Schriftart beheben?
          Fragen über Fragen.... über eine Antwort wäre ich Dankbar :-)

          Comment


          • #6
            Hallo,

            ich habe folgendes Problem. Ich habe in meinem Programm den folgenden Code benutzt, um große Schriftarten nicht zuzulassen:

            <PRE>
            function SmallFonts: Boolean;
            var dc: hdc;
            begin
            dc:= GetDC(0);
            Result(GetDeviceCaps(dc, LOGPIXELSX)=96);
            ReleaseDC(0, DC);
            end;

            procedure Form1.Create;
            var dc: HDC;
            begin
            IF NOT SmallFonts THEN BEGIN
            DC:= GetDC(0);
            SelfScaleBy(96, GetDeviceCaps(DC, LOGPIXELSX));
            ReleaseDC(0, DC);
            Refresh;
            END;
            END;
            </PRE>

            Habe ich bei meinem Windows in der Systemsteuerung "Kleine Schriftgrößen" installiert, so habe ich bei meinem Programm kein Problem.

            Sind jedoch "Große Schriftarten" installiert, so sieht die Darstellung seit kurzem nicht gut aus.

            Ich muß dazu sagen, daß ich seit kurzem die Komponente "TSpeedButton" dynamisch erzeuge. Muß ich bei dynamisch erstellten Komponenten noch etwas mehr beachten ???

            Grüsse,
            Carste

            Comment


            • #7
              @Andreas Kosch (Posting 1)):
              Hi ich habe gerade Dein Beispiel versucht nachzuvollziehen, weil ich das Problem noch nicht zufriedenstellend gelöst habe.

              Ich habe defaultmäßig die folgenden Eigenschaften gelassen
              <PRE>
              Form1.Scaled:= True
              Panel.AutoSize:= False
              </PRE>

              Weiterhin habe ich alle Deine verwendeten Komponenten auf das Panel gezogen.

              Ist das korrekt so?

              Ich habe nun noch ein TStringGrid auf das Formular gezogen und hierbei passiert mir folgendes:
              Bei PixelsPerInch = 96 hat das StringGrid die Maße (Breite = 135 / Höhe = 137).
              Bei PixelsPerInch = 120 hat das StringGrid die Maße (Breite= 166 / Höhe = 168). Es ist zum ein großer weißer Rand im StringGrid sichtbar, der stört. Zum anderen komme ich rechnerisch (*120/96) nicht auf die geänderten Werte.

              Ich hoffe, Ihr versteht mein Problem und könnt mir weiterhelfen.

              Grüsse,
              Carste

              Comment


              • #8
                Hallo,

                die private Methode <i>FixSize</i> aus meinem Beispiel passt nur die Formular-Größe des Hauptformulars so an, dass im Normalfall keine Scrollbalken angezeigt werden, weil sich andere Controls durch die automatische Anpassung "zu breit" gemacht haben.

                Wenn es darum geht, auch innerhalb des Formulars bei den einzelnen Controls ein "schönes" Aussehen zu erzielen, muss man von Hand eingreifen: <br>
                a) reichlich Gebrauch von TPanels machen, um diese als Container für die gleichmässig zu verschiebenden Controls zu nutzen<br>
                b) Controls verankern <br>
                c) ggf. Controls per Sourcecode erst zur Laufzeit an die richtige Position schieben

                &gt;..TStringGrid

                Diese komplexen Controls sind autonom für ihre Darstellung verantwortlich. Wenn die Fläche innerhalb des TStringGrid optimal ausgenutzt werden soll, muss man wohl zur Laufzeit auch die einzelnen Spaltenbreiten selbst anpassen

                Comment


                • #9
                  > c) ggf. Controls per Sourcecode erst zur Laufzeit an die richtige Position schieben

                  Also sehe ich richtig, das Du dies darunter verstehst:
                  <PRE> Label1.SetBounds(100, 200, y, z); </PRE>

                  Dann müßte ich also, wenn das Programm unter 2 Bildschirmmodi (96 bzw. 120 Pixels) laufen soll, im Extremfall für beide Modi jeweils eine Label-Anweisung (mit unterschiedlichen Bounds) schreiben ?

                  Grüsse,
                  Carste

                  Comment


                  • #10
                    Hallo,

                    wenn das Ergebnis vom Automatimus über die Panel-Instanzen nicht den Ansprüchen genügt, muss man in der Tat selbst Hand anlegen

                    Comment

                    Working...
                    X