Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi editbox Text aus Listbox beziehen (https://www.delphipraxis.net/113078-editbox-text-aus-listbox-beziehen.html)

Serpentine 2. Mai 2008 10:53


editbox Text aus Listbox beziehen
 
Hi ich habe ein Programm geschrieben, was beim starten eine listbox aus einer datei lädt und den darin enthaltenen Text in eine Editbox übergibt.
Beim starten des Programms erhalte ich aber den Fehler dass der Listenindex überschritten wird.
Ich kann mir das gar nicht erklären und bitte um Hilfe^^

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Edit1: TEdit;
    Button1: TButton;
    XPManifest1: TXPManifest;
    Button2: TButton;
    Label1: TLabel;
    Button3: TButton;
    Label2: TLabel;
    Edit2: TEdit;
    ListBox2: TListBox;
    procedure FormDestroy(Sender: TObject);
    procedure Edit2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  type
feldtyp = array[0..5000] of integer;

var
  Form1: TForm1;
  f:feldtyp;
  index:integer;



implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
index:=0;
if fileexists(edit2.text+'.array') then
listbox1.items.loadfromfile(edit2.text+'.array');
if fileexists('settings.ini') then
listbox2.items.loadfromfile('settings.ini');
edit2.Text:=listbox2.items.strings[listbox2.itemindex];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
f[index]:=strtoint(edit1.text);
listbox1.items.add(edit1.Text);
edit1.text:='';
label1.caption:='Bis jetzt wurden '+inttostr(index+1)+' Zahlen aufgenommen.';
index:=index+1;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
a,i,j:integer;
begin
for i:=1 to index do
begin
     for j:= index downto i do
     begin
          if f[j] < f[j-1] then
          begin
               a := f[j-1];
               f[j-1] :=f[j];
               f[j] := a;
          end;
     end;
end;
listbox1.Items.clear;
for i:=1 to index do begin
listbox1.items.add(inttostr(f[i]));
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
listbox1.items.Clear;
label1.caption:='Bis jetzt wurden 0 Zahlen aufgenommen.';
index:=0;
end;

procedure TForm1.Edit2Click(Sender: TObject);
begin
edit2.Text:='';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
listbox1.Items.savetofile(edit2.Text+'.array');
listbox2.Items.clear;
listbox2.Items.add(edit2.Text);
listbox2.items.SaveToFile('settings.ini');
end;

end.

DeddyH 2. Mai 2008 11:02

Re: editbox Text aus Listbox beziehen
 
Hallo und Willkommen in der DP :dp: ,
versuch es mal so:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  index:=0;
  if fileexists(edit2.text+'.array') then
    listbox1.items.loadfromfile(edit2.text+'.array');
  if fileexists('settings.ini') then
    begin
      listbox2.items.loadfromfile('settings.ini');
      if Listbox2.Items.Count > 0 then
        edit2.Text:=listbox2.items[0];
    end;
end;

Serpentine 2. Mai 2008 11:32

Re: editbox Text aus Listbox beziehen
 
Vielen dank für deine Hilfe^^ aber das Probleme habe ich schon gelöst, war ja auch nicht so schwer. Dafür habe ich jetzt ein neues.
Ich möchte ein Feld aus einer Datei laden. Das Feld soll in der Listbox erscheinen und auch im Array abgespeichert werden, sodass man damit arbeiten kann. Sprich das Feld Sortieren.
Wenn ich das Feld lade dann wird es in der Listbox korrekt angezeigt aber im Array nicht richtig abgespeichert.

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
i:integer;
begin
index:=1;
opendialog1.execute;
listbox1.Items.LoadFromFile(opendialog1.FileName);
for i:=1 to listbox1.items.count do begin
f[i]:=strtoint(listbox1.items.Strings[i-1]);
end;
label1.caption:='Bis jetzt wurden '+inttostr(listbox1.Items.count)+ ' Zahlen aufgenommen.';
end;

hoika 2. Mai 2008 11:35

Re: editbox Text aus Listbox beziehen
 
Hallo,

wie ist denn f definiert ?

Wie sieht f nach der Ziele label1.caption aus ?
Falls es ein array of String ist,
fehlt ein SetLength.

F5, F7, F8 kennst du ?


Zur Einrückunh.


Delphi-Quellcode:
for i:=0 to listbox1.items.count-1 do
begin
  f[i+1]:=strtoint(listbox1.items.Strings[i]);
end;
Normlerweise schreibt man immer := 0 to Count-1


Heiko

DeddyH 2. Mai 2008 11:38

Re: editbox Text aus Listbox beziehen
 
Drei Dinge hab ich nicht ganz verstanden:
- Du solltest prüfen, ob der Opendialog auch ausgeführt und nicht abgebrochen wurde:
Delphi-Quellcode:
if opendialog1.execute then...
- die Listbox wird sortiert (sorted := true), aber das Array nicht? Dann musst Du Dir eine eigene Sortierroutine schreiben.
- Nimm doch besser eine TList statt des Arrays, da gibt es bereits eine Sort-Methode. Außerdem bist Du in der Größe nicht so eingeschränkt wie bei einem statischen Array.

Serpentine 2. Mai 2008 11:52

Re: editbox Text aus Listbox beziehen
 
Ich habe eine eigene Sortierroutine^^
Mh ich denke ich werde mal den kompletten Quellcode posten zum Besseren Verständnis.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Edit1: TEdit;
    Button1: TButton;
    XPManifest1: TXPManifest;
    Button2: TButton;
    Label1: TLabel;
    Button3: TButton;
    Label2: TLabel;
    Edit2: TEdit;
    ListBox2: TListBox;
    Button4: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button4Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Edit2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  type
feldtyp = array[0..5000] of integer;

var
  Form1: TForm1;
  f:feldtyp;
  index:integer;



implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
index:=1;
if fileexists('settings.ini') then begin
listbox2.items.loadfromfile('settings.ini');
edit2.Text:=listbox2.items.strings[0];
end;
if fileexists(edit2.text+'.array') then
listbox1.items.loadfromfile(edit2.text+'.array');
label1.caption:='Bis jetzt wurden '+inttostr(listbox1.Items.count)+ ' Zahlen aufgenommen.';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
f[index]:=strtoint(edit1.text);
listbox1.items.add(edit1.Text);
edit1.text:='';
label1.caption:='Bis jetzt wurden '+inttostr(listbox1.Items.count)+ ' Zahlen aufgenommen.';
index:=index+1;
form1.caption:='Bubblesort - Zahlen aufnehmen';
end;

procedure TForm1.Button2Click(Sender: TObject);
var
a,i,j:integer;
begin
for i:=1 to index-1 do
begin
     for j:= index downto i do
     begin
          if f[j] < f[j-1] then
          begin
               a := f[j-1];
               f[j-1] :=f[j];
               f[j] := a;
          end;
     end;
end;
listbox1.Items.clear;
for i:=2 to index do begin
listbox1.items.add(inttostr(f[i]));
end;
form1.caption:='Bubblesort - Zahlen Sortiert';
label1.caption:='Bis jetzt wurden '+inttostr(listbox1.Items.count)+ ' Zahlen aufgenommen.';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
listbox1.items.Clear;
label1.caption:='Bis jetzt wurden '+inttostr(listbox1.Items.count)+ ' Zahlen aufgenommen.';
index:=1;
form1.caption:='Bubblesort - Bereit';
end;

procedure TForm1.Edit2Click(Sender: TObject);
begin
edit2.Text:='';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
listbox1.Items.savetofile(edit2.Text+'.array');
listbox2.Items.clear;
listbox2.Items.add(edit2.Text);
listbox2.items.SaveToFile('settings.ini');
end;

procedure TForm1.Button4Click(Sender: TObject);
var
i:integer;
begin
index:=1;
if
opendialog1.execute then
listbox1.Items.LoadFromFile(opendialog1.FileName);
else begin
opendialog1.execute;
listbox1.Items.LoadFromFile(opendialog1.FileName);
end;
for i:=0 to listbox1.items.count-1 do
begin
  f[i+1]:=strtoint(listbox1.items.Strings[i]);
end;
label1.caption:='Bis jetzt wurden '+inttostr(listbox1.Items.count)+ ' Zahlen aufgenommen.';
end;

end.
Ich hoffe ihr könnt mir nun besser weiterhelfen.

DeddyH 2. Mai 2008 11:57

Re: editbox Text aus Listbox beziehen
 
Ich komm mit Deinem Index nicht klar, wenn ich ehrlich bin.

Serpentine 2. Mai 2008 12:03

Re: editbox Text aus Listbox beziehen
 
die variable index ist das selbe wie listbox1.items.count nur halt von dem array^^

DeddyH 2. Mai 2008 12:05

Re: editbox Text aus Listbox beziehen
 
Dein Array beginnt aber bei Index 0. Das erste Element wird somit nie angesprochen, wenn ich das richtig gesehen habe.

Serpentine 2. Mai 2008 12:12

Re: editbox Text aus Listbox beziehen
 
stimmt aber ich denke nicht dass es daran liegt oder?

DeddyH 2. Mai 2008 12:19

Re: editbox Text aus Listbox beziehen
 
Also nochmal: die Listbox sortiert automatisch? Dann sollte das Array aber in der selben Reihenfolge befüllt werden, abgesehen vom leeren ersten Element. Zur Not erstell doch mal ein Zip-Archiv mit dem Projekt und hänge es an.

Serpentine 2. Mai 2008 12:29

Re: editbox Text aus Listbox beziehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
nein, ich habe ein sortierverfahren, welches das array sortiert und dann die felder aus dem array in die listbox übergibt.
Das ist eine Aufgabe die ich in der Schule aufbekommen habe^^
Worum es geht ist, dass Zahlen in eine Listbox und gleichzeitig in ein Array eingelesen werden, das Array dann sortiert wird und die Sortierten Zahlen dann in die Listbox übergeben werden.

Das Projekt habe ich angehängt.

DeddyH 2. Mai 2008 12:47

Re: editbox Text aus Listbox beziehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Erstmal zur Sortierung: versuch mal dies
Delphi-Quellcode:
  for i:=1 to index - 1 do
  begin
       for j:= index - 1 downto i + 1 do
       begin
            if f[j] < f[j-1] then
            begin
                 a := f[j-1];
                 f[j-1] :=f[j];
                 f[j] := a;
            end;
       end;
  end;
[edit] Ich habe mal schnell ein neues Projekt erstellt, das IMHO ein wenig strukturierter aufgebaut ist (allerdings ohne Speichern/Laden). Sieh Dir mal den Anhang an. [/edit]

Serpentine 2. Mai 2008 13:47

Re: editbox Text aus Listbox beziehen
 
Echt nett von dir dass du dir die Mühe gemacht hast^^. Aber das mit dem Sortieren bekomme ich auch hin. Mein Problem ist, dass ich ein Array aus einer Datei laden will um dieses dann zu sortieren.

Also

Datei-> Listbox-> Array-> Array sortieren-> Sortiertes Array in Listbox anzeigen

Nur bekomme ich es nicht hin, dass die Listbox in das Array übernommen wird.

DeddyH 2. Mai 2008 13:51

Re: editbox Text aus Listbox beziehen
 
Du kannst Dir die Listbox doch einfach als StringListe abspeichern (Listbox.Items.SaveToFile). Der umgekehrte Weg ist dann:
-Listbox.Items aus Datei laden (Listbox.Items.LoadFromFile)
-in einer Schleife -> Array[Index] = StrToInt(ListBox.Items[Index])

Serpentine 2. Mai 2008 14:06

Re: editbox Text aus Listbox beziehen
 
ja und genau das bekomme ich nicht gebacken^^

Delphi-Quellcode:
for i:=0 to listbox1.items.count-1 do
begin
  f[i+1]:=strtoint(listbox1.items.Strings[i]);
end;
So habe ich es versucht zu lösen, aber die Listbox wird anscheinend nicht richtig ins array übernommen. :gruebel:

DeddyH 2. Mai 2008 14:10

Re: editbox Text aus Listbox beziehen
 
Sicher? Evtl. musst Du nur Deine Variable Index richtig setzen.

Serpentine 2. Mai 2008 14:15

Re: editbox Text aus Listbox beziehen
 
Ja, wenn ich ein Array lade, wird es in der Listbox angezeigt. Klicke ich dann auf sortieren ist die Listbox einfach Leer.

DeddyH 2. Mai 2008 14:19

Re: editbox Text aus Listbox beziehen
 
Bist Du nach dem Sortieren auch den umgekehrten Weg gegangen? In meinem Beispielprojekt funktioniert das jedenfalls ;)

