Schrift- und Controlgrößen Windows/Linux

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
dajackel2012
Beiträge: 8
Registriert: Sa 18. Feb 2012, 00:48
OS, Lazarus, FPC: Winux (L 0.9.30 FPC 2.4.2)
CPU-Target: 32Bit

Schrift- und Controlgrößen Windows/Linux

Beitrag von dajackel2012 »

Hi,
ich arbeite an einem kleinen Projekt unter Windows, welches später auch unter Linux und Mac laufen soll. Daher habe ich mich auch für Lazarus entschieden. :-)
Nun habe ich mein Hauptfenster fast fertig und zwei Dialoge und wollte mir das ganze spaßeshalber mal unter Linux ansehen (kann ja jeder behaupten, dass man es nur neu kompillieren muss *g*). Hab mir dafür LinuxMint in ner VM installiert und dort alles frisch generiert. Nun fällt mir auf, dass die Schriftart und Größe die Systemschriftart ist, jedoch sind meine Controls nicht proportional dazu gewachsen. Die Folge: Meine Buttons sind zu klein für den Text und die Labels überschneiden sich mit den Textfeldern. Das ist natürlich nicht so schön. :-)
Daher meine Frage, kann man die Controls irgendwie mit wachsen lassen, damit das GUI Layout erhalten bleibt? Ich finde es ja prinzipell richtig, dass die Schriftart und Größe zum Betriebssystem passt. Und wenn das nicht möglich ist, kann ich die automatische Anpassung irgendwie deaktivieren?

Gruß
Alex
Programmers don't die, they GOSUB without RETURN

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Schrift- und Controlgrößen Windows/Linux

Beitrag von MAC »

ja das ist möglich.
Allgemein gilt:
es würde nicht schaden die Buttons etwas großer zu gestallten, ist natürlich die einfachste möglichkeit, war aber nicht gewollt.
Der effekt tritt auf da bei den Buttons die Standartschritart die Systemschriftart ist, auch das lässt sich ändern (Button1.Font) , war aber auch nicht gefragt...
Ein Canvas besitzt eine Function "TextWidth" und "TextHeight" mit der berechnet werden kann wieviel Platz ein Text in einer beliebigen Schrftart benötigt, z.B:

Code: Alles auswählen

var
 c:TCanvas;
 x,y:integer;
begin
c := TCanvas.Create; // erstellen der Klasse TCanvas welche in c gepeichert wird;
c.Font.Name := 'Arial'; // hier wird expliziert die Schritart Arial zugeweisen, wenn man das weglasst wird warscheinlich die systemschriftart verwendet.
c.Font.size := 20; // siehe 1 Zeile weiter oben...
x := c.TextWidth('Hallo Welt'); // in x ist nachher gespeichert wie viel platz in der horizontalen der text benötigt
y := c.TextHeight('Hallo Welt'); // in y in der vertikalen...
c.Free; // unser Canvas wird nicht mehr gebraucht, also geben wir es frei.
Dabei sei gesagt das ist die größe die der Text braucht, der Button sollte immer nen bisschen größer sein, aber das ist ausprobieren...

Code: Alles auswählen

Signatur := nil;

dajackel2012
Beiträge: 8
Registriert: Sa 18. Feb 2012, 00:48
OS, Lazarus, FPC: Winux (L 0.9.30 FPC 2.4.2)
CPU-Target: 32Bit

Re: Schrift- und Controlgrößen Windows/Linux

Beitrag von dajackel2012 »

@Mac, ich danke dir für deine Antwort zu so später Stunde. Ich werde versuchen aus deinem Snippet eine für mich allgemeine Lösung zu basteln. Denke da muss irgendwas generisches her, damit man es nicht an jeder Form kodieren muss. Werde die Tage mal versuchen eine BasisForm zu erstellen, welche im Constructor alle Controls rekursiv durchläuft und die Attribute setzt.

Natürlich müssen Controls wie Buttons immer etwas größer als der enthaltene Text sein, aber zu groß möchte man die natürlich auch nicht haben, da es dass Aussehen zu stark beeinflusst. Meine Wunschvorstellung ist den GUI Guide von MS weitestgehend einzuhalten, was Schriftart, Größen etc.. angeht, gleichzeitig jedoch kompatibel zu anderen Plattformen zu bleiben, zumindest im Hinblick auf überschneidende Controls oder Texte. Meine bisherige Vermutung war, dass es ein generelles Problem ist mit einer allgemeinen bereits fertigen Lösung. Zum Beispiel ein spezieller Schalter in Lazarus oder ein mir unbekanntes Attribut ähnliches.

Gruß und N8

Alex
Programmers don't die, they GOSUB without RETURN

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Schrift- und Controlgrößen Windows/Linux

Beitrag von Scotty »

Mir hat ein ordentliches Anchoring/Alignment (mir fällt keine nützliche Übersetzung ein) geholfen, das Problem zu 95% zu lösen. Es kommt übrigens nicht nur zwischen OSen zu diesen Fragen. Auch wenn man unter Windows (oder Linux) den Theme umstellt, ändert sich einiges.

http://wiki.lazarus.freepascal.org/Autosize_/_Layout" onclick="window.open(this.href);return false;

Benutzeravatar
theo
Beiträge: 10940
Registriert: Mo 11. Sep 2006, 19:01

Re: Schrift- und Controlgrößen Windows/Linux

Beitrag von theo »

Würde auch Scotty's Vorschlag folgen.

Das Problem ist allgemein bekannt, vor allem, wenn auch noch Übersetzungen reinpassen müssen.

Kommt in den besten Familien vor. Im Anhang ein Bild der Netbeans IDE 7.1 (Siehe CB bei Quelltextausblendung verwenden).
Dateianhänge
nbide.png
nbide.png (11.2 KiB) 1213 mal betrachtet

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Schrift- und Controlgrößen Windows/Linux

Beitrag von MAC »

Anchoring ist auch ne tolle sache (du setzt den Button 2 sozusagen mit einem Anker (kenn mann aus Word bei Bildern) 3 cm links zum Button1 ... Ändert sich jetzt bei Button1 die Breite oder die Position, so wird Button2 direkt mitaktualisiert, ist also sehr praktisch wenn du dann die Breite Deiner Buttons änders...)

Etwas generisches ist hier eigentlich nicht schwer zu machen ( erstelle eine neue Unit, eine neue Form ist dafür nicht notwendig ).
Und eigentlich brauchst du nur eine Procedure in der ein TButton gegen wird, und der rest der Variablen sind ja im TButton selbst gespeichert...

Code: Alles auswählen

procedure Grosenanpassen(Btn:TButton;abstandzujederSeite:integer = 6);
Kleiner Tipp, die Procedure lässt sich auch schnell auf weitere Buttons anwenden wenn man sich die Vorfahren von Weiteren Buttons anschaut, z.B. TButton , TToggleBox, TBitBtn haben alle den gleichen Gemeinsammen vorfahren (Objektorientierte Programmierung, ich weis nicht wie gut du dich da auskennst nehme aber an das du schon etwas erfahrung hast...) Der Gemeinsamme vorfahre ist TButtonControl also würde eine Procedure aus so aussehen könnten. Der kann man dann gleich mehrere ButtonTypen übergeben...

Code: Alles auswählen

procedure Grosenanpassen(Btn:TButtonControl;abstandzujederSeite:integer = 6);

Code: Alles auswählen

Signatur := nil;

dajackel2012
Beiträge: 8
Registriert: Sa 18. Feb 2012, 00:48
OS, Lazarus, FPC: Winux (L 0.9.30 FPC 2.4.2)
CPU-Target: 32Bit

Re: Schrift- und Controlgrößen Windows/Linux

Beitrag von dajackel2012 »

Danke für die Antworten. Mit Vererbung kenne ich mich wohl etwas aus. Nur Pascal ist für mich Neuland. Ich bedanke mich für die Tipps und werde versuchen sie umzusetzen.
Programmers don't die, they GOSUB without RETURN

Antworten