![]() |
2-Dimensionale Stringlisten übergeben
Moin Zusammen!
ich kann ja folgendes defineiren:
Delphi-Quellcode:
aber wenn ich dann
type
TAbcPair = Array [0..1] of string; Procedure Test(const slValues : Array of TAbcPair);
Delphi-Quellcode:
Test([['hi', 'bla'], ['test1', 'test2']]);
aufrufen will, findet das Delphi uncool. Ich könnte nun Funktionen drumzu bauen, so dass da beispielsweise
Delphi-Quellcode:
Test([C('hi', 'bla'), C('test1', 'test2')]);
steht. Das finde ich aber nicht so sympatisch. Das ist nun kein Weltuntergang, aber vielleicht hat da jemand ein "mach das doch so-und-so" spotan im Kopf. ;-) Liebe Grüße Incocnito |
AW: 2-Dimensionale Stringlisten übergeben
Zitat:
Delphi-Quellcode:
Jedes Element im Array ist vom Typ TVarRec. Dann kannst du:
procedure Test(const pmcNameValuePairs: array of const);
Delphi-Quellcode:
schreiben.
Test(['hi'‚ 3, 'test'‚ 'bla']);
Bis bald... Thomas |
AW: 2-Dimensionale Stringlisten übergeben
So sollte es funktionieren:
Delphi-Quellcode:
type
TAbcPair = TArray<string>; Procedure Test(const slValues : TArray<TAbcPair>); |
AW: 2-Dimensionale Stringlisten übergeben
Niemand hat hier gesagt, um welche Delphiversion es geht.
Ursprünglich konnte man Array-Deklarationen nur direkt an ein OpenArray übergeben, also wo der Parameter direkt als
Delphi-Quellcode:
deklariert wurde.
array of ...
Allem Anderen konnte man ausschließlich Variablen/Konstanten (und Property, sowie Function-Results) genau dieses Typs übergeben. Auch wenn sich da in den letzten Jahren / Delphiversionen schon so einiges getan hatte und man nun auch Variablen direkt solche Array via [...] übergeben kann, ist der Compiler manchmal echt saudämlich. Neuerdings geht es "eigentlich" auch direkt an dynamische Array-Konstanten, aber ... siehe unten der erste Link.
Delphi-Quellcode:
type TAbcPairArray = TArray<TArray<string>>;
procedure Test(const slValues : TAbcPairArray); type TAbcPair = TArray<string>; procedure Test(const slValues : TArray<TAbcPair>); procedure Test(const slValues : TArray<TArray<string>>); procedure Test(const slValues : array of TArray<string>); // OpenArray mit Array-Typ procedure Test(const slValues : array of array of string); // OpenArray PS: auch noch bissl was zu Arrays: ![]() ![]() ![]() |
AW: 2-Dimensionale Stringlisten übergeben
Moin Zusammen,
ich nutze Delphi 11. Das witzige ist ja, dass ich die Funktion so definieren kann, aber nicht mit "[['1', '2'], ['3', '4']]" aufrufen kann. Und ich würde schon gerne vorgeben, dass ich eine Liste haben will mit Elementen, die je 2 Strings haben. Das scheint also nicht zu gehen. ![]() ... verwirrt mich vollends. Das ergibt für mich 0 Sinn. Also jeder einzelne Punkt dort ist was anderes, als was ich erwarten würde ... einzig "Sig0 is OK" ist für mich noch logisch. Ich hoffe (da es als "Bug" gelistet ist) dass es ein Bug ist, der schon behoben wurde. Ich hätte nun schon gesagt, dass ich in Delphi nicht absolut unfähig bin und das passt für mich gar nicht. Vielen Dank für die Zeit und Mühe. LG Incocnito |
AW: 2-Dimensionale Stringlisten übergeben
Zitat:
Code:
Hiermit erzeugst du eine Liste, die Paare von Strings als Arrays speichert. Wichtig ist, dass bei der Erstellung der Arrays die Methode TArray<string>.Create() verwendet wird.
uses
System.Generics.Collections, System.SysUtils; var List: TList<TArray<string>>; Item: TArray<string>; begin List := TList<TArray<string>>.Create; try Item := TArray<string>.Create('1', '2'); List.Add(Item); Item := TArray<string>.Create('3', '4'); List.Add(Item); // Zugriff auf die Liste Writeln(List[0][0] + ', ' + List[0][1]); // Ausgabe: 1, 2 Writeln(List[1][0] + ', ' + List[1][1]); // Ausgabe: 3, 4 finally List.Free; end; end. |
AW: 2-Dimensionale Stringlisten übergeben
Es ist ja kein Problem records / objekte zu erstelllen, die diese Daten abbilden.
Was geht ist:
Delphi-Quellcode:
aber ich will ja nicht den Umweg über eine (oder gar mehrere Variablen) gehen,
type
TAbcPair = Array [0..1] of string; TSomeList = Array of TAbcPair; Procedure Test(const slValues : TSomeList); ... Procedure DoSomething(); var liste : TSomeList; begin SetLength(liste, 2); liste[0][0] := '1'; liste[1][0] := '2'; liste[0][1] := '3'; liste[1][1] := '4'; Test(liste); end; sondern einfach nur:
Delphi-Quellcode:
und das geht nicht.
Procedure DoSomething();
begin Test([['1', '2'], ['3', '4']]); end; Da aber
Delphi-Quellcode:
geht, verstehe ich nicht, warum ich 2-dimensionale Listen nicht zum Laufen bringen kann.
Procedure Text(vals : TDynStringArray);
... Procedure DoSomething(); begin Test(['1', '2', '3', '4']); end; Generell scheint es doch zu gehen mit Listen als Parameter diese direkt zu füllen. |
AW: 2-Dimensionale Stringlisten übergeben
Kompiliert in Delphi 11.3 und spuckt die Strings aus:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; procedure Test(const A2DStringArray: TArray<TArray<string>>); begin for var SingleStringArray in A2DStringArray do begin for var SingleString in SingleStringArray do begin Writeln(SingleString); end; end; end; procedure DoSomething(); begin Test([['1', '2'], ['3', '4'], ['5', '6'], ['Auto', 'Baum'], ['Steuererklärung', 'Die Waldfee']]); end; begin try DoSomething except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end. |
AW: 2-Dimensionale Stringlisten übergeben
Delphi erlaubt hier aber nur Listen von variabler Länge, nicht "Array [0..1] of string".
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TAbcPair = Array [0..1] of string; TSomeList = Array of TAbcPair; procedure Test(const A2DStringArray: TSomeList); begin for var SingleStringArray in A2DStringArray do begin for var SingleString in SingleStringArray do begin Writeln(SingleString); end; end; end; procedure Test2(const A2DStringArray: TAbcPair); begin for var SingleStringArray in A2DStringArray do begin Writeln(SingleStringArray); end; end; begin try Test([['1', '2'], ['3', '4']]); // <- Inkompatible Typen: 'TAbcPair' und 'Set' Test2(['1', '2']); // <- Inkompatible Typen: 'TAbcPair' und 'Set' var liste : TAbcPair; liste[0] := '5'; liste[1] := '6'; Test([liste]); // <- Alles cool Test2(liste); // <- Alles cool except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |
AW: 2-Dimensionale Stringlisten übergeben
Ja, dann mach doch nicht? :roll:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 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