Hi,
Danke, daß Du mir noch ungefähr folgen kannst und Dich bemühst.
Vielleicht sollte ich doch etwas ausholen:
Es gibt in einer Komponente die Prozedur
procedure DrawTextAcrossCols(const arrColumnText: Array of string; Background:TColor = clNone);
Damit kann man eine Art PDF-Datei mit Vorschau erstellen.
Der Nachteil dieser Procedure: Man kann nur eine Zeile in einem Spaltentext schreiben. Ist der Text, der in die Spalte soll länger oder umgebrochen, wird er abgeschnitten.
Aufgerufen wird diese Prozedure eben mit einem StringArray,also so:
DrawTextAcrossCols([memo1.text,memo2.txt,memo3.text]);
Jetzt ist es wahrscheinlich, daß eben in den Memos eine verschiedene Anzahl von Zeilen drin ist. Also muß eine Prozedur her, die nicht nur eine Zeile schreibt, sondern alle.
Diese Prozedur heißt bei mir eben in Anlehnung an das Original
procedure DrawTextAcrossColsEx(const arrColumnText: Array of string; Background:TColor = clNone);
Aufgerufen wird sie genauso, wie die Originalprozedur.
Ich übernehme dann die übergebenen memo-Texte in eine Stringliste und übergebe dann die String-Zeilen wieder an ein String Array. Anschließend wird die Arraylänge bei dem neuen Array auf die gleiche maximale Länge gesetzt.
Delphi-Quellcode:
var
fMemo:TStringList;
arrColText: Array of Array of string;
..
begin
try
fMemo:=TStringList.Create;
for a:=0 to high(arrColumnText) do begin <--- Übergabe Array
fMemo.text:=arrColumnText[a]; <--- Stringliste
SetLength(arrColText[a], fMemo.Count); neues Array Länge zuweisen
lns:=fMemo.Count;
if fMemo.Count > lns then
lns:=fMemo.Count; <---- Länge zählen und jeweils auf neuen Wert
wenn neuer Wert größer als alter
for b:=0 to fMemo.Count -1 do begin
arrColText[a][b]:=fMemo.Strings[b]; <---- neues Array zeilenweise füllen
end;
end;
for a:=0 to high(arrColText) do
setlength(arrColText[a],lns); <--- alles auf die gleiche Höhe
Raus kommt dann ein Array mit der gleichen Länge bei allen Ebenen.
Die gleiche Länge deswegen, damit es beim Durchlaufen zum Ausgeben zu keinen Exceptions kommt.
Sieht dann etwa so aus:
__________________________________________________ _________
|0 |1 |2 |
-----------------------------------------------------------
|Text |Text Text |Text Text Text |
| | |Test Test Test |
usw.
Jetzt hab ich Zeilen, die ich mit der ursprünglichen Prozedur zeilenweise ausgeben kann, indem ich das neue Arrays mit einer for Schleife durchlaufe.
Also so:
Delphi-Quellcode:
for b:=0 to lns-1 do
DrawTextAcrossCols([arrColText[0,b], arrColText[1,b], arrColText[2,b]]);
Das "lns" wäre das high von arrColText. Ist, wie gesagt, bei allen auf die gleiche maximale "Höhe" angeglichen worden. In meinem Test würden 16 Zeilen erstellt.
In den ersten Spalten der Ausgabe würde dann in der ersten Reihe in allen drei Spalten was drin stehen, dann nur noch 15 mal was in der dritten Spalte.
Soweit funktioniert das wie gewollt.
Jetzt fehlt halt noch der dynamische Aufbau der Prozedur.
Je nachdem, wieviele Einträge das übergebende Array hat, muß eben eine verschiedene Anzahl von Parametern in die Prozedur.
Einmal so:
Delphi-Quellcode:
for b:=0 to lns-1 do
DrawTextAcrossCols([arrColText[0,b], arrColText[1,b], arrColText[2,b]]);
oder halt so:
Delphi-Quellcode:
for b:=0 to lns-1 do
DrawTextAcrossCols([arrColText[0,b]]);
usw.
Vielleicht gibts ja doch was .
Danke für die Geduld.
Josef