Berichtshilfe

FastReport

Schriftgrößen von Memofeldern automatisch anpassen

Datenfelder können sehr unterschiedliche Datenmengen beinhalten - etwa Werte für Namen oder Adressen. Textfelder, die sich hier bzgl. der Größe dynamisch anpassen helfen, dass alle Daten sichtbar sind.

Um dies zu erreichen, ist ein wenig Arbeit im Code möglich. Hier die nötigen Schritte in der Übersicht:

1. Schritt: Variablen setzen
var
  StandardFontSizes: TStringList;
  
  
 2. Schritt: Prozeduren einfügen:

// Hilfsprozedur: Passt die Schriftgröße eines beliebigen Memos dynamisch an
procedure AutoScaleMemoFont(M: TfrxMemoView; StandardSize: Integer);
const
  MindestGroesse = 6;
begin
  { Schriftgröße und Standardwerte zurücksetzen }
  M.Font.Size := StandardSize;
  M.GapY := 4;
  M.Valign := vaCenter;

  // Bei mehrzeiligen Feldern ist es besser die Berechnung der Font-Größe über die Höhe des Feldes zu machen!
  while (M.CalcHeight > M.Height + 4) and (M.Font.Size > 6) do
    M.Font.Size := M.Font.Size - 1;

  // Vertikal-Anpassung bei kleiner Schrift (ist normalerweise nicht nötig, da FastReport das selber gut ausrichtet)!
  //  if M.Font.Size <= 8 then
  //  begin
  //    M.GapY := 5;
  //    M.Valign := vaTop;
  //  end;
end;

procedure frxReportOnStartReport(Sender: TfrxComponent);
begin
  if StandardFontSizes = nil then
    StandardFontSizes := TStringList.Create
  else
    StandardFontSizes.Clear;

  // Hier JEDES Feld eintragen, das dynamisch angepasst werden soll:
  StandardFontSizes.Values['Memo7'] := IntToStr(Memo7.Font.Size);        
end;

// Zentraler Event-Handler für alle betroffenen Textfelder
procedure DynamicFontOnAfterData(Sender: TfrxComponent);
var
  M: TfrxMemoView;
  StdSize: Integer;
  ValStr: String;
begin
  M := TfrxMemoView(Sender);
  ValStr := StandardFontSizes.Values[M.Name];

  // Hier können Besonderheiten bei einzelnen Feldern eingetragen werden ...

  // Prüfen, ob für das Feld eine Schriftgröße hinterlegt wurde, sonst Fallback auf 10
  if ValStr <> '' then
    StdSize := StrToInt(ValStr)
  else
    StdSize := 10;

  AutoScaleMemoFont(M, StdSize);
end;

3. Dynamische Textfelder bestimmen:

Im Bereich procedure frxReportOnStartReport(Sender: TfrxComponent); folgende Zeilen anpassen / ergänzen:
  StandardFontSizes.Values['MemoX'] := IntToStr(MemoX.Font.Size);
  
Hier muss jedes Memo-Feld (MemoX -> Memo1, Memo2 etc.) eingetragen werden. Bei den Memo-Feldern selbst wird bei Ereignissen, OnAfterData die Procedure DynamicFontOnAfterData ausgewählt.
Bei Eigenschaften sollte StretchMode auf smAcutalHeight stehen.
Ggf. kann das betreffende Band Stretched: True gestellt werden.

4. Gesamtbericht: OnStart zuweisen

Auch im Objektinspektor: Das Gesamtobjekt "frxReport: TfrxReport" muss unter OnStartReport frxReportOnStartReport zugewiesen bekommen.

Sollten noch weitere Memofelder automatisch angepasst werden, werden diese immer im Bereich procedure frxReportOnStartReport(Sender: TfrxComponent); ergänzt. Wichtig: Auch hier jeweils dem Datenfeld das Ereignis zuordnen und ggf. den StretchMode anpassen.