Autor |
Beitrag |
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: 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.
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 public end;
var Form1: TForm1; zahlen : array[1..10000] of integer; gesucht : integer; i : integer; gefunden : boolean; loschen : integer;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); begin zahlen[i] := StrToInt(Edit1.Text); i := i+1; showmessage('Ihre Zahl wurde eingespeichert'); Edit1.Clear; end;
procedure TForm1.Button2Click(Sender: TObject); begin for i := 1 to 10000 do ListBox1.Items.Add(IntToStr(zahlen[i])); 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 showmessage('Die gesuchte Zahl '+(IntToStr(gesucht))+' ist nicht zu finden') end;
procedure TForm1.FormCreate(Sender: TObject); begin i := 1; gefunden := false; end;
procedure TForm1.Button4Click(Sender: TObject); 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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:
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; .. implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); begin zahlen[i] := StrToInt(Edit1.Text); i := i+1; showmessage('Ihre Zahl wurde 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; |
_________________ 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 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mo 01.09.08 17:15
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
huuuuuh
      
Beiträge: 665
Erhaltene Danke: 19
win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 665
Erhaltene Danke: 19
win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
|
Verfasst: 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 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: 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 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: 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:
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 public end;
var Form1: TForm1; zahlen : array [1..10000] of 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
      
Beiträge: 665
Erhaltene Danke: 19
win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
|
Verfasst: Do 04.09.08 15:51
du erhöst deinen zaehler nich...
Delphi-Quelltext
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 04.09.08 16:35
Doch habe ich:
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
      
Beiträge: 665
Erhaltene Danke: 19
win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
|
Verfasst: Do 04.09.08 16:37
richtig wär aber zaehler := zaehler + 1 oder inc(zaehler)
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Do 04.09.08 16:37
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: 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?
|
|