[Erledigt] TFont Einstellungen speichern

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
charlytango
Beiträge: 1095
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

[Erledigt] TFont Einstellungen speichern

Beitrag von charlytango »

Hi,

Zum Drucken von Etiketten möchte ich dem Benutzer ermöglichen alle Einstellungen die TFont bietet zu benutzen.
Da ich aber zum Druck mit LazReport keinen Designer verwende sondern die Etiketten per Code erstelle muss ich mich selber drum kümmern.

Meine Recherche hat leider bis auf solche Tips kaum etwas essentielles zutage gefördert.

Zudem möchte ich den Font pro Feldrahmen (und davon habe ich mal drei) in der Datenbank speichern. Klar kann ich pro Feld alle Attribute in je eine Tabellenspalte übersetzen, was die Sache nicht übersichtlicher macht.

Die Lazarus-IDE hat ja irgend eine Funktion Fonteigenschaften aus einem TFontDialog

TFont_Dialog.png
TFont_Dialog.png (64.24 KiB) 650 mal betrachtet

auszulesen und in Eigenschaften des Objektinspektors umzuwandeln.

TFont_Objectinspector.png
TFont_Objectinspector.png (32.31 KiB) 650 mal betrachtet

interessanterweise macht die GUI dann das daraus:

Code: Alles auswählen

  object Label1: TLabel
    Left = 144
    Height = 145
    Top = 80
    Width = 145
    Caption = 'Label1'
    Font.CharSet = ANSI_CHARSET
    Font.Color = 65408
    Font.Height = -42
    Font.Name = 'Century'
    Font.Orientation = 450
    Font.Pitch = fpVariable
    Font.Quality = fqDraft
    Font.Style = [fsItalic, fsUnderline]
    ParentFont = False
  end
Es fehlt die Eigenschaft "Size" -- keine Ahnung warum.

Aber egal -- ich suche nach einer Möglichkeit TFont elegant (möglichst in nur eine DB Spalte) in eine DB zu schreiben und zu lesen. Möglicherweise gibt es da schon Funktionen die mir nur unbekannt sind.

Any Hints welcome
THX
Zuletzt geändert von charlytango am Mi 3. Jul 2024, 19:50, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6855
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TFont Einstellungen speichern

Beitrag von af0815 »

Font.height und Font.size sind scheinbar durch eine Formel verknüpft, vermutlich wird deswegen nur die Height gespeichert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: TFont Einstellungen speichern

Beitrag von theo »

Würde ich mit JSON machen, dann bekommst du einen String den du in die DB schreiben kannst.

https://wiki.freepascal.org/Streaming_JSON

charlytango
Beiträge: 1095
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TFont Einstellungen speichern

Beitrag von charlytango »

nicht gut, denn ich muss dem Lazreport ja genau das mitteilen

Code: Alles auswählen

var
  TextStyle: TlrTextRectStyle; 
begin   
  ....
  
  TextStyle.FontSize := 8;  
Ich sehe da schon Felle davon schwimmen :(

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

Re: TFont Einstellungen speichern

Beitrag von theo »

charlytango hat geschrieben: Mi 3. Jul 2024, 19:10 nicht gut, denn ich muss dem Lazreport ja genau das mitteilen
Was ist "nicht gut"?
Du sagtest "ich suche nach einer Möglichkeit TFont elegant (möglichst in nur eine DB Spalte) in eine DB zu schreiben und zu lesen."
Genau das geht so. Oder wie?

EDIT: Ach so, du meinst Font.Slze. Das geht so:

Code: Alles auswählen

Font.Height = -Font.Size * Font.PixelsPerInch / 72
EDIT2: Mit JSON in String speichern geht z.B. so:

Code: Alles auswählen

uses...  fpjsonrtti, fpjson; 

function TForm1.SerializeObjectToJSON(AObject: TObject): string;
var
  jsoSerialize: TJSONStreamer;
begin
  jsoSerialize := TJSONStreamer.Create(nil);
  try
    Result := jsoSerialize.ObjectToJSONString(AObject);
  finally
    jsoSerialize.Free;
  end;
end;

procedure TForm1.DeSerializeJSONToObject(JSON: string; AObject: TObject);
var
  jsoDeSerialize: TJSONDeStreamer;
begin
  jsoDeSerialize := TJSONDeStreamer.Create(nil);
  try
    jsoDeSerialize.JSONToObject(JSON, AObject);
  finally
    jsoDeSerialize.Free;
  end;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  if FontDialog1.Execute then
  begin
    Caption := SerializeObjectToJSON(FontDialog1.Font);
    DeSerializeJSONToObject(Caption, Memo1.Font);
  end;
end; 

wp_xyz
Beiträge: 5193
Registriert: Fr 8. Apr 2011, 09:01

Re: TFont Einstellungen speichern

Beitrag von wp_xyz »

Font.Size ist in Points (1 Pt = 1/72 Zoll), Font.Height ist in Pixeln. Daher ist

Code: Alles auswählen

 Font.Size := MulDiv(abs(Font.Height), 72, Font.PixelsPerInch); 
Siehe: https://wiki.freepascal.org/Font. Dort wird auch erklärt, warum Font.Height üblicherweise negativ ist.

charlytango
Beiträge: 1095
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TFont Einstellungen speichern

Beitrag von charlytango »

Erstmal DANKE die Herren, während ihr munter weiter schriebt hab ich für mich das erste Mal anhand des Links von @theo mit JSON getestet -- Chapeau, das ist wirklich elegant.

Danke für den Code, was ähnliches kam bei mir gsd auch raus.

Und der Hinweis mit der Size-Umrechnung auch, danke an @wp_xyz für die Hintergrundinfo.

Ich darf euch noch kurz teilhaben lassen -> Hüpf, Freu, Grins und noch ne Menge anderer

Mathias
Beiträge: 6964
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TFont Einstellungen speichern

Beitrag von Mathias »

theo hat geschrieben: Mi 3. Jul 2024, 19:04 Würde ich mit JSON machen, dann bekommst du einen String den du in die DB schreiben kannst.

https://wiki.freepascal.org/Streaming_JSON
Da kann man sich streiten, ich hätte XML genommen.
Ausser es ist etwas ganz einfaches, dann würde ich sogar INI nehmen wie bei charlytango Link.

Aber da kann man sich streiten, was das beste ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten