Delphi-PRAXiS
Seite 1 von 3  1 23      

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:52 Uhr.
Seite 1 von 3  1 23      

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