StringList Beispiel (Pascal-Script) #
Aufgabe: Auf jede Rechnung soll im Fuß je nach Benutzer der EULANDA® eine bestimmte Signatur gedruckt werden. Die Signaturen liegen auf der Festplatte im Verzeichnis ‘C:\Signaturen’ und heißen wie die jeweiligen Benutzer mit der Endung ‘.txt’, also:
Franz.txt
Administrator.txt
Joseph.txt
Luise.txt
usw.
Bekanntermaßen basieren Memos auf String Listen. Was also würde sich besser eigenen um die Signatur im Fuß anzuzeigen als ein Memo?
Im Fuß platziert man also ein Memo (MemoSignatur) und fügt in die Prozedur FooterBeforePrint folgendes ein:
procedure FooterBeforePrint;
var
Signatur: TStringList; { 1 }
begin
Signatur:=TStringList.create; { 2 }
Signatur.LoadFromFile( ( 'C:\Signaturen\' + Grundwerte['User'] + '.txt') ); { 3 }
MemoSignatur.Lines.Assign(Signatur); { 4 }
Signatur.Free; { 5 }
end;
- Deklaration der Liste.
- Erzeugen der Liste
- Laden der Liste aus der Datei, deren Namen sich aus dem Verzeichnis, dem Benutzer und der Endung zusammensetzt.
- Mittels der Funktion Assign, der man als Parameter die Liste übergibt, dem Memo die Signatur zuweisen.
- Ganz wichtig: Freigeben der Liste.
Hierbei wird allerdings bei jeder neuen Seite auf die Festplatte zugegriffen und die Signatur geladen, doch Festplattenzugriffe sind teuer (kosten Zeit, die Festplatte ist ein sehr langsames Speichermedium, Zugriffe auf den Hauptspeicher sind zwar immer noch verhältnismäßig langsam, aber um ein Vielfaches schneller als Plattenzugriffe). Also bietet es sich an, die Signatur einmal zu laden und dann immer wieder zu benutzen. Dazu deklariert man unter Deklarationen –> Variables die StringList …
var
Signatur: TStringList;
… und lädt sie in ReportBeforePrint aus der Datei (geschieht genau einmal):
procedure ReportBeforePrint;
begin
Signatur:=TStringList.create;
Signatur.LoadFromFile( ( 'C:\Signaturen\' + Grundwerte['User'] + '.txt') );
end;
Sie ist dann im Hauptspeicher und somit kann man im Fuß immer wieder auf die bereits geladene Signatur zurückgreifen:
procedure FooterBeforePrint;
begin
MemoSignatur.Lines.Assign(Signatur);
end;
Aber nicht vergessen, die Liste muss wieder freigegeben werden (nach dem Drucken):
procedure ReportAfterPrint;
begin
Signatur.Free;
end;
Damit spart man für jede Seite (außer für die erste natürlich) den Plattenzugriff. Dies wird hier kaum ins Gewicht fallen, bei größeren Objekten wie Bildern z.B. kann es sich aber schon bemerkbar machen.