![]() |
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. |
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; |
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; |
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:
Normlerweise schreibt man immer := 0 to Count-1
for i:=0 to listbox1.items.count-1 do
begin f[i+1]:=strtoint(listbox1.items.Strings[i]); end; Heiko |
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:
- die Listbox wird sortiert (sorted := true), aber das Array nicht? Dann musst Du Dir eine eigene Sortierroutine schreiben.
if opendialog1.execute then...
- 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. |
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:
Ich hoffe ihr könnt mir nun besser weiterhelfen.
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. |
Re: editbox Text aus Listbox beziehen
Ich komm mit Deinem Index nicht klar, wenn ich ehrlich bin.
|
Re: editbox Text aus Listbox beziehen
die variable index ist das selbe wie listbox1.items.count nur halt von dem array^^
|
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.
|
Re: editbox Text aus Listbox beziehen
stimmt aber ich denke nicht dass es daran liegt oder?
|
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.
|
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. |
Re: editbox Text aus Listbox beziehen
Liste der Anhänge anzeigen (Anzahl: 1)
Erstmal zur Sortierung: versuch mal dies
Delphi-Quellcode:
[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]
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; |
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. |
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]) |
Re: editbox Text aus Listbox beziehen
ja und genau das bekomme ich nicht gebacken^^
Delphi-Quellcode:
So habe ich es versucht zu lösen, aber die Listbox wird anscheinend nicht richtig ins array übernommen. :gruebel:
for i:=0 to listbox1.items.count-1 do
begin f[i+1]:=strtoint(listbox1.items.Strings[i]); end; |
Re: editbox Text aus Listbox beziehen
Sicher? Evtl. musst Du nur Deine Variable Index richtig setzen.
|
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.
|
Re: editbox Text aus Listbox beziehen
Bist Du nach dem Sortieren auch den umgekehrten Weg gegangen? In meinem Beispielprojekt funktioniert das jedenfalls ;)
|
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:
dieses Array dann via Bubblesort sortieren
for i:=0 to listbox1.items.count-1 do
begin f[i+1]:=strtoint(listbox1.items.Strings[i]); end; 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. |
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
|
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.
|
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. :)
|
Re: editbox Text aus Listbox beziehen
Tja, wenn man richtig gelesen hätte:
Zitat:
|
Re: editbox Text aus Listbox beziehen
Zitat:
ausserdem wäre hier und da eine fehlerprüfung angesagt... :-) Zitat:
... vielleicht, dass man keine globalen variablen verwenden sollte ... :drunken: aber das kennst du ja :-) |
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