Serpentine 2. Mai 2008 14:31

Re: editbox Text aus Listbox beziehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dein Beispielprojekt besteht aber nur daraus, dass man Zahlen einlesen kann und diese dann sortieren kann.

Ich möchte aber eine Liste aus einer Datei laden (Listbox1.loadformfile)


den inhalt dieser Listbox in ein Array aufnehmen
Delphi-Quellcode:
for i:=0 to listbox1.items.count-1 do
begin
  f[i+1]:=strtoint(listbox1.items.Strings[i]);
end;
dieses Array dann via Bubblesort sortieren

und zuletzt dann den Inhalt des Arrays, welcher sortiert wurde so wieder in die Listbox aufnehmen.


Davon funktioniert bei mir bis jetzt alles, ausser das der Inhalt der Listbox in das Array aufgenommen wird.

Ich hänge nochmal das Projekt an, so weit wie ich bis jetzt gekommen bin.

grenzgaenger 2. Mai 2008 14:51

Re: editbox Text aus Listbox beziehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
häng mal ein beispiel an. sollte die fragen beantworten. <HTH> GG

DeddyH 2. Mai 2008 15:32

Re: editbox Text aus Listbox beziehen
 
Das Problem ist scheinbar, dass Du nicht genau weißt, was Dein Problem ist. Was hat die Ausgabe eines sortierten Arrays denn mit dem Laden aus einer Datei zu tun? Schau Dir mein Beispiel nochmal genau an (d.h. was beim Klick auf den Button "Sortieren" passiert), dann solltest Du klarer sehen.

Serpentine 2. Mai 2008 16:14

Re: editbox Text aus Listbox beziehen
 
Doch grenzgaenger hat mein Problem verstanden und mithilfe seines Quellcodes konnte ich das Programm nun berichtigen. Danke an alle für die Hilfe. :)

DeddyH 2. Mai 2008 16:19

Re: editbox Text aus Listbox beziehen
 
Tja, wenn man richtig gelesen hätte:
Zitat:

Zitat von Beispielprojekt
Delphi-Quellcode:
procedure TfrmSortieren.Synchronisieren;
var i: integer;
begin
  lbZahlen.Items.BeginUpdate;
  lbZahlen.Clear;
  for i := 0 to FIndex - 1 do
    lbZahlen.Items.Add(inttostr(FArray[i]));
  lbZahlen.Items.EndUpdate;
end;


grenzgaenger 2. Mai 2008 20:06

Re: editbox Text aus Listbox beziehen
 
Zitat:

Zitat von Serpentine
Doch grenzgaenger hat mein Problem verstanden und mithilfe seines Quellcodes konnte ich das Programm nun berichtigen. Danke an alle für die Hilfe. :)

tja, da hast du mehr glück gehabt als ich. ich hab nämlich dein programm nicht verstanden und ausserdem bekam ich ständig irgendwelche fehler um die ohren gehauen. deswegen hatte ich etwas gecoded, von dem ich vermutete, dass es in die richtung geht. bitte zukünftig die folgenden tips beherzigen:
  • einrücken des codes, damit man eine struktur erkennt
  • vermeiden von globalen variablen, damit man den codeblock nachvollziehen kann
  • bennenen der buttons und der funktionen, damit man weiss was passieren soll

ausserdem wäre hier und da eine fehlerprüfung angesagt... :-)


Zitat:

Zitat von DeddyH
Tja, wenn man richtig gelesen hätte ...

tja, was soll ich dazu sagen ...
... vielleicht, dass man keine globalen variablen verwenden sollte ... :drunken: aber das kennst du ja :-)

DeddyH 2. Mai 2008 20:18

Re: editbox Text aus Listbox beziehen
 
Klar :zwinker:


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