Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array vom Inhalt einer Listbox (https://www.delphipraxis.net/95751-array-vom-inhalt-einer-listbox.html)

Testy 12. Jul 2007 14:59


Array vom Inhalt einer Listbox
 
Hallo an Alle!

Ich habe eine gefüllte Listbox (im Zahlenformat TDateTime z.B. "00:13:34").
Nun möchte ich den Inhalt der Listbox in ein Array einlesen lassen. Aber ich habe keine Ahnung welchen Datentyp ich dafür nehmen soll?!
Delphi-Quellcode:
time:array[1..100] of TDateTime;
So geht's wohl anscheinend nicht!

Und meine zweite Frage ist, wenn ich das Array mit den Daten habe, dann soll er mir in einer Schleife z.B. die ersten 30 Einträge zusammen addieren!

Danke im voraus!

Gruß!

mkinzler 12. Jul 2007 15:04

Re: Array vom Inhalt einer Listbox
 
Grundsätzlich schon, man darf halt nur keine reservierten Wörter (time) verwenden:
Delphi-Quellcode:
zeiten:array[1..100] of TDateTime;

Testy 12. Jul 2007 15:10

Re: Array vom Inhalt einer Listbox
 
Wenn ich dann aber das Array füllen möchte mit:
Delphi-Quellcode:
for i:=1 to listbox1.Count-1 do
begin
zeiten[i]:=memo1.Lines[i];
end;
Dann kommt immer der Fehler: Inkompatible Typen: 'TDateTime' und 'String'


Gruß!

Tormentor32 12. Jul 2007 15:13

Re: Array vom Inhalt einer Listbox
 
Hier im Forum suchenStrToDateTime

Testy 12. Jul 2007 15:23

Re: Array vom Inhalt einer Listbox
 
Sorry, hatte einen Fehler. Ich meinte natürlich nicht das Memo sondern:
Delphi-Quellcode:
for i:=1 to listbox1.Count-1 do
begin
zeiten[i]:=strtoTime(listbox2.Items[i]);
end;
Jetzt gehts erst einmal von der Syntax. Aber nun schreibt er: Listenindex überschreitet das Maximum (59)!

"zeiten" ist meine globale Variable

Delphi-Quellcode:
 zeiten:array[1..200] of TDateTime;

Gruß!

Testy 12. Jul 2007 15:25

Re: Array vom Inhalt einer Listbox
 
Hat sich erledigt. Habe den Fehler selber gefunden!
Habe jetzt nur noch die Frage, wie kann ich z.B. die ersten 30 Einträge in dem Array zusammen addieren kann!
Möglichst mit einer Schleife!

Tormentor32 12. Jul 2007 15:27

Re: Array vom Inhalt einer Listbox
 
Anmerkung: Das erste Item der Listbox hat den Index 0, so übergehst du immer das erste Item!

Zu deinem Fehler:
Delphi-Quellcode:
for i:=1 to listbox1.Count-1 do //Listbox 1
begin
zeiten[i]:=strtoTime(listbox2.Items[i]); //Listbox 2
end;
Edit: Habs abgesendet wegen dem Tipp
Delphi-Quellcode:
for i := 1 to 30 do
  myDoubleVariable := myDoubleVariable+Zeiten[i]

Testy 12. Jul 2007 15:35

Re: Array vom Inhalt einer Listbox
 
Irgendwie funtkioniert es noch nicht so!
Ich habe jetzt:
Delphi-Quellcode:
for i:=0 to listbox2.Count-1 do
begin
zeiten[i]:=strtoTime(listbox2.Items[i]);
end;
Wenn ich das Array auslese kommt nur unsinniges bei raus!

Gruß!

xZise 12. Jul 2007 16:23

Re: Array vom Inhalt einer Listbox
 
1. Wenn du Zeiten
Delphi-Quellcode:
[1..100]
deklarierst dann solltest du auch auf 1+ zugreifen. Du greifst aber ab 0 drauf zu
2. Hat die Listbox auch 100 einträge?

Chemiker 12. Jul 2007 16:45

Re: Array vom Inhalt einer Listbox
 
Hallo Testy,

Du muss die Deklaration vom Array ändern, oder die For-Schleife :

Delphi-Quellcode:
time:array[0..99] of TDateTime;    // nicht [1..100]
oder das einlesen ändern:

Delphi-Quellcode:
for i:=0 to listbox2.Count-1 do  
begin
  zeiten[i+1]:=strtoTime(listbox2.Items[i]);  // nicht zeiten[i] = 0 
end;
Bis bald Chemiker

marabu 12. Jul 2007 17:04

Re: Array vom Inhalt einer Listbox
 
Hallo,

die Einträge einer ListBox sind zahlenmäßig nicht festgelegt. Wenn dann ein Array als Speicherstruktur herhalten soll, dann ist da ein dynamisches Array sehr vorteilhaft:

Delphi-Quellcode:
function StrToTimeArray(s: TStrings): TDoubleDynArray;
var
  index: Integer;
begin
  SetLength(Result, s.Count);
  for index := Low(Result) to High(Result) do
    Result[index] := StrToTime(s[index]);
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  dda: TDoubleDynArray;
  total: Double;
begin
  dda := StrToTimeArray(RichEdit.Lines);
  total := Math.Sum(Copy(dda, 0, 3));
  ShowMessage(TimeToStr(total));
end;
Grüße vom marabu

Testy 12. Jul 2007 17:06

Re: Array vom Inhalt einer Listbox
 
Ich habe es jetzt so:

Delphi-Quellcode:
  zeiten:array[1..300] of TDateTime;
Delphi-Quellcode:
for i:=1 to listbox2.Count-1 do
begin
zeiten[i]:=strtotime(listbox2.Items[i-1]);
end;
Uns so geht es auch!

Zitat:

2. Hat die Listbox auch 100 einträge?
Das ist noch das Problem! Weil die Listbox immer eine andere Anzahl von Einträgen hat! Habe mal was von variablen Arrays gehört. Wie kann ich das machen, wenn ich dir Größe nicht vorher weiss.
Danke für die Mühe!!!!

Gruß!

DeddyH 12. Jul 2007 17:24

Re: Array vom Inhalt einer Listbox
 
Siehe #11 :-D (marabu war schneller)

Testy 12. Jul 2007 17:41

Re: Array vom Inhalt einer Listbox
 
Wie funktioniert das von marabu!? Kann dort mit vielen Befehlen nicht viel anfangen!
Gibt es nichts einfacheres? Wo man z.B. die obere Grenze eines Arrays mit listbox1.count-1 festlegen kann.

Gruß!

DeddyH 12. Jul 2007 17:48

Re: Array vom Inhalt einer Listbox
 
Die Größe legst Du mit SetLength() fest. Ansonsten sag doch mal, was Du nicht verstehst.

Testy 12. Jul 2007 17:52

Re: Array vom Inhalt einer Listbox
 
Ich verstehe nicht was die Function macht! Wo liest sie die Daten aus der Listbox ein?
Und in der Procedure:
Delphi-Quellcode:
  dda := StrToTimeArray(RichEdit.Lines);
  total := Math.Sum(Copy(dda, 0, 3));
Was wird da zusammen addiert?

Kann ich das nicht einfach dann so machen:
Delphi-Quellcode:
SetLength(listbox1.count-1)
????

Gruß!

DeddyH 12. Jul 2007 17:59

Re: Array vom Inhalt einer Listbox
 
Ich habe Dir mal ein sinnfreies Beispiel erstellt:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  //Dynamisches Array als Datentyp definieren
  TDynArray = array of TDateTime;

  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    //Als Objektvariable definieren
    DynArray: TDynArray;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
  //Benötigte Größe setzen
  SetLength(DynArray,ListBox1.Items.Count);
  //Array füllen
  for i := 0 to ListBox1.Items.Count - 1 do
    DynArray[i] := StrToTime(ListBox1.Items[i]);
end;

end.

marabu 12. Jul 2007 18:02

Re: Array vom Inhalt einer Listbox
 
Hallo,

RichEdit.Lines hat den gleichen Typ wie ListBox.Items - man kann die beiden also austauschen.

Freundliche Grüße

DeddyH 12. Jul 2007 18:06

Re: Array vom Inhalt einer Listbox
 
Hi marabu,

falls Du mich damit meinst: das ist mir schon bekannt, aber ich wollte es für den Fragesteller etwas einfacher machen. :wink:

Testy 12. Jul 2007 18:09

Re: Array vom Inhalt einer Listbox
 
Habe einen Fehler: "Im Projekt ist eine Exception der Klasse EAccesViolation aufgetreten. Meldung: Zugriffsverletzung bei Adresse...."
Und markiert wird dann anschließend diese Zeile hier:
Delphi-Quellcode:
DynArray[i] := StrToTime(ListBox2.Items[i]);
Gruß!

DeddyH 12. Jul 2007 18:15

Re: Array vom Inhalt einer Listbox
 
Versteh ich nicht. Welche Delphi-Version hast Du denn?

mkinzler 12. Jul 2007 18:17

Re: Array vom Inhalt einer Listbox
 
Welchen Wert hat den dann i?

DeddyH 12. Jul 2007 18:17

Re: Array vom Inhalt einer Listbox
 
Hast Du evtl. bei SetLength ListBox1 stehen?

Testy 12. Jul 2007 18:35

Re: Array vom Inhalt einer Listbox
 
Soooo, nun geht's! Ich hatte die Objektvariable nicht im PrivateTeil drin stehen! Nochmals vielen Dank!
Habe nun eine Schleife in der ich den Inhalt zusammen zähle:
Delphi-Quellcode:
  for i:=1 to zaehler do
    begin
      gesamtzeit:=gesamtzeit+DynArray[i-1];
Warum muss ich eigentlich unten nochmal i-1 schreiben? Ansonsten kommt ein falsches Ergebnis raus!

Trotzdem, nochmal vielen Dank!

Gruß!

DeddyH 12. Jul 2007 18:38

Re: Array vom Inhalt einer Listbox
 
Ein dynamisches Array beginnt immer mit dem Index 0 und endet mit dem Index Anzahl_der_Elemente - 1.

Testy 12. Jul 2007 18:39

Re: Array vom Inhalt einer Listbox
 
Ja schon klar, aber wieso geht das denn nicht:
Delphi-Quellcode:
for i:=0 to zaehler do
    begin
      gesamtzeit:=gesamtzeit+DynArray[i];
Kommt jedenfalls ein falsches Ergebnis raus!

DeddyH 12. Jul 2007 18:41

Re: Array vom Inhalt einer Listbox
 
Welcher Wert steht denn in Zaehler?

Testy 12. Jul 2007 18:50

Re: Array vom Inhalt einer Listbox
 
Im Moment steht er auf 40! Also es werden 40 Zeiten aus meiner Listbox in das Array geschrieben und dann zusammen addiert!

DeddyH 12. Jul 2007 18:56

Re: Array vom Inhalt einer Listbox
 
Dann ist das klar. Ich habe doch eben gesagt: das erste Element des Arrays hat Index 0 und das Letzte Index Anzahl - 1, Du liest also über das Array-Ende hinaus. Erstaunlich, dass das keine AV gab.

Testy 12. Jul 2007 19:03

Re: Array vom Inhalt einer Listbox
 
Ahhh, Danke, jetzt habe ich es auch verstanden! Wie rum ist es denn nun besser, oder ist es egal!

Delphi-Quellcode:
  for i:=1 to zaehler do
    begin
      gesamtzeit:=gesamtzeit+DynArray[i-1];
Oder:
Delphi-Quellcode:
  for i:=0 to zaehler-1 do
    begin
      gesamtzeit:=gesamtzeit+DynArray[i];
Beides führt zum richtigen Ergebnis!

DeddyH 12. Jul 2007 19:11

Re: Array vom Inhalt einer Listbox
 
Am Besten wäre es so, wie marabu bereits geschrieben hatte, dann sind Indexfehler ausgeschlossen:
Delphi-Quellcode:
for i := Low(DynArray) to High(DynArray) do
  gesamtzeit := gesamtzeit + DynArray[i];
Schau mal die beiden Funktionen High und Low in der Hilfe nach.

Testy 12. Jul 2007 19:18

Re: Array vom Inhalt einer Listbox
 
:shock: Habe mir deins und marabu's nochmal angeschaut. Aber wie definier ich nun low und high für mein Beispiel?

mkinzler 12. Jul 2007 19:21

Re: Array vom Inhalt einer Listbox
 
So wie DeddyH geschrieben hat ;-)

Testy 12. Jul 2007 19:26

Re: Array vom Inhalt einer Listbox
 
Zitat:

Zitat von mkinzler
So wie DeddyH geschrieben hat ;-)

Wenn ich das so 1:1 übernehme, dann bekomme ich als Ergebnis 0 heraus!

mkinzler 12. Jul 2007 19:28

Re: Array vom Inhalt einer Listbox
 
Lass dir mal Low( DynArray) und High( DyArray) anzeigen

Testy 12. Jul 2007 19:33

Re: Array vom Inhalt einer Listbox
 
Zitat:

Zitat von mkinzler
Lass dir mal Low( DynArray) und High( DyArray) anzeigen

Low( DynArray) = 0
High( DyArray) = 59

mkinzler 12. Jul 2007 19:37

Re: Array vom Inhalt einer Listbox
 
Dann wundert es mich wirklich das 0 rauskonmmt :gruebel:

Testy 12. Jul 2007 19:44

Re: Array vom Inhalt einer Listbox
 
Jetzt habe ich es hinbekommen! Hatte noch einen Fehler drin! Mein Array war immer so groß wie die Listbox, es sollte aber nur so groß wie mein Zähler sein! Nun geht es mit low und high!


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