Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   2-Dimensionale Stringlisten übergeben (https://www.delphipraxis.net/215773-2-dimensionale-stringlisten-uebergeben.html)

Incocnito 5. Sep 2024 12:36

2-Dimensionale Stringlisten übergeben
 
Moin Zusammen!

ich kann ja folgendes defineiren:

Delphi-Quellcode:
type
  TAbcPair = Array [0..1] of string;
Procedure Test(const slValues : Array of TAbcPair);
aber wenn ich dann
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

mytbo 5. Sep 2024 13:31

AW: 2-Dimensionale Stringlisten übergeben
 
Zitat:

Zitat von Incocnito (Beitrag 1540588)
"mach das doch so-und-so"

Wenn du flexibel sein willst, schreibe:
Delphi-Quellcode:
procedure Test(const pmcNameValuePairs: array of const);
Jedes Element im Array ist vom Typ TVarRec. Dann kannst du:
Delphi-Quellcode:
Test(['hi'‚ 3, 'test'‚ 'bla']);
schreiben.

Bis bald...
Thomas

Uwe Raabe 5. Sep 2024 20:10

AW: 2-Dimensionale Stringlisten übergeben
 
So sollte es funktionieren:
Delphi-Quellcode:
type
  TAbcPair = TArray<string>;

Procedure Test(const slValues : TArray<TAbcPair>);

himitsu 5. Sep 2024 23:30

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:
array of ...
deklariert wurde.
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:
https://embt.atlassian.net/servicede...tal/1/RSS-1691
https://quality.embarcadero.com/browse/RSP-42255
https://quality.embarcadero.com/browse/RSP-39686

Incocnito 6. Sep 2024 15:00

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.

https://quality.embarcadero.com/browse/RSP-42255
... 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

rebas 18. Sep 2024 03:56

AW: 2-Dimensionale Stringlisten übergeben
 
Zitat:

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.

https://quality.embarcadero.com/browse/RSP-42255geometry dash subzero

... 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
Wenn du versuchst, eine Liste mit Elementen zu erstellen, die jeweils zwei Strings enthalten, dann könnte eine Datenstruktur wie TList<TArray<string>> oder eine benutzerdefinierte Record- oder Tuple-Implementierung hilfreich sein.
Code:
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.
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.

Incocnito 18. Sep 2024 07:32

AW: 2-Dimensionale Stringlisten übergeben
 
Es ist ja kein Problem records / objekte zu erstelllen, die diese Daten abbilden.

Was geht ist:

Delphi-Quellcode:
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;
aber ich will ja nicht den Umweg über eine (oder gar mehrere Variablen) gehen,
sondern einfach nur:

Delphi-Quellcode:
Procedure DoSomething();
begin
  Test([['1', '2'], ['3', '4']]);
end;
und das geht nicht.

Da aber

Delphi-Quellcode:
Procedure Text(vals : TDynStringArray);
...
Procedure DoSomething();
begin
  Test(['1', '2', '3', '4']);
end;
geht, verstehe ich nicht, warum ich 2-dimensionale Listen nicht zum Laufen bringen kann.
Generell scheint es doch zu gehen mit Listen als Parameter diese direkt zu füllen.

TiGü 18. Sep 2024 08:19

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.

Incocnito 18. Sep 2024 12:25

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.

TiGü 18. Sep 2024 14:40

AW: 2-Dimensionale Stringlisten übergeben
 
Ja, dann mach doch nicht? :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 Uhr.
Seite 1 von 2  1 2      

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