Einzelnen Beitrag anzeigen

josefkoller

Registriert seit: 22. Okt 2012
49 Beiträge
 
#18

AW: Prozedur zusammenbauen

  Alt 18. Nov 2012, 00:38
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
  Mit Zitat antworten Zitat