Autor Beitrag
`shay´
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WIN XP
D7
BeitragVerfasst: Sa 21.02.04 01:11 
Hallo!

Ich bin gerade dabei ein Programm für Sortieralgorithmen zu schreiben, an sich ja kein Problem.
Ich möchte das die Zahlen in eine Listbox eingegeben werden, dann zum Sortieren in Arrays umgewandelt und danach in einer zweiten Listbox wieder ausgegeben werden. Das funktioniert zwar aber es kommt immer die Fehlermeldung
Ungültige Zeigeroperation! Ich kann damit leider gar nix anfangen. Habe zwar in der Delphi Hilfe danach gesucht aber das bringt mir auch nichts.

Hier noch der Quelltext:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Zahlen: TGroupBox;
    Zahlenliste: TListBox;
    add: TButton;
    delete: TButton;
    deleteall: TButton;
    save: TButton;
    load: TButton;

    Eingabe: TEdit;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    GroupBox1: TGroupBox;
    Button1: TButton;
    Zahlenliste2: TListBox;
    procedure addClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure deleteClick(Sender: TObject);
    procedure deleteallClick(Sender: TObject);
    procedure saveClick(Sender: TObject);
    procedure loadClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Zahlenliste: TListBox;
  zahl: array of integer;


implementation

{$R *.dfm}

procedure Tausche (x,y: integer);
   var dummy: integer;
begin
   dummy:= zahl[x];
   zahl[x]:= zahl[y];
   zahl[y]:= dummy;
end;

procedure TForm1.addClick(Sender: TObject);
begin
   Zahlenliste.Items.Add(Eingabe.Text);
   Eingabe.Clear;
   Form1.ActiveControl:=Eingabe;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Form1.ActiveControl:=Eingabe;
end;

procedure TForm1.deleteClick(Sender: TObject);
begin
   Zahlenliste.Items.Delete(Zahlenliste.ItemIndex);
end;

procedure TForm1.deleteallClick(Sender: TObject);
begin
   Zahlenliste.Clear;
end;

procedure TForm1.saveClick(Sender: TObject);
begin
   SaveDialog1.Execute;
   Zahlenliste.Items.SaveToFile (SaveDialog1.FileName);
end;

procedure TForm1.loadClick(Sender: TObject);
begin
   OpenDialog1.Execute;
   Zahlenliste.Items.LoadFromFile(OpenDialog1.Filename);
end;

procedure TForm1.Button1Click(Sender: TObject);
   var i,j,k : integer;
begin
   k:= Zahlenliste.Items.Count;
   SetLength (zahl,k);
   for i:=1 to Zahlenliste.Items.Count do
      begin
      zahl[i]:= StrToInt (Zahlenliste.Items[i-1]);
      end;

   for i:= 1 to k-1 do
      for j:= i+1 to k do
         if zahl[i]>zahl[j] then Tausche (i,j);

   for i:=1 to k do
   Zahlenliste2.Items.Add(IntToStr(zahl[l]));
end;

end.


Im Vorraus besten Dank!

`shay´

EDIT: Verschiebt mich bitte wenn ich hier nit richtig sein sollte habe gerade nit drauf geachtet :(

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt

_________________
be hot. be cool. just be.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 21.02.04 01:35 
So auf den ersten Blick:

Was soll das:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type 
  TForm1 = class(TForm) 
    ...;
    Zahlenliste: TListBox; 
    ...;

Und dann hier noch mal:
ausblenden Delphi-Quelltext
1:
2:
3:
var 
  ...;
  Zahlenliste: TListBox;


Und hier klingeln bei mir die kleinen Alarmglöckchen:
ausblenden Delphi-Quelltext
1:
for i:=1 to Zahlenliste.Items.Count do					

Das erste Item hat den Index 0 demnach muss deine Schleife von 0 bis Count-1 laufen.
`shay´ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WIN XP
D7
BeitragVerfasst: Sa 21.02.04 10:48 
Also die Typ Deklaration ist von Delphi selbst gemacht, die var Deklaration habe ich noch eingefügt weil es sonst im Programm die Variable Zahlenliste nicht kennt.

Deine Alarmglöckchen klingeln bei mir nicht weil ich dachte ich hätte das innerhalb der Schleife noch gelöst
ausblenden Delphi-Quelltext
1:
2:
3:
4:
 for i:=1 to Zahlenliste.Items.Count do 
      begin 
      zahl[i]:= StrToInt (Zahlenliste.Items[i-1]); 
      end;


Ich habe es aber mal so umgeändert wie du meinst und die Fehlermeldung kommt immer noch. :(

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt

_________________
be hot. be cool. just be.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Sa 21.02.04 10:51 
Hallo

zudem was Luckie gesagt hat: hier sind noch einige Fehler drin:
beim laden/Speichern:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.saveClick(Sender: TObject);
begin
   SaveDialog1.Execute;
   Zahlenliste.Items.SaveToFile (SaveDialog1.FileName);
end;


heißt besser:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.saveClick(Sender: TObject);
begin
   if SaveDialog1.Execute then
     Zahlenliste.Items.SaveToFile (SaveDialog1.FileName);
end;

du würdest immer laden und speichern, egal ob der user auf abbrechen oder ok geklickt hat. Gugg dir die Sachen, die du verwendest, in der Onlinehilfe an, zu vielen ist ein Beispiel hinterlegt.

dein Fehler sollte hier entstehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
   var i,j,k : integer;
begin
   k:= Zahlenliste.Items.Count;
   SetLength (zahl,k);
   for i:=1 to Zahlenliste.Items.Count do
      begin
      zahl[i]:= StrToInt (Zahlenliste.Items[i-1]);
      end;

setlenght(zahl,k): auch ein dynamisches array beginnt bei 0 zu zählen, da du von 1 beginnst zu zählen, bis du mit dem letztem Eintrag außerhalb des gültigen Bereichs. Beim Schreiben mags noch gehen, beim auslesen kracht es dann spätestens. In der tutorial-sparte ist auch ein Eintrag von Peter Lustig zum Thema array, lies dir das mal durch.

probier das mal so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
   k:= Zahlenliste.Items.Count-1;
   SetLength (zahl,Zahlenliste.Items.Count);  //hier steht die anzahl der Elemente , also ohne -1
   for i:=0 to k do
      begin
        zahl[i]:= StrToInt (Zahlenliste.Items[i]);
      end;
   ...

und fang bei den anderen immer bei 0 an zu zählen, wie es Luckie gesagt hat

Mfg Frank

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
`shay´ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WIN XP
D7
BeitragVerfasst: Sa 21.02.04 13:16 
Dankeschön es funktioniert soweit...

Mal schauen wie ich mit den anderen Sortieralgorithmen klar komme...
In der Schule bekommen wir das nämlich eh nit mehr geregelt, aber hier finde ich sicher was über Sortierverfahren.

_________________
be hot. be cool. just be.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 21.02.04 19:13