Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Index von TStringDynArray auswählen (https://www.delphipraxis.net/33611-index-von-tstringdynarray-auswaehlen.html)

TheMiller 9. Nov 2004 22:11


Index von TStringDynArray auswählen
 
Ich habe da mal wieder eine Frage...:

und zwar trenne ich einen String mit Explode und lasse die einzelnen Strings in einer Listview eintragen. Das funzt auch alles prima. Doch wenn in meiner SQL-Abfrage mehr als ein Datensatz ausgegeben wird, dann werden die Strings zwar getrennt, aber nicht oderntlich eingetragen, da das Array mit allen Datensätzen gefüllt ist und ich es nicht schaffe mit einer Schleife einen Index aus dem Array wählen kann...

Hier mal Code:

Delphi-Quellcode:
function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray;
var
  SepLen: Integer;
  F, P: PChar;
  ALen, Index: Integer;
begin
  SetLength(Result, 0);
  if (S = '') or (Limit < 0) then Exit;
  if Separator = '' then
  begin
    SetLength(Result, 1);
    Result[0] := S;
    Exit;
  end;
  SepLen := Length(Separator);
  ALen := Limit;
  SetLength(Result, ALen);

  Index := 0;
  P := PChar(S);
  while P^ <> #0 do
  begin
    F := P;
    P := AnsiStrPos(P, PChar(Separator));
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F);
    if Index >= ALen then
    begin
      Inc(ALen, 5);
      SetLength(Result, ALen);
    end;
    SetString(Result[Index], F, P - F);
    Inc(Index);
    if P^ <> #0 then Inc(P, SepLen);
  end;
  if Index < ALen then SetLength(Result, Index);
end;
Delphi-Quellcode:
  ListView1.Clear;
  Timer1.Enabled:=True;
  sl := TStringList.Create;
  sl.Add('$db_server='+Edit1.Text);
  sl.Add('$db_name='+Edit2.Text);
  sl.Add('$db_user='+Edit3.Text);
  sl.Add('$db_passwort='+Edit4.Text);
  sl.Add('$Datum='+DateToStr(DateTimePicker1.Date) +',');
  sl.Add('$Zeit=08:00' +',');
  sl.Add('$mode=read');

  try
   StrArry := Explode(',', idhttp1.Post('http://xxxxx.com/xxx.php',sl), 0);
   // Hier müsste doch per Schleife der Index des Arrays ausgewählt werden. Habe mit Array kaum Erfahrung..
    ListView1.Items.Add;
    ListView1.Items[ListView1.Items.Count-1].Caption:=StrArry[0];
    with ListView1.Items[ListView1.Items.Count-1].SubItems do begin
     Add(StrArry[1]);
     Add(StrArry[2]);
     Add(StrArry[3]);
     Add(StrArry[4]);
    end;
    sl.Clear;
    end;
    except
    end;
danke im vorraus

Sprint 9. Nov 2004 22:19

Re: Index von TStringDynArray auswählen
 
Delphi-Quellcode:
var
  I: Integer;

  ...

  for I := 0 to High(StrArry) do
  begin
    // AddToListView(StrArry[I])
  end;

  ...

TheMiller 9. Nov 2004 22:21

Re: Index von TStringDynArray auswählen
 
ja, aber ich habe noch 4 SubItems. Wie bringe ich die unter?

Sprint 9. Nov 2004 22:24

Re: Index von TStringDynArray auswählen
 
Zitat:

Zitat von DJ-SPM
ja, aber ich habe noch 4 SubItems. Wie bringe ich die unter?

Ich verstehe deine Frage irgendwie nicht.

TheMiller 9. Nov 2004 22:28

Re: Index von TStringDynArray auswählen
 
Also, ich habe in der ListView eine Caption, die aus dem Array mit dem Datum gefüllt wird. Die SubItems Zeit, Person, Wert sollen auch aus dem Array in die ListView eingetragen werden. Und zwar in die SubItems.

Sprint 9. Nov 2004 23:01

Re: Index von TStringDynArray auswählen
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  StrArry: TStringDynArray;
  I: Integer;
begin

  // Anstatt von Explode
  SetLength(StrArry, 12);
  StrArry[0] := 'Datum1'; StrArry[1] := 'Zeit1'; StrArry[2] := 'Person1'; StrArry[3] := 'Wert1';
  StrArry[4] := 'Datum2'; StrArry[5] := 'Zeit2'; StrArry[6] := 'Person2'; StrArry[7] := 'Wert2';
  StrArry[8] := 'Datum3'; StrArry[9] := 'Zeit3'; StrArry[10] := 'Person3'; StrArry[11] := 'Wert3';
  // ---

  I := 0;
  while I < High(StrArry) do
  begin
    with ListView1.Items.Add do
    begin
      Caption := StrArry[I];
      SubItems.Add(StrArry[I + 1]);
      SubItems.Add(StrArry[I + 2]);
      SubItems.Add(StrArry[I + 3]);
    end;
    Inc(I, 4);
  end;

end;

TheMiller 10. Nov 2004 15:26

Re: Index von TStringDynArray auswählen
 
Nein, das geht nicht.

Also mal ganz detailliert:

Ich habe eine SQL-DB. Mit meinem Programm rufe ich aus der Tabelle Daten aus den Spalten "Datum, Zeit, Person, Wert" ab. Diese Werte sind durch ein "," getrennt. Der PHP-Script macht die Abfrage und ich bekomme durch idhttp den durch Kommata getrennten Wert zurück.

Delphi-Quellcode:
11.11.2004,14:00,A,X
Dieser wird mit Explode getrennt und in ein dynamisches Array (TStringDynArray) eingetragen. Dann sage ich meinem Programm, er möge die Werte in eine ListView mit SubItems eintragen.

Das funzt auch prima.

Doch wenn ich jetzt am 11.11.2004 mehrere Datensätze habe, sagen wir mal zwei, ruft er auch diese zwei ab, da die Abfrage nach Datum geht. Dann habe ich also:

Delphi-Quellcode:
11.11.2004,14:00,A,X,11.11.2004,17:20,B,Y
Und hier ist der Knackpunkt! Ich muss also das Array mit den 4 Werten füllen, in die ListView eintragen lassen, das nächste Item aus dem Array wählen und die ListView ergänzen.

Jetzt ist mir aber gerade eingefallen, dass ich auch, da ich ja immer 4 Werte habe, ein "normales" Array verwende, in das ich die Daten eintrage... Würde das gehen?

Ich hoffe, ihr versteht jetzt, was ich meine. Ich komme dabei absolut nicht weiter... :wall:

Sprint 10. Nov 2004 16:31

Re: Index von TStringDynArray auswählen
 
Zitat:

Zitat von DJ-SPM
Und hier ist der Knackpunkt! Ich muss also das Array mit den 4 Werten füllen, in die ListView eintragen lassen, das nächste Item aus dem Array wählen und die ListView ergänzen.

Geht doch so wie ich es geschrieben habe.

TheMiller 10. Nov 2004 16:35

Re: Index von TStringDynArray auswählen
 
Ja, aber ich weiß doch nicht, wie viele Datensätze unter dem 11.11.2004 eigetragen sind. Können 2 aber auch 20 sein. Du meinst doch diesen Code, oder?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  StrArry: TStringDynArray;
  I: Integer;
begin

  // Anstatt von Explode
  SetLength(StrArry, 12);
  StrArry[0] := 'Datum1'; StrArry[1] := 'Zeit1'; StrArry[2] := 'Person1'; StrArry[3] := 'Wert1';
  StrArry[4] := 'Datum2'; StrArry[5] := 'Zeit2'; StrArry[6] := 'Person2'; StrArry[7] := 'Wert2';
  StrArry[8] := 'Datum3'; StrArry[9] := 'Zeit3'; StrArry[10] := 'Person3'; StrArry[11] := 'Wert3';
  // ---

  I := 0;
  while I < High(StrArry) do
  begin
    with ListView1.Items.Add do
    begin
      Caption := StrArry[I];
      SubItems.Add(StrArry[I + 1]);
      SubItems.Add(StrArry[I + 2]);
      SubItems.Add(StrArry[I + 3]);
    end;
    Inc(I, 4);
  end;

end;

Sprint 10. Nov 2004 16:48

Re: Index von TStringDynArray auswählen
 
Zitat:

Zitat von DJ-SPM
Ja, aber ich weiß doch nicht, wie viele Datensätze unter dem 11.11.2004 eigetragen sind. Können 2 aber auch 20 sein.

Wenn das deine Daten sind ...
Code:
11.11.2004,14:00,A,X,11.11.2004,17:20,B,Y
Soll das Ergebnis in deiner ListView so aussehen?
Code:
| 11.11.2004 | 14:00 | A | X |
| 11.11.2004 | 17:20 | B | Y |
| ...       |       |   |   |

TheMiller 10. Nov 2004 16:49

Re: Index von TStringDynArray auswählen
 
Ja, soll es.

Sprint 10. Nov 2004 17:18

Re: Index von TStringDynArray auswählen
 
Und wo liegt jetzt dein Problem?

TheMiller 10. Nov 2004 17:23

Re: Index von TStringDynArray auswählen
 
Hi Sprint,

also, mein Problem liegt darin, dass ich nicht weiß, die ich die Daten aus der idhttp-Komponente in das Array bekomme und dein Arry statis ist. Du gibts ihm eine feste länge. Dabei weiß ich doch garnicht, wie viele Einträge in der Datenbank stehen...

Also, ich rufe mittels

Delphi-Quellcode:
idhttp1.Post('http://www.xxx.com/xxx.php',sl)
die Daten ab. Wie kommen die jetzt, in dein array? Wie wähle ich die größe? Habe bisher kaum mit Arrays gearbeitet. Verzeihe mir *anfleh*
Ich blicke da nicht so durch...

Sprint 11. Nov 2004 00:36

Re: Index von TStringDynArray auswählen
 
Zitat:

Zitat von DJ-SPM
mein Problem liegt darin, dass ich nicht weiß, die ich die Daten aus der idhttp-Komponente in das Array bekomme

Mit der Funktion Explode. Die du doch selber gepostet hast. :!:
Zitat:

und dein Arry statis ist.
Das war nur zu Testzwecken, damit ich sehen konnte ob mein Code funktioniert.
Zitat:

Du gibts ihm eine feste länge. Dabei weiß ich doch garnicht, wie viele Einträge in der Datenbank stehen...
Mit High(StrArry) ermittelst du die Länge des Array's.
Zitat:

Wie kommen die jetzt, in dein array?
Immer noch mit der Funktion Explode die du gepostet hast.
Zitat:

Wie wähle ich die größe?
Dynamische Array's (also der Rückgabewert von Explode) fangen immer bei null an. Die Länge ermittelst du mit High.
Zitat:

Habe bisher kaum mit Arrays gearbeitet.
Dann schau doch mal in die Hilfedatei von Delphi.
Zitat:

Ich blicke da nicht so durch...
Dafür ist ja das Forum da, damit du Fragen kannst.

Eine Frage noch. Sieht der Rückgabewert der Funktion Post (idHTTP) wirklich so aus, wie du es gepostet hast?

TheMiller 11. Nov 2004 07:37

Re: Index von TStringDynArray auswählen
 
OK,

danke für die ausführliche Antwort. Dann werde ich es mal so ausprobieren. Das, was mich verwirrt hat, war, dass du im Code "anstatt von Explode" geschrieben hast...

Nagut, wenn's nicht klappt, oder ich zu dusselig bin, melde ich mich wieder (einmal)...

EDIT: Um auf deine Frage zu antworten: Ja, der rückgabewert von idHttp sieht wirklich so aus!

:hi:

Bye

TheMiller 11. Nov 2004 15:40

Re: Index von TStringDynArray auswählen
 
...Verdammt....

das funzt ja wirklich! Also, Sprint... Alle Achtung! Big big thx!!! :firejump: :bouncing4: :bounce1:

Dann kann ich ja endlich weitermachen!!!

Nochmal danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 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