Autor Beitrag
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: So 31.08.08 17:29 
Hallo,

das Programm sollte eine in ein Editfeld eingegebene Zahl in einer Variablen Speichern und dann in einer
Listbox ausgeben. Insgesamt sind im Array 10000 Speicherplätze, und man sollte mehrere Zahlen speichern, doch er speichert immer nur eine und der Rest sind Nullen.
Ich denke er hängt die nächste Zahl einfach Hinten an so das man sie in der Listbox nicht mehr sieht, also an 10001. Stelle. Und der Rest läuft auch noch nicht ganz rund.
Schaut bitte mal drüber, und schlagt mir Einsteigermethoden vor, die auf diesem Wissensstand basieren.

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:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    Edit2: TEdit;
    Button3: TButton;
    Button4: TButton;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  zahlen : array[1..10000of integer;
  gesucht : integer;
  i : integer;
  gefunden : boolean;
  loschen : integer;


implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject); // Einspeichern
begin
zahlen[i] := StrToInt(Edit1.Text);
i := i+1;
showmessage('Ihre Zahl wurde eingespeichert');
Edit1.Clear;
end;

procedure TForm1.Button2Click(Sender: TObject); // Ausgeben
begin
for i := 1 to 10000 do ListBox1.Items.Add(IntToStr(zahlen[i]));
end;

procedure TForm1.Button3Click(Sender: TObject); // Suchen
begin
gesucht := StrToInt(Edit2.Text);
for i:= 1 to 10000 do if gesucht = zahlen[i] then
    begin
    showmessage('Die Zahl '+(IntToStr(gesucht))+' ist in der an Stelle '+(IntToStr(i))+' zu finden');
    gefunden := true;
    end;
if gefunden = false then showmessage('Die gesuchte Zahl '+(IntToStr(gesucht))+' ist nicht zu finden')
end;

procedure TForm1.FormCreate(Sender: TObject); // on create
begin
i := 1;
gefunden := false;
end;

procedure TForm1.Button4Click(Sender: TObject); // löschen
begin
loschen := StrToInt(Edit3.Text);
for i:= 1 to 10000 do begin
                      if loschen = zahlen[i] then zahlen[i] := 0;
                      end;
ListBox1.Clear;
for i := 1 to 10000 do ListBox1.Items.Add(IntToStr(zahlen[i]));

end;

end.
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: So 31.08.08 22:40 
Hallo!
Du benutzt eine Variable "i", welche du mit 1 initialisierst, und anschließend immer um eins erhöhst, sobald eine Zahl gespeichert Wird.

Problem:

Du benutzt dieselbe Variable "i" auch noch als for-Zählvariable in den Prozeduren Button2,Button3 und Button4Click.

Also:

1. OnCreate wird i := 1 gesetzt.
2. Ich speichere eine Zahl, i wird um eins erhöht => i = 2
3. ich gebe es in die Listbox aus mit Button2 => i wird als For-Zähler verwendet, hat jetzt einen undefinierten Wert - in der Praxis als ich getestet habe den Wert 10001.

Lösung: wie Delphi auch meckert: For-Schleifenvariablen sollten Lokal definiert werden, um genau sowas zu vermeiden.

Schnipsel:

ausblenden 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:
var
  ..
  i : integer; // Globale Variable
  ..
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject); // Einspeichern
begin
  zahlen[i] := StrToInt(Edit1.Text);
  i := i+1// Tipp: inc(i); macht dasselbe!
  showmessage('Ihre Zahl wurde eingespeichert');
  Edit1.Clear;
end;

procedure TForm1.Button2Click(Sender: TObject); // Ausgeben
  var
    n: Integer;  // eine Lokale Variable. Die könnte auch i heißen - 
                 // aber dann könnte es zu verwechslungen kommen.
begin
  for n := 1 to 10000 do ListBox1.Items.Add(IntToStr(zahlen[n]));
end;

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Zuletzt bearbeitet von Tilman am Mo 01.09.08 17:14, insgesamt 2-mal bearbeitet
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mo 01.09.08 17:03 
Ok ich werde es probieren, habe gerade keine Zeit.
Hoffe das es funktioniert, aber die Variable "n" muss ich doch noch deklarieren oder?
Und welcher Datentyp?
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Mo 01.09.08 17:15 
Öhm...

user profile iconTilman hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button2Click(Sender: TObject); // Ausgeben
  var
    n: Integer;  // eine Lokale Variable. Die könnte auch i heißen - 
                 // aber dann könnte es zu verwechslungen kommen.

begin
  for n := 1 to 10000 do ListBox1.Items.Add(IntToStr(zahlen[n]));
end;


... ist doch alles klar oder? ;)

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
huuuuuh
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: Mo 01.09.08 17:18 
die variable "n" ist ein integer - sie ist nicht global - über den prozeduren - deklariert, sondern in einer prozedur - lokal - sowas geht....
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 01.09.08 17:26 
Zitat:
die variable "n" ist ein integer - sie ist nicht global - über den prozeduren - deklariert, sondern in einer prozedur - lokal - sowas geht....

das hat doch Tilman such schon geschrieben!
huuuuuh
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: Mo 01.09.08 17:40 
und? schadet ja nichts....
und als ich meinen beitrag geschrieben hab, war tilmans noch nich da... auch wenn angeblich 3 minuten dazwischen liegen...
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 02.09.08 19:28 
Also das einzige was jetzt noch klappen sollte ist dass:

Man sollte die im Array gespeicherten Zahlen auch wieder löschen können, denn sonst nimmt er nachdem ich die alten
Zahlen die ich aus der Listbox gelöscht habe beim erneuten Ausgeben der Zahlen wieder mit rein.
Irgendwelche Ideen?
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Do 04.09.08 15:46 
Hi ,

ich brauche dringend Hilfe.
Also das Programm soll die eingespeicherten Zahlen zählen und im Label2 ausgeben, funktioniert aber noch net richtig
bleibt immer auf 1. Da is also der Wurm drin mit dem Zählen.
Ich brauche das mit dem Zähler auch dringend um nachher in der Listbx nur eingespeicherte Zahlen mit einer for-Schleife auszugeben: "for n := 1 to zaehler do".

Hier der Code:
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:
unit Unit1;

interface

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

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

var
  Form1: TForm1;
  zahlen : array [1..10000of integer;
  i : integer;
  gesucht : integer;
  gefunden : boolean;
  loeschen : integer;
  zaehler : integer;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   zahlen[i] := StrToInt (Edit1.Text);
   i := i+1;
   zaehler := +1;
   Label2.Caption := ('Sie haben '+(IntToStr(zaehler))+' Zahlen eingespeichert.');
   Edit1.Clear;
end;

procedure TForm1.Button2Click(Sender: TObject);
  var
  n : integer;
begin
  for n := 1 to 10000 do ListBox1.Items.Add (IntToStr(zahlen[n]));
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
   gesucht := StrToInt (Edit2.Text);
   for i := 1 to 10000 do if gesucht = zahlen[i] then
   begin
   ShowMessage ('Die Zahl '+(IntToStr(gesucht))+' ist in der an Stelle '+(IntToStr(i))+' zu finden');
   gefunden := true;
   end;
   if gefunden = false then
   begin
   ShowMessage ('Die gesuchte Zahl'+(IntToStr(gesucht))+'ist nicht in der Liste');
   end;

end;

procedure TForm1.Button4Click(Sender: TObject);
begin
   loeschen := StrToInt(Edit3.Text);
   for i := 1 to 10000 do
   begin
   if loeschen = zahlen[i] then zahlen[i] := 0;
   end;
   ListBox1.Clear;
   for i := 1 to 10000 do ListBox1.Items.Add (IntToStr(zahlen[i]));
   Edit3.Clear;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 i := 1;
 gefunden := false;
 zaehler := 0;
end;

end.


Bitte helft mir schnell!
huuuuuh
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: Do 04.09.08 15:51 
du erhöst deinen zaehler nich...
ausblenden Delphi-Quelltext
1:
zaehler := +1					
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Do 04.09.08 16:35 
Doch habe ich:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
begin
   zahlen[i] := StrToInt (Edit1.Text);
   i := i+1;
   zaehler := +1;
   Label2.Caption := ('Sie haben '+(IntToStr(zaehler))+' Zahlen eingespeichert.');
   Edit1.Clear;
huuuuuh
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: Do 04.09.08 16:37 
richtig wär aber zaehler := zaehler + 1 oder inc(zaehler)
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 04.09.08 16:37 
user profile iconDude566 hat folgendes geschrieben:
Doch habe ich:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
begin
   zahlen[i] := StrToInt (Edit1.Text);
   i := i+1;
   zaehler := +1;
   Label2.Caption := ('Sie haben '+(IntToStr(zaehler))+' Zahlen eingespeichert.');
   Edit1.Clear;

Damit steht in Deiner Variablen Zähler der Wert 1! :zwinker:
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Do 04.09.08 17:16 
Also mir is gerade ein Fehler aufgefallen ^^: Wenn es die gesuchte Zahl nicht gibt, gibt er keine Message aus,
was er eigentlich tun sollte. Unser Lehrer hatte dazu etwas erwähnt, doch ich kann mich nicht mehr erinnern.
Irgendwelche einfachen Lösungsmöglichkeiten die für Anfänger sind?