![]() |
Prozedur zusammenbauen
Hallo,
ich weiß nicht recht weiter. Es gibt folgende Prozedur:
Delphi-Quellcode:
Die Paramter in der Prozedur sind Arrayeinträge und unterscheiden sich lediglich in den Zahlen 0,1,2 und es sollen mit einer Schleife beliebige fortlaufende Zahlen eingesetzt werden können.
DrawTextAcrossCols([arrColText[0,b],arrColText[1,b],arrColText[2,b]]);
Also DrawTextAcrossCols([arrColText[0,b],arrColText[1,b],arrColText[2,b],arrColText[n,b]]); Zuerst dachte ich, ich baue diese Prozedurparamter mit einem String zusammen. Also
Delphi-Quellcode:
Ist natürlich Quatsch. Aber ich weiß nicht, wie ich es machen soll.
var
prepare:string, begin .... prepare:='(['; for a:=0 to high(arrColumnText) do prepare:=prepare+'arrColText[0,b],'; prepare:=copy(prepare,0,length(prepare)-1); prepare:=prepare+'])'; for b:=0 to lns-1 do begin //DrawTextAcrossCols([arrColText[0,b],arrColText[1,b],arrColText[2,b]]); DrawTextAcrossCols+prepare; end; .... end; Diese "zusammengebaute" Prozedur muß in einem rutsch laufen, damit die mit den Paramtern übergebenen texte beim Ausdruck nebeneinander stehen. Wenn ich die Prozedur mit einer Schleife so aufrufe:
Delphi-Quellcode:
werden die Spalten nicht nebeneinander, sondern versetzt untereinander dargestellt.
for i:= 0 to high(arrColumnText) do
DrawTextAcrossCols([arrColText[[U][B]i[/B][/U],b] Scheidet also aus. Zurückspringen auf das ursprüngliche TOP scheidet auch aus. So nach dem Motto: "Ich kann den Ausdruck ja nicht anhalten, um wieder oben zu beginnen!" Wie kann ich die Prozedur so zusammenbauen, daß sie in einem Rutsch ausgeführt werden kann. Danke. Josef |
AW: Prozedur zusammenbauen
Erstelle ein Array mit den "n" Einträgen und übergib es der Prozedur!
|
AW: Prozedur zusammenbauen
[del]
|
AW: Prozedur zusammenbauen
Hi,
Zitat:
In welchen Array Typ soll ich denn meine Stringarrays packen? arrResult: array of .....???? for i:= 0 to n do |- die Null soll eben wäre das erste usw. arrResult[i]:= // arrColText[0,b]; <-- so sehen meine Stringarrays jetzt aus. Gib mir mal noch einen Typ. Ich komm momentan nicht vorwärts und nicht rückwärts. Danke. Josef |
AW: Prozedur zusammenbauen
Kann es ein, dass du sowas in der Art wie bei Format suchst:
Delphi-Quellcode:
Das wird da so gelöst:
Format('Text %s, Text %s, Text %s', [a, b, c]);
...
Delphi-Quellcode:
//Edit:
function Format(const Format: string; const Args: array of const): string;
begin ... end; Bei Polygon Syntax:
Delphi-Quellcode:
Beispiel:
procedure Polygon(Points: array of TPoint);
...
Delphi-Quellcode:
Canvas.Polygon([Point(10, 10), Point(30, 10), Point(130, 30), Point(240, 120)]);
...
Delphi-Quellcode:
procedure TCanvas.Polygon(const Points: array of TPoint);
begin ... end; |
AW: Prozedur zusammenbauen
Hi,
nein, sowas nicht. Ich such einfach eine Möglichkeit eine Prozedur vor dem Aufruf zusammenzubasteln. Je nachdem, wieviele Textarrays ich habe, muß die Prozedur unterschiedlich aufgerufen werden. Also: Wenn ich ein Text array habe, dann so:
Delphi-Quellcode:
Wenn es zwei sind, dann halt so:
DrawTextAcrossCols([arrColText[0,b]]);
Delphi-Quellcode:
usw.
DrawTextAcrossCols([arrColText[0,b], [arrColText[1,b] ]);
Händisch ist das ja kein Problem. Ich schreib halt soviele hin, wie ich habe. Es soll aber automatisiert werden und die Anzahl dieser TextArray's ist eben nicht immer gleich. Danke. Josef |
AW: Prozedur zusammenbauen
Die Art der möglich Zuweisungen lassen auf eine Array of Const schließen, so einfach kann da kein Array zugewiesen werden. Hier gibt es einen Artikel zu diesem Thema:
![]() |
AW: Prozedur zusammenbauen
Das Beispiel mit Points ist vielleicht nicht so glücklich gewählt, aber ich ich erstelle ein Array mit einer n-Zahl von Points und übergebe es als Polygon. Das Polygon schluckt also n Parameter.
|
AW: Prozedur zusammenbauen
Mehrdimensionale Arrays kann man AFAIK nicht als offene Arrays übergeben, aber wenn man typisiert, sollte das klappen. Schnell unter Lazarus zusammengetippt und ausprobiert:
Delphi-Quellcode:
Kann aber auch sein, dass ich das Problem nicht richtig verstanden habe.
type
TStringArray = array of string; procedure ShowValues(const ValueArrays: array of TStringArray); var i, j: integer; begin for i := Low(ValueArrays) to High(ValueArrays) do for j := Low(ValueArrays[i]) to High(ValueArrays[i]) do ShowMessage(ValueArrays[i, j]); end; { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var Arr1, Arr2: TStringArray; begin SetLength(Arr1, 2); Arr1[0] := 'Hallo'; Arr1[1] := 'Welt'; SetLength(Arr2, 3); Arr2[0] := 'Hier'; Arr2[1] := 'bin'; Arr2[2] := 'ich'; ShowValues([Arr1, Arr2]); Arr1 := nil; Arr2 := nil; end; |
AW: Prozedur zusammenbauen
IMHO wird etwas gesucht das so aussehen soll, aber natürlich nicht funktioniert
Delphi-Quellcode:
Type
TStringArray=Array of String; procedure TForm5.Button1Click(Sender: TObject); var DerWäreschönWennAlsConstArrayÜbergebbar:TStringArray; begin SetLength(a,2); DerWäreschönWennAlsConstArrayÜbergebbar[0] := 'eins'; DerWäreschönWennAlsConstArrayÜbergebbar[1] := 'zwei'; Showmessage(Format('Ausgabe 1. %s 2. %s',DerWäreschönWennAlsConstArrayÜbergebbar)); end; |
AW: Prozedur zusammenbauen
Nachdem ich jetzt den Ausgangspost noch 4 Mal intensiv durchgelesen habe könntest Du Recht haben. Ich hatte mich auch schon gewundert wegen des Array of const.
|
AW: Prozedur zusammenbauen
Hi,
Zitat:
eben bei ShowValues([Arr1, Arr2]); wie in Deinem Beispiel hakt es. wie bekomme ich da eins, zwei drei, vier Arrays rein? also nicht händisch reingetippt. danke. Josef |
AW: Prozedur zusammenbauen
Nun bin ich aber doch wieder verwirrt. Kannst Du mir mal einen angedachten Aufruf anhand meines Beispiels zeigen?
|
AW: Prozedur zusammenbauen
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
daraus schließe ich, dass es sich klarerweise um ein zwei dimensionales Array handelt.
DrawTextAcrossCols([arrColText[0,b]]); Wenn es zwei sind, dann halt so:
DrawTextAcrossCols([arrColText[0,b], [arrColText[1,b] ]); usw. Du willst von diesem Array jeweils die ersten Werte übergeben.. Sprich [0,0], [1, 0], [2,0].. -Edit- Nicht die ersten, sondern die "b" ten Elemente -/Edit- Im angehänten Bild ist dies genau der rot markierte Bereich! -Edit- B ist in diesem Fall 0 -/Edit- GENAU das ist auch ein Array.. dazu musste es erst bilden:
Delphi-Quellcode:
und anschließend rufst du die Methode ganz einfach auf..
var
roterBereich: Array of String; begin SetLength(roterBereich, Length(arrColText)); for i := 0 to high(roterBereich) do roterBereich[i] := arrColText[i,b];
Delphi-Quellcode:
Und noch etwas - lies dir bitte ein paar Tutorials zu Arrays durch.
//so
DrawTextAcrossCols(roterBereich); |
AW: Prozedur zusammenbauen
Zeig doch mal die Deklaration von DrawTextAcrossCols.
Zitat:
Delphi-Quellcode:
) an, befüllst sie und übergibst dann diese an die Funktion. :angle2:
array of TStringArray
Zitat:
Delphi-Quellcode:
ist intern ein
array of const
Delphi-Quellcode:
und sowas kann man einer Funktion auch übergeben.
array of TVarRec
(nur die Speicherverwaltung ist etwas nervig, darum ist es schönder, wenn man diese Array-Verwaltung in einer Klasse kapselt, welche sich sicher um alles kümmert) Man kann halt nur Arrays des gleichen Typs zuweisen. Man kann z.B. auch kein Array of AnsiString einem Array of WideString oder einemAray of Variant zuweisen. |
AW: Prozedur zusammenbauen
Hi,
danke für die antworten. Nur, es ist nichts passendes dabei. Das mit dem Polygon muß ich mir nochmal überlegen. Ich hab mittlerweile im Netz auch weitergesucht. Zwei Möglichkeiten hab ich da gefunden: 1. Das ganze mit case zu machen. Also
Delphi-Quellcode:
usw. Mann müßte aber einfach irgendwann aufhören.
case counts of
1: begin for b:=0 to lns-1 do DrawTextAcrossCols([arrColText[0,b]]); <-- ein Array end; 2: begin for b:=0 to lns-1 do DrawTextAcrossCols([arrColText[0,b], [arrColText[1,b]]); <----- end; Ist also auch nicht dynamisch erstellbar. Oder kann man per Code so ein variables case Construkt erstellen? 2. Möglichkeit
Delphi-Quellcode:
Das klappt aber bei mir nicht.
unit formTest;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TProcedure = procedure; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure Foo; private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var p: TProcedure; begin p := self.MethodAddress('Foo'); if Assigned(p) then p; end; procedure TForm1.Foo; begin MessageDlg('Hallo!',mtInformation,mbOKCancel,0); end; end. p wird nicht assigned, ist leer: Ich hab das bei mir so probiert:
Delphi-Quellcode:
Diese zweite Möglichkeit scheint mir die Geeignete zu sein. Nur: es funktioniert so nicht. P ist immer leer.
type
TProcedure = procedure; .. public procedure DrawTextAcrossCols(const arrColumnText: Array of string; Background:TColor = clNone); procedure DrawTextAcrossColsEx(const arrColumnText: Array of string); procedure prepare(const arrColumnText: Array of string); ..... procedure TTest.DrawTextAcrossColsEx(const arrColumnText: Array of string); var prepare:string; P:TProcedure begin .. prepare:='(['; for a:=0 to high(arrColumnText) do prepare:=prepare+'arrColText[0,b],'; prepare:=copy(prepare,0,length(prepare)-1); prepare:=prepare+'])'; p := self.MethodAddress('prepare'); if Assigned(p) then p; .. end; procedure TTest.peparedDrawGrid(const arrColumnText: Array of string); begin //leer; end; Vielleicht seht ihr jetzt besser, was ich erreichen will. Den Tipp, daß ich mir Array Tutorials anschauen soll, finde ich sehr sinnvoll, nur hat das nichts mit dem Aufruf einer Prozedur zu tun, die "zusammengebastelt" werden soll. Könnt ihr mir vielleicht bei diesem Aufruf in der 2. Möglichkeit auf die Sprünge helfen? Danke für den Link: Thema: ![]() Muß mal schauen, was da drin steht. Josef P.S. |
AW: Prozedur zusammenbauen
Ich wusste nicht dass DrawTextAcrossCols von Dir definiert werden kann, ich bin davon ausgegangen sie sei vorgegeben.
Wenn Du sie selbst festlegen kannst tust Du Dir sicher leichter, bei Deiner Anforderung an den Aufruf, wenn Du kein Open Array verwendest sondern etwas in der Art:
Delphi-Quellcode:
Type TMyCellRecord=Record Text:String; Color:TColor; end; TMyDrawArray=Array of Array of TMyCellRecord; Procedure DrawMyArray(a:TMyDrawArray); var c,r:Integer; begin for r := 0 to High(a) do for c := 0 to High(a[r]) do // Irgendwas mit der Zelle end; procedure TForm5.Button1Click(Sender: TObject); const cols=2; rows=5; var a:TMyDrawArray; begin SetLength(a,rows,cols); a[0][0].Text := 'eins'; a[0][0].Color := clLime; //...... DrawMyArray(a) end; |
AW: Prozedur zusammenbauen
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
Delphi-Quellcode:
Damit kann man eine Art PDF-Datei mit Vorschau erstellen.
procedure DrawTextAcrossCols(const arrColumnText: Array of string; Background:TColor = clNone);
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
Delphi-Quellcode:
Aufgerufen wird sie genauso, wie die Originalprozedur.
procedure DrawTextAcrossColsEx(const arrColumnText: Array of string; Background:TColor = clNone);
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:
Raus kommt dann ein Array mit der gleichen Länge bei allen Ebenen.
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 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:
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.for b:=0 to lns-1 do DrawTextAcrossCols([arrColText[0,b], arrColText[1,b], arrColText[2,b]]); 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:
oder halt so:
for b:=0 to lns-1 do
DrawTextAcrossCols([arrColText[0,b], arrColText[1,b], arrColText[2,b]]);
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz