Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Array mit mehreren Strings auf einmal füllen (https://www.delphipraxis.net/157626-array-mit-mehreren-strings-auf-einmal-fuellen.html)

Mike_ 18. Jan 2011 20:33

Delphi-Version: 2007

Array mit mehreren Strings auf einmal füllen
 
Guten Abend,

es ist mir fast peinlich die Frage zu stellen, da Arrays m.E.n. zu den Grundfunktionen gehören, die selbst ein Anfänger wissen müsste bzw. man zur not ergoogeln sollte.

Weder google noch die Boardsuche hat mir dabei jedoch etwas wirklich gebracht.

Aufgabe:
Ich möchte mehrere Strings in ein Array packen.

"Problem":
Die Strings sind bereits dem Programm vorgegeben, so dass ich bisher als einzige Lösung folgendes tat:

[...]
var
ArrayWithData: Array of String;
begin
ArrayWithData[0] := 'a';
ArrayWithData[1] := 'b';
[...]
ArrayWithData[15] := 'c';


Aber dass muss doch auch effizienter gehen ?!
Ich habe im Internet auf einer FreePascal Seite folgenden Quellcode gefunden (Umgeformt auf mein Beispiel):

[...]
ArrayWithData := ('a','b','c');


Das "schluckt" Delphi 2007 aber nicht...
Ich bin ratlos... wie kann ich ein Array fortlaufend füllen ohne den Quellcode "künstlich" aufquillen zu lassen ?

EDIT://
Alternativ kam mir die Idee die Strings in eine StringList zu packen und von dort in ein Array zu verschieben... jedoch habe ich auch bei der Stringlist nur die Möglichkeit gefunden ein Item je Zeile hinzuzufügen...

patti 18. Jan 2011 20:35

AW: Array mit mehreren Strings auf einmal füllen
 
Handelt es sich bei den Strings um Konstanten? Wenn ja, dann kannst du das Array sofort als Konstante definieren und an dieser Stelle einfach befüllen...

Klaus01 18. Jan 2011 20:52

AW: Array mit mehreren Strings auf einmal füllen
 
.. spräche etwas dagegen ein TStringList zu nutzen?
Delphi-Quellcode:
sl := TStringList.create;
sl.Delimiter := ' ';
sl.DelimitedText := 'a b c';
Nachtrag:
zum Schluss das Freigeben der StringList nicht vergessen

Grüße
Klaus

mkinzler 18. Jan 2011 20:55

AW: Array mit mehreren Strings auf einmal füllen
 
Zitat:

. spräche etwas dagegen ein TStringList zu nutzen?
Würde ich auch so mache; ist allerdings kein Array.

Klaus01 18. Jan 2011 20:58

AW: Array mit mehreren Strings auf einmal füllen
 
Zitat:

Zitat von mkinzler (Beitrag 1075654)
Zitat:

. spräche etwas dagegen ein TStringList zu nutzen?
Würde ich auch so mache; ist allerdings kein Array.


..läst sich aber ähnlich wie ein Array ansprechen sl[0]..

Grüße
Klaus

mkinzler 18. Jan 2011 21:00

AW: Array mit mehreren Strings auf einmal füllen
 
Wie gesagt, habe ich beim Lesen der Frage auch an eine gedacht.

patti 18. Jan 2011 21:00

AW: Array mit mehreren Strings auf einmal füllen
 
Hab hier grad mal ne Routine geschrieben, die ein String-Array mit Werten befüllt:

Delphi-Quellcode:
procedure FillArray(var AArray : array of string; const AValues : array of string);
var i1 : integer;
var i2 : integer;
begin
     //--
     i1 := Low(AArray);
     i2 := Low(AValues);
     //
     while (i1 <= High(AArray)) and (i2 <= High(AValues)) do
     begin
          AArray[i1] := AValues[i2];
          //
          i1 := i1 + 1;
          i2 := i2 + 1;
     end;
end;
Beispiel-Aufruf:

Delphi-Quellcode:
FillArray(ZuBefuellendesArray,['5','5','4']);


Am besten ist es dabei, wenn beide Arrays gleich groß sind. Man kann das ganze auch mit einem Dynamischen Array machen, dann könnte man in der Routine vorher per SetLength die Länge des zu befüllenden Arrays setzen und an die Anzahl der zu speichernden Werte anpassen.

mfg

Hawkeye219 18. Jan 2011 21:03

AW: Array mit mehreren Strings auf einmal füllen
 
Hallo,

mit etwas weniger Schreibaufwand geht es so:
Delphi-Quellcode:
uses Types;

var
  A: TStringDynArray;
begin
  A := TStringDynArray.Create('a', 'b', 'c', 'd', 'e', 'f');
end;
Gruß Hawkeye

Klaus01 18. Jan 2011 21:08

AW: Array mit mehreren Strings auf einmal füllen
 
.. TStringDynArray kennt Delphi 2006 noch nicht,
ob das bei Delphi 2007 der Fall ist - keine Ahnung.

Grüße
Klaus

mkinzler 18. Jan 2011 21:10

AW: Array mit mehreren Strings auf einmal füllen
 
Gab es den nicht schon vorher?
http://www.delphipraxis.net/186083-post3.html

Klaus01 18. Jan 2011 21:15

AW: Array mit mehreren Strings auf einmal füllen
 
Zitat:

Zitat von mkinzler (Beitrag 1075666)
Gab es den nicht schon vorher?
http://www.delphipraxis.net/186083-post3.html

.. hatte vorhin "nur" in die Hilfe geschaut (da wird nichts gefunden).
Verwenden kann man es. :?:

Grüße
Klaus

Mike_ 18. Jan 2011 21:17

AW: Array mit mehreren Strings auf einmal füllen
 
Zitat:

Zitat von patti (Beitrag 1075646)
Handelt es sich bei den Strings um Konstanten? Wenn ja, dann kannst du das Array sofort als Konstante definieren und an dieser Stelle einfach befüllen...

Danke, das ist ein guter Ansatz.

http://rvelthuis.de/articles/articles-openarr.html

Es funktioniert so auch und ist auf jeden Fall besser als die alte Methode :thumb:


Allerdings ist es immer noch nicht optimal... denn es wird mir der Speicher etwas zugemüllt, obwohl ich gewisse Arrays nicht nutze.
_____

Dazu eine etwas weiterführende Erklärung:

Programm wird mit Parametern gestartet.
Je nach Parameter durchläuft er eine andere Routine.

Jetzt müsste ich für jeden Parameter der mitgegeben wird ein eigenes Array basteln mit den vorgegebenen Konstanten.

Hier ein Beispiel:

Delphi-Quellcode:
[...]

const
    ArrayOfFiles1: array[1..12] of String = (ab, ac, ad, ab, gs, hw,
                                       qa, jq, wh, hw, qa, hw);
    ArrayOfFiles2: array[1..12] of String = (ab, ac, ad, ab, gs, hw,
                                       qa, jq, wh, hw, qa, hw);
    ArrayOfFiles3: array[1..12] of String = (ab, ac, ad, ab, gs, hw,
                                       qa, jq, wh, hw, qa, hw);

[...]

procedure TForm1.XX;
[...]
begin

[...]
  if ParamStr(1) = 'aa' then
  begin

[...]

    for i := 0 to Length(ArrayOf2CopyFiles1) do
    begin
      AndereProzedurVonMir(ArrayOf2CopyFiles[i]);
    end;
  end

  if ParamStr(1) = 'bb' then
  begin
[...]
    for i := 0 to Length(ArrayOf2CopyFiles2) do
    begin
      AndereProzedurVonMir(ArrayOf2CopyFiles2[i]);
    end;
  end;
end;
Gibt es nicht die Möglichkeit ein Array festzulegen, welches ich mit einer Zeile Code (Nämlich je nachdem welcher Parameter dem Programm mitgegeben wurde) füllen kann ?

Denn mit der jetzigen Methode würde er die Constanten immer in den Speicher schreiben, auch wenn er gar nicht drauf zugreift bzw. diese gar nicht braucht
(Und ich hätte > 20 Arrays, obwohl ich zur Laufzeit immer nur ein Einzige (!) benötige.)


EDIT1://
Ich war nicht mal mit dem Schreiben fertig, schon mehr als 4 Antworten zwischenzeitlich, der Hammer :-D

Danke für die Function Patty.

EDIT2://
StringDynArray ist genau das, was ich gesucht habe, fabelhaft ! :D
Klappt genau wie in deinem Beispiel :P

Wäre super wenn du mir sagst wie man auf so etwas kommen kann, wenn man es nicht kennt. (Ich suche meist 30min - 2 Std bevor ich eine Frage stelle, allerdings scheint meine Google suche nicht optimal zu sein... könnte man auch "so", auf die Antwort stoßen durch eine optimierte Suche wo anders ?

EDIT3://
Komme gar nicht zum abschicken, bei mir erscheint immer nur "Zwischenzeitlich sind neue Beiträge geschrieben worden."
:thumb:

Edit4://
Ich komme wirklich nicht zum abschicken des Posts...
"Zwischenzeitlich sind neue Beiträge geschrieben worden."

Ich kann nicht mehr :lol:

Edit5://
Jetzt hat das abschicken geklappt :)

Hawkeye219 18. Jan 2011 21:52

AW: Array mit mehreren Strings auf einmal füllen
 
Mike,

nach dem Array-Konstruktor habe ich gar nicht gesucht, ich bin eher zufällig in der Hilfedatei darüber gestolpert. Das müsste noch zu D2006-Zeiten gewesen sein.
Wertvolle Informationen erhält man auch beim Lesen von Blogs. Eine gute Startadresse ist DelphiFeeds.com.

Gruß Hawkeye

Klaus01 19. Jan 2011 07:45

AW: Array mit mehreren Strings auf einmal füllen
 
Guten Morgen,

dies hier, könnte vielleicht noch mit Hilfe einer Ini Datei vereinfacht werden:
Delphi-Quellcode:
c
onst
    ArrayOfFiles1: array[1..12] of String = (ab, ac, ad, ab, gs, hw,
                                       qa, jq, wh, hw, qa, hw);
    ArrayOfFiles2: array[1..12] of String = (ab, ac, ad, ab, gs, hw,
                                       qa, jq, wh, hw, qa, hw);
    ArrayOfFiles3: array[1..12] of String = (ab, ac, ad, ab, gs, hw,
                                       qa, jq, wh, hw, qa, hw);

[...]

procedure TForm1.XX;
[...]
begin

[...]
  if ParamStr(1) = 'aa' then
  begin

[...]

    for i := 0 to Length(ArrayOf2CopyFiles1) do
    begin
      AndereProzedurVonMir(ArrayOf2CopyFiles[i]);
    end;
  end

  if ParamStr(1) = 'bb' then
  begin
[...]
    for i := 0 to Length(ArrayOf2CopyFiles2) do
    begin
      AndereProzedurVonMir(ArrayOf2CopyFiles2[i]);
    end;
  end;
end;
Delphi-Quellcode:

var
 iniFile: TIniFile;
 fileList: TStringList;

...
begin
  // ...
  try
    iniFile := TiniFile.create(PathToIniFile);
    fileList := TStringList.create;
    fileList.delimetedText := iniFile.ReadString(Paramstr(1),'FileList','');
    for i:=0 to fileList.count -1 do
      AndereProzedurVonMir(fileList[i]);
  finally
    iniFile.free;
    fileList.free;
  end;
  // ...
end;
Wobei der Aufbau der Ini-Datei dann so aussehen müsste:
Code:
[aa]
  FileList=aa bb cc dd ee ff gg
[bb]
  FileList=ab bc cd de ef fg gh
[cc]
  ...
.. nur mal so ein Gedanke

Grüße
Klaus

Mike_ 19. Jan 2011 21:27

AW: Array mit mehreren Strings auf einmal füllen
 
Zitat:

Zitat von Klaus01 (Beitrag 1075729)
Guten Morgen,

dies hier, könnte vielleicht noch mit Hilfe einer Ini Datei vereinfacht werden:
Delphi-Quellcode:
c
onst
    ArrayOfFiles1: array[1..12] of String = (ab, ac, ad, ab, gs, hw,
                                       qa, jq, wh, hw, qa, hw);
    ArrayOfFiles2: array[1..12] of String = (ab, ac, ad, ab, gs, hw,
                                       qa, jq, wh, hw, qa, hw);
    ArrayOfFiles3: array[1..12] of String = (ab, ac, ad, ab, gs, hw,
                                       qa, jq, wh, hw, qa, hw);

[...]

procedure TForm1.XX;
[...]
begin

[...]
  if ParamStr(1) = 'aa' then
  begin

[...]

    for i := 0 to Length(ArrayOf2CopyFiles1) do
    begin
      AndereProzedurVonMir(ArrayOf2CopyFiles[i]);
    end;
  end

  if ParamStr(1) = 'bb' then
  begin
[...]
    for i := 0 to Length(ArrayOf2CopyFiles2) do
    begin
      AndereProzedurVonMir(ArrayOf2CopyFiles2[i]);
    end;
  end;
end;
Delphi-Quellcode:

var
 iniFile: TIniFile;
 fileList: TStringList;

...
begin
  // ...
  try
    iniFile := TiniFile.create(PathToIniFile);
    fileList := TStringList.create;
    fileList.delimetedText := iniFile.ReadString(Paramstr(1),'FileList','');
    for i:=0 to fileList.count -1 do
      AndereProzedurVonMir(fileList[i]);
  finally
    iniFile.free;
    fileList.free;
  end;
  // ...
end;
Wobei der Aufbau der Ini-Datei dann so aussehen müsste:
Code:
[aa]
  FileList=aa bb cc dd ee ff gg
[bb]
  FileList=ab bc cd de ef fg gh
[cc]
  ...
.. nur mal so ein Gedanke

Grüße
Klaus

Klaus,

bist du ein Hellseher ?
Genau das hatte ich heute vor einzubauen und du lieferst gleich noch den Quellcode mit.

Fabelhaft ! :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz