Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Array Programm übergreifend verarbeiten (https://www.delphipraxis.net/179647-array-programm-uebergreifend-verarbeiten.html)

Maik81NF 22. Mär 2014 11:09

Array Programm übergreifend verarbeiten
 
Moin euch Delphianer :D

Habe mal eine Frage, bezüglich Statischer/Dynamischer Arrays zu einem Offenen Array übergeben werden muß.

Die Verarbeide Funktion schaut wie folgt aus:
Delphi-Quellcode:
procedure StrResult(const Info: Array of String; Trenner: String; var Value: String);
Diese Procedure liegt innerhalb einer eigenen unit, welche im Späteren Verlauf als API erweitert werden soll.

Der Aufruf erfolgt hier:
Delphi-Quellcode:
  procedure FTA(Row: Word);
  var a: Byte;
      Info: Array[0..3] of String;
  begin
    Form2.LabeledEdit0.Text := PlanEdit.StringGrid1.Cells[a+1, Row];
    Form2.ComboBox1.Text   := PlanEdit.StringGrid1.Cells[a+1, Row];
    for a:= 2 to 5 do begin
      info[a]              := PlanEdit.StringGrid1.Cells[a+1, Row];
    end;
    StrResult(Info, '#', Form2.LabeledEdit1.Text);
  end;
Hier erhalte ich die Meldung:
Zitat:

Zitat von Lazarus
edit.pas(59,19) Error: Incompatible type for arg no. 1: Got "Array[0..4] Of ShortString", expected "Open Array Of AnsiString"

umgeschrieben auf ein Dynamisches Array
Delphi-Quellcode:
  procedure FTA(Row: Word);
  var a: Byte;
      Info: Array of String;
  begin
    SetLength(Info, 4);
    Form2.LabeledEdit0.Text := PlanEdit.StringGrid1.Cells[a+1, Row];
    Form2.ComboBox1.Text   := PlanEdit.StringGrid1.Cells[a+1, Row];
    for a:= 0 to 3 do begin
      info[a]              := PlanEdit.StringGrid1.Cells[a+1, Row];
    end;
    StrResult(Info, '#', Form2.LabeledEdit1.Text);
  end;
erhalte ich die Meldung
Zitat:

Zitat von Lazarus
edit.pas(60,19) Error: Incompatible type for arg no. 1: Got "Dynamic Array Of ShortString", expected "Open Array Of AnsiString"

Hat von euch jemand einen Idee, wie ich das lösen kann, Ohne eine Funktion mit bis zu 50 Variablen schreiben zu müßen?
Durch die Eigenschaft des Programmen bin ich auf die gewählen Typen (String) angewiesen.

Union 22. Mär 2014 11:15

AW: Array Programm übergreifend verarbeiten
 
Du musst das Array typisieren.

nuclearping 22. Mär 2014 12:11

AW: Array Programm übergreifend verarbeiten
 
Wenn du das Ganze später als API auslagern willst, solltest du auch bedenken, dass du (ohne Hilfsmittel) keine Strings an DLLs übergeben kannst. Besser wäre ein Array of P(Ansi/Wide)Char bzw. eine Liste mit PChar.

Maik81NF 23. Mär 2014 11:12

AW: Array Programm übergreifend verarbeiten
 
Zitat:

Zitat von Union (Beitrag 1252984)
Du musst das Array typisieren.

Hmmm,
Delphi-Quellcode:
Array of String;
sollte doch eigendlich reichen?

Zitat:

Zitat von nuclearping (Beitrag 1253000)
Wenn du das Ganze später als API auslagern willst, solltest du auch bedenken, dass du (ohne Hilfsmittel) keine Strings an DLLs übergeben kannst. Besser wäre ein Array of P(Ansi/Wide)Char bzw. eine Liste mit PChar.

Danke schon mal für wie Vorabinfo... nur bekomm ich dabei schon mal das Problem, das ich keine "DLL" verwende.
Mein Systems kann keine DLL verarbeiten ^^ ergo muß ich SO nutzten. Die API wird wohl als eigenes Package laufen...

Garfield 23. Mär 2014 12:11

AW: Array Programm übergreifend verarbeiten
 
Delphi-Quellcode:
Info: Array of String;
und
Delphi-Quellcode:
Info: Array[0..3] of String;
passt nicht zusammen. Am besten beide Arrays dynamisch deklarieren. So wie in Deinem zweiten Beispiel.

Zitat:

Zitat von Lazarus
edit.pas(60,19) Error: Incompatible type for arg no. 1: Got "Dynamic Array Of ShortString", expected "Open Array Of AnsiString"

bedeutet, das Du ein Array mit ShortStrings übergibst wo ein Array mit AnsiStrings erwartet wird. Wenn Du
Delphi-Quellcode:
Info: Array of ShortString;
nimmst, sollte es gehen.

nuclearping 23. Mär 2014 15:24

AW: Array Programm übergreifend verarbeiten
 
Zitat:

Zitat von Maik81NF (Beitrag 1253090)
Hmmm,
Delphi-Quellcode:
Array of String;
sollte doch eigendlich reichen?

So meint er es:
Delphi-Quellcode:
TStringArray = Array of String;
procedure Foo(Bar: TStringArray; var Output: TStringArray);

DeddyH 23. Mär 2014 16:11

AW: Array Programm übergreifend verarbeiten
 
Bei mir klappt das auch so:
Delphi-Quellcode:
procedure ShowArrayElements(const Arr: array of string);
var
  i: integer;
begin
  for i := Low(Arr) to High(Arr) do
    ShowMessage(Arr[i]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Info: array[0..3] of string;
  DynInfo: array of string;
begin
  Info[0] := 'Hallo';
  Info[1] := 'Welt';
  Info[2] := 'Hello';
  Info[3] := 'World';
  ShowArrayElements(Info);
  SetLength(DynInfo, 2);
  DynInfo[0] := 'Dideldum';
  DynInfo[1] := 'Wuppdi';
  ShowArrayElements(DynInfo);
  DynInfo := nil;
end;
Ich kann zwar nicht erkennen, wieso das plötzlich ShortStrings sein sollen, und die Indizes im Ausgangspost sind auch falsch belegt (2 bis 5 dürfte Probleme bereiten), aber an der fehlenden Typisierung sollte es nicht liegen. Ich hätte eher die Meldung erwartet, dass man keine Properties als Var-Parameter übergeben kann.

himitsu 23. Mär 2014 17:15

AW: Array Programm übergreifend verarbeiten
 
Jupp, für OpenArray-Parameter gibt es im Delphi eine automatische Konvertierung "von" dynamischen oder statischen Arrays, in diesen Parameter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 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 by Thomas Breitkreuz