Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - "Geldautomaten" programmieren


Programmierer83 - Fr 20.04.07 18:49
Titel: "Geldautomaten" programmieren
Hi.

Ich bin Schüler und wir programmieren im Informatikunterricht mit Delphi 7.

Wir müssen als Projekt ein Programm schreiben, welches einen EC-Automaten simuliert.

Ich bin noch ganz am Anfang des Programmes und wollte zunächst ein Tastenfeld einrichten, über welches ich dann eine 4-stellige PIN eingeben kann, welche in einem Editfeld erscheint.

Ich will das Tastenfeld mit 9 Buttons realisieren, also wie bei einem richtigen EC-Automat mit den Tasten 0-9.

Ich weis aber nicht genau, wie ich das mit dem Tastenfeld realisieren kann.

Hat da jemand von euch vllt. einen Tip?

THX...


Jakob Schöttl - Fr 20.04.07 19:01

Warum setzt du nicht einfach 10 Buttons: TButton auf ein Panel: TPanel? Oder nur Buttons


Nagetier - Fr 20.04.07 19:03

Ich denke sein Problem ist eher die Sache mit dem Anzeigen in einem Edit Feld, damit da immer mehr Zahlen hinzukommen :-/

Edit1.Text.add gibts ja glaube ich nichts, oder?


Dragonclaw - Fr 20.04.07 19:03

Hallo,

du kannst ein Panel erstellen und da 9 Buttons und 1 Label reinmachen.

Wird jetzt ein Button gedrückt, wird die jeweilige Zahl zu einem String dazugepackt, gleichzeitig wird ein weiteres * im Label angezeigt.


//EDIT: Aber es gibt Edit1.text:= Edit1.text + '2'


Jakob Schöttl - Fr 20.04.07 19:14

user profile iconDragonclaw hat folgendes geschrieben:
... 9 Buttons ...

10 Buttons ;)
0 bis 9

Ja, und ich würde auch ein Edit machen (sieht schöner aus) und bei dem Edit die Eigenschaft PasswordChr auf * setzen. Dann sieht man eben Sternchen, statt den Zahlen...


Programmierer83 - Fr 20.04.07 21:48

So, ich hab jetzt mal ein Panel erstellt und mit den 10 Buttons verknüpft und auch ein Editfeld draufgelegt.

Aber wie bekomme ich die Werte durch drücken nun genau in das Editfeld?
Es geht auch vorrangig darum, dass nur max 4 Ziffern eingetragen werden dürfen.
Danach sollten die Buttons vllt. grau hinterlegt werden, dass man sie nicht mehr drücken kann.


Jakob Schöttl - Fr 20.04.07 22:08

OnButtonClick:

Delphi-Quelltext
1:
if Lenght(Edit1.Text < 4then Edit1.Text := Edit1.Text + '1';                    

damit kann man einfach nicht mehr als 4 Zeichen eingeben, das sieht man dann schon...


rizla - Fr 20.04.07 22:17

und wenn man im keypress folgendes schreibt

Delphi-Quelltext
1:
if (length(edit1.text) = 4then key := #7 else edit1.text := edit1.text + key;                    

dann hört mans auch noch..

(glaub ich doch, hab keen delphi zur Hand)
:gruebel:


Programmierer83 - Fr 20.04.07 22:18

user profile iconJakob Schöttl hat folgendes geschrieben:
OnButtonClick:

Delphi-Quelltext
1:
if Lenght(Edit1.Text < 4then Edit1.Text := Edit1.Text + '1';                    

damit kann man einfach nicht mehr als 4 Zeichen eingeben, das sieht man dann schon...


Oh, vielen dank schonmal dafür.

Mein Hauptproblem besteht aber eher darin, wie ich die Zahlen in das editfeld bekommen, beim Betätigen der Butons und das ich die Zahlenwerte dann auch zum Rechnen habe.


Bondfreak - Fr 20.04.07 22:46

user profile iconProgrammierer83 hat folgendes geschrieben:
user profile iconJakob Schöttl hat folgendes geschrieben:
OnButtonClick:

Delphi-Quelltext
1:
if Lenght(Edit1.Text < 4then Edit1.Text := Edit1.Text + '1';                    

damit kann man einfach nicht mehr als 4 Zeichen eingeben, das sieht man dann schon...


Oh, vielen dank schonmal dafür.

Mein Hauptproblem besteht aber eher darin, wie ich die Zahlen in das editfeld bekommen, beim Betätigen der Butons und das ich die Zahlenwerte dann auch zum Rechnen habe.



du kannst auch einfach im edit-feld in den objektinspektor gehen und die länge auf 4 zeichen festlegen, so kannst du dir die komplette if-verzweigung sparen ;)


Programmierer83 - Sa 21.04.07 07:41

Also das ganze sieht jetzt so aus: --> Bild

Wie könnte ich nun die Zahlen in das editfeld bekommen?
Ich muss ja in Panel1.change programmieren,oder?!

if button1.click then edit1.text.add (inttostr(1));
if button2.click then edit1.text.add (inttostr(2));
...

So vllt?

Müsste ich eigentlich nicht noch ne Variable als Integer deklarieren?


alzaimar - Sa 21.04.07 08:19

Wenn Du im Designer auf einen Button doppelklickst, dann kannst Du schreiben, was passieren soll, wenn der Button gedrückt wird.

Aber erstmal solltest Du die Buttons und das Editfeld hübsch benennen. Das kommt beim Lehrer gut an!
(z.B. : Button0, Button1, ... EditEingabe etc.)

Also: Doppelklick auf Button0:

Delphi-Quelltext
1:
2:
3:
4:
Procedure TMyForm.Button0Click (Sender : TObject);
Begin
  EditEingabe.Text := EditEingabe.Text + '0';
End;

Jetzt F9 ('Run') und probieren, obs klappt. Hurra! :zustimm:
Nun alle anderen Buttons entsprechend 'mit Leben füllen'. Wieder 'F9', klappts? Cool. :dance:


Programmierer83 - Sa 21.04.07 09:48

user profile iconBondfreak hat folgendes geschrieben:
user profile iconProgrammierer83 hat folgendes geschrieben:
user profile iconJakob Schöttl hat folgendes geschrieben:
OnButtonClick:

Delphi-Quelltext
1:
if Lenght(Edit1.Text < 4then Edit1.Text := Edit1.Text + '1';                    

damit kann man einfach nicht mehr als 4 Zeichen eingeben, das sieht man dann schon...


Oh, vielen dank schonmal dafür.

Mein Hauptproblem besteht aber eher darin, wie ich die Zahlen in das editfeld bekommen, beim Betätigen der Butons und das ich die Zahlenwerte dann auch zum Rechnen habe.



du kannst auch einfach im edit-feld in den objektinspektor gehen und die länge auf 4 zeichen festlegen, so kannst du dir die komplette if-verzweigung sparen ;)


hm komisch - ich hab im OI "maxlenght" auf 4 gestellt, aber es werden trotzdem mehr Zahlen eingetragen.


aim65 - Sa 21.04.07 10:45

Maxlength gilt nur bei einer Direkteingabe ins Edit-Feld.
Musst also die Grenze in Deine Routine einbauen.


Programmierer83 - So 22.04.07 06:51

user profile iconJakob Schöttl hat folgendes geschrieben:
OnButtonClick:

Delphi-Quelltext
1:
if Lenght(Edit1.Text < 4then Edit1.Text := Edit1.Text + '1';                    

damit kann man einfach nicht mehr als 4 Zeichen eingeben, das sieht man dann schon...


Hm, kannst dur mir das nochmal genauer erklären?
Wom muss ich die befehlzeile eigentlich hinsetzen? Bei Edit1.change?

Irgendwie sehr ich auch nicht so richtig in der Struktur dieser Befehlszeile durch:
"Wenn weniger als 4 Ziffern, dann "1" in Editfeld"? o_O


Jakob Schöttl - So 22.04.07 09:58

Du musst sie Button1.OnClick von einem Button hinsetzen.
Das machst du, indem du doppelt auf einen Button klickst. und dann fügst du einfach diese Quelltextzeile ein.

Zitat:
"Wenn weniger als 4 Ziffern, dann "1" in Editfeld"? o_O

schon richtig! es dürfen ja nicht mehr als 4 Zahlen sein, deswegen soll er die neue zahl nur dranhängen, an den Text des Edits, wenn es eben weniger sind.



Delphi-Quelltext
1:
2:
if Lenght(Edit1.Text < 4then // Wenn bis jetzt weniger als 4 Zeichen im Edit1 sind, dann
  Edit1.Text := Edit1.Text + '1'// der neue Text von Edit1 ist der alte plus die Zahl 1


Und die Zahl 1 muss er hald nur dranhängen, wenn eben der 2. Button gedrückt wurde. Beim ersten Button muss eben statt der 1 eine 0 Stehen, und so weiter, beim 3. eine 2...


Kniwior - So 22.04.07 10:23

Habe hier auch einen Art Geldautomat gefunden:

http://www.ftcomputing.de/delphigeldauto.htm


Aber ich denke, das ist nicht dass, wonach du suchtst.


Programmierer83 - So 22.04.07 13:48

user profile iconJakob Schöttl hat folgendes geschrieben:
Du musst sie Button1.OnClick von einem Button hinsetzen.
Das machst du, indem du doppelt auf einen Button klickst. und dann fügst du einfach diese Quelltextzeile ein.

Zitat:
"Wenn weniger als 4 Ziffern, dann "1" in Editfeld"? o_O

schon richtig! es dürfen ja nicht mehr als 4 Zahlen sein, deswegen soll er die neue zahl nur dranhängen, an den Text des Edits, wenn es eben weniger sind.



Delphi-Quelltext
1:
2:
if Lenght(Edit1.Text < 4then // Wenn bis jetzt weniger als 4 Zeichen im Edit1 sind, dann
  Edit1.Text := Edit1.Text + '1'// der neue Text von Edit1 ist der alte plus die Zahl 1


Und die Zahl 1 muss er hald nur dranhängen, wenn eben der 2. Button gedrückt wurde. Beim ersten Button muss eben statt der 1 eine 0 Stehen, und so weiter, beim 3. eine 2...


THX, geht aber nicht

mit lenght bekomme ich immer "undifinierter Bezeichner"
wenn ich lenght weglasse, dann kommt "String und Integer inkompatible Typen"

@ Kniwior: Danke, aber das ist nicht was ich suche, will ja auch selber programmieren.


BenBE - So 22.04.07 13:52

user profile iconProgrammierer83 hat folgendes geschrieben:
user profile iconJakob Schöttl hat folgendes geschrieben:
[...]

Zitat:
"Wenn weniger als 4 Ziffern, dann "1" in Editfeld"? o_O

schon richtig! es dürfen ja nicht mehr als 4 Zahlen sein, deswegen soll er die neue zahl nur dranhängen, an den Text des Edits, wenn es eben weniger sind.


Delphi-Quelltext
1:
2:
if Lenght(Edit1.Text < 4) then // Wenn bis jetzt weniger als 4 Zeichen im Edit1 sind, dann
  Edit1.Text := Edit1.Text + '1'// der neue Text von Edit1 ist der alte plus die Zahl 1


THX, geht aber nicht

mit lenght bekomme ich immer "undifinierter Bezeichner"
wenn ich lenght weglasse, dann kommt "String und Integer inkompatible Typen"


Also: Wenn man Funktionen falsch schreibt, kann es nicht gehen ... Wenn man dann dazu noch inkorrekte Syntax kopiert, ohne Nachzudenken, sollte man mal Christians Crashkurs [http://www.christian-stelzmann.de/artikel/crashkurs.htm] durchnehmen ;-)


Delphi-Quelltext
1:
2:
if Length(Edit1.Text) < 4 then // Wenn bis jetzt weniger als 4 Zeichen im Edit1 sind, dann
  Edit1.Text := Edit1.Text + '1'// der neue Text von Edit1 ist der alte plus die Zahl 1


Dass die Kommentare noch kleinere semantische Fehler aufweisen, möchte ich an dieser Stelle nur beiläufig bemerken ;-)

Die Optimierung bzgl. der Behandlung der Button-OnClic-Events erspar ich hier erstmal, da man da schon etwas das Verfahren verstanden haben sollte (man kann nämlich alle 10 Buttons des Eingabe-Feldes mit einem Event-Handler behandeln).


Programmierer83 - So 22.04.07 14:13

Hallo.

Also danke für die Korrektion @ BenBe.

Nur wenn ich den Quelltext in Button1.click rein kopiere dann habe ich keine Begrenzung, nur wenn ich den Button1 drücke wird dafür "11" in das Editfeld eingetragen. ;)

Da scheint also noch der Wurm drin zu sein.


Blackheart666 - So 22.04.07 14:37

Ungefähr so

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '1'
  else Button1.Enabled:= False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '2'
  else Button2.Enabled:= False;
end;

Was soll daran nicht funktionieren.
Sei mal nicht so sparsam mit deinen Erläuterungen.


Jakob Schöttl - So 22.04.07 15:19

user profile iconProgrammierer83 hat folgendes geschrieben:
Hallo.

Also danke für die Korrektion @ BenBe.

Nur wenn ich den Quelltext in Button1.click rein kopiere dann habe ich keine Begrenzung, nur wenn ich den Button1 drücke wird dafür "11" in das Editfeld eingetragen. ;)

Da scheint also noch der Wurm drin zu sein.

Du musst das natürlich in die Ereignisbehandlungsroutinen von allen Buttons reinkopieren! und natürlich den Quellcode anpassen...


@BenBE: Kann passieren, dass ich mich bei Length vertippe oder Klammern falsch setze, naja hauuptsache ich weiß was ich mein ;) und wenn man bisschen Ahnung hat, dann kommt man auch selber drauf.
aber was ist denn an den Kommentaren semantisch (=inhaltlich?) fehlerhaft? Die Optimierung habe ich natürlich auch weggelassen, sonst is es zu schwierig.


BenBE - So 22.04.07 15:48

Die Semantische Prüfung beinhaltet auch u.a. die Typen-Prüfung. Und es ist ein großer Unterschied, ob ich eine Zahl (Integer) zu einem String hinzufüge, oder ein Zeichen (Char) ;-) Korrekt hätte der Kommentar gehießen:


Delphi-Quelltext
1:
// der neue Text von Edit1 ist der alte mit dem aus einem Zeichen bestehenden String '1' angehängt                    


Das kommt nämlich auch dem was Delphi intern ausführt wesentlich näher als eine String-Addition laut dem Kommentar ... Intern wird nämlich LStrConcat aufgerufen (Long String Concatenation). Das hat also mit einer "Long String with Integer Addition" recht wenig zu tun :P


Jakob Schöttl - So 22.04.07 17:07

naja, meine Kommentare waren ja nicht für so einen scharfsinnigen Programmierer wie dich BenBE! ;)


ZeitGeist87 - Mo 23.04.07 07:38

Moin!

Man kann das Ganze ja auch unnötig verkomplizieren, und die selben 4 Zeilen in jedes OnButton-Klick-Ereignis schreiben :wink:

Ich hätte es so gelöst:


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

interface

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

type
  Tmainform = class(TForm)
    pin_edit: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;

   procedure FillInNumber(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  mainform: Tmainform;
  InAEdit: TEdit;

implementation

{$R *.dfm}

procedure Tmainform.FillInNumber(Sender: TObject);
begin;
 if length(InAEdit.Text) >= 4 then
  InAEdit.Clear;

 InAEdit.text:= InAEdit.text + TButton(Sender).Caption;
end;

procedure Tmainform.FormCreate(Sender: TObject);
begin
 InAEdit:= pin_edit;
end;

end.


Testanwendung im Anhang.

Und ja, natürlich ist es nicht ganz sinnig, das Edit erst in eine Variable zu schreiben, ich hatte die ganze Prozedur erst anders angelegt, und war zu "faul" die 3 InAEdit aus der Prozedur umzuschreiben :)

LG
Stefan


Jakob Schöttl - Mo 23.04.07 14:15

user profile iconZeitGeist87 hat folgendes geschrieben:
Man kann das Ganze ja auch unnötig verkomplizieren, und die selben 4 Zeilen in jedes OnButton-Klick-Ereignis schreiben :wink:

die selbe zeile (ist doch nur eine! - bei mir :?: )

Auf diese Art mit Typ-Casting wären außer dir natürlich auch noch andere gekommen, aber ich fand, das ist für Anfänger ein Quellcode, den sie überhaupt nicht verstehen...


ZeitGeist87 - Mo 23.04.07 14:28

user profile iconJakob Schöttl hat folgendes geschrieben:
user profile iconZeitGeist87 hat folgendes geschrieben:
Man kann das Ganze ja auch unnötig verkomplizieren, und die selben 4 Zeilen in jedes OnButton-Klick-Ereignis schreiben :wink:

die selbe zeile (ist doch nur eine! - bei mir :?: )


Wer sagt, das ich das auf deinen Source bezogen habe?

user profile iconJakob Schöttl hat folgendes geschrieben:
[Auf diese Art mit Typ-Casting wären außer dir natürlich auch noch andere gekommen, aber ich fand, das ist für Anfänger ein Quellcode, den sie überhaupt nicht verstehen...


Unterstellst du Anfängern geistige Inkompetenz bzgl. des Lernens? :)

Es wird doch wohl noch erlaubt sein, seine Meinung zu äußern und Tipps zu geben.
Früher oder später erinnert er sich und verwendet es so :)

LG
Stefan


BenBE - Mo 23.04.07 14:50

Sagen wir's so: Hätt ich gewollt, hätt ich die Lösung bereits in meinem ersten Post genau so posten können. Ich habe allerdings darauf verzichtet, weil 1. unserem Threadersteller die Grundlagen noch nicht vollständig liegen, 2. das in den Bereich Optimierungen zählt. Beides hat in einem Thread, wo erst einmal die Grundlagen erklärt werden müssen nur bedingt was zu tun. Mit "Unfähigkeit beim Lernen" hat das nichts zu tun. Eher mit linearem Lernvorgehen: Vom Einfachen zum Schwereren... Wenn Du da nach Schritt 1 gleich Schritt 50004 postest, dann wird das im schlimmsten Fall ein Copy&Paste-Programm womit keinem geholfen wäre.

2ct.


ZeitGeist87 - Mo 23.04.07 14:55

user profile iconBenBE hat folgendes geschrieben:
Sagen wir's so: Hätt ich gewollt, hätt ich die Lösung bereits in meinem ersten Post genau so posten können. Ich habe allerdings darauf verzichtet, weil 1. unserem Threadersteller die Grundlagen noch nicht vollständig liegen, 2. das in den Bereich Optimierungen zählt. Beides hat in einem Thread, wo erst einmal die Grundlagen erklärt werden müssen nur bedingt was zu tun. Mit "Unfähigkeit beim Lernen" hat das nichts zu tun. Eher mit linearem Lernvorgehen: Vom Einfachen zum Schwereren... Wenn Du da nach Schritt 1 gleich Schritt 50004 postest, dann wird das im schlimmsten Fall ein Copy&Paste-Programm womit keinem geholfen wäre.

2ct.


Das Ganze war lediglich eine Meinungsäußerung von meinerseits.

Natürlich ist es klar, dass ihm damit nicht wirklich geholfen ist.
Es war auch nur ein Fingerzeig in die Richtung, wie man es effizienter und adäquater lösen könnte!

Könnte <> Müssen!!

Deswegen versteh ich nicht ganz, warum meinen Meinung in Frage gestellt wird. :)

LG
Stefan


Jakob Schöttl - Mo 23.04.07 15:01

user profile iconZeitGeist87 hat folgendes geschrieben:
Natürlich ist es klar, dass ihm damit nicht wirklich geholfen ist.

Da sind wir ja einer Meinung ;)
user profile iconZeitGeist87 hat folgendes geschrieben:
Es war auch nur ein Fingerzeig in die Richtung, wie man es effizienter und adäquater lösen könnte!

ja... hast ja recht, nur so ein Fingerzeig hilft meistens einem Anfänger eher weniger, wenn er Hausaufgaben auf Montag auf hat, glaub ich
user profile iconZeitGeist87 hat folgendes geschrieben:
Deswegen versteh ich nicht ganz, warum meinen Meinung in Frage gestellt wird. :)

Ich wollte/hab nicht deine Meinung in Frage gestellt.

;) Viele Grüße, Jakob


Programmierer83 - Mi 25.04.07 18:39

Hi.

Also ich bin jetzt soweit gekommen: siehe Screenshot.

Ich kann jetzt die PIN über die Buttons einbauen.
3x false PIN = Deaktivierung des Eingabebereiches.


Ich möchte jetzt aber erreichen, dass man den "Bestätigen"-Button nur dann drücken kann, wenn etwas im Editfeld eingetragen ist.

Ich habs so versucht:

if edit1.text='' then bitbtn1.enabled:=false
else bitbtn1.enabled:=true;

//Hab das in Tform1.Panel1Click reingemacht und auch in anderen Unterprogrammen, wie TForm.Formcreate versucht - geht irgendwie nicht.

Entweder ist der Button bei Programmstart zwar deaktiviert, wenn ich was in editfeld eingebe, bleibt er aber deaktiviert.

Oder er ist von Anfang an nicht deaktiviert.

Spinnt also irgendwie rum.

Hab den Quelltext dazugefügt.


Weiss einer Rat?


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:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    BitBtn1: TBitBtn;
    Label1: TLabel;
    Panel2: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  PIN_EINGABE, PIN_ECHT:word;
  Kontostand, Abheben, Kredit:word;
  Anzahl:byte;


implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
if Length(Edit1.text)< 4 then Edit1.text:=Edit1.text + '1'
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '2'
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '3'
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '4'
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '5'
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '6'
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '7'
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '8'
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '9'
end;

procedure TForm1.Button10Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '0'
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
PIN_ECHT:=2288;
PIN_EINGABE:=strtoint(edit1.text);
  if PIN_EINGABE = PIN_ECHT then
    begin
    edit1.clear;
    label1.caption:='PIN war richtig';
    end
      else
      begin
      label1.caption:='Falsche PIN!';
      edit1.clear;
      edit1.setfocus;
      Anzahl:=Anzahl+1;
      end;
  if Anzahl > 2 then
      begin
      Button1.enabled:=false;
      Button2.enabled:=false;
      Button3.enabled:=false;
      Button4.enabled:=false;
      Button5.enabled:=false;
      Button6.enabled:=false;
      Button7.enabled:=false;
      Button8.enabled:=false;
      Button9.enabled:=false;
      Button10.enabled:=false;
      bitbtn1.enabled:=false;
      edit1.enabled:=false;
      label1.caption:='Kontozugriff gesperrt!';
      end;

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
if edit1.text='' then bitbtn1.enabled:=false
                 else bitbtn1.enabled:=true;
end;

end.


Blackheart666 - Mi 25.04.07 18:47

OnChange und Crashkurs :wink:


Programmierer83 - Mi 25.04.07 18:56

user profile iconBlackheart666 hat folgendes geschrieben:
OnChange und Crashkurs :wink:


TForm1.Edit1Change <-- meinst du das? Muss das dort rein? Funzt leider nicht.

Den Crashkurs ackere ich grad durch.


Blackheart666 - Mi 25.04.07 19:18

Da hättest Du aber jetzt von allein drauf kommen können.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Enabled:=False;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if Length(Edit1.Text)> 0 then Button1.Enabled:=True
  else Button1.Enabled:=False;
end;


Programmierer83 - Mi 25.04.07 20:35

user profile iconBlackheart666 hat folgendes geschrieben:
Da hättest Du aber jetzt von allein drauf kommen können.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Enabled:=False;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if Length(Edit1.Text)> 0 then Button1.Enabled:=True
  else Button1.Enabled:=False;
end;


Ach Mist, die einfachsten Sachen wollen einem oft nicht einfallen...

THX


ByteKiller - Mi 25.04.07 22:18

Hi,

@ BenBe:
ich wollte von dir bloß mal wissen was du mit "Event-Handler" meinst

ich hätte das mit den Buttons so gemacht (wenn die Buttons die Caption 1..10 haben):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);    
begin
  if length(Edit1.Text) < 4 then
    begin
      Edit1.Text := Edit1.Text + (Sender as TButton).Caption;     
      panel2.Caption := panel2.Caption + '*';
    end;
end;
// Edit für die "reinen" Zahlen (nicht sichtbar) und Panel als Anzeige


MfG ByteKiller


Programmierer83 - Sa 05.05.07 21:14

Hi,

dank eurer Starthilfe habe ich das Ding jetzt so gut wie fertig programmiert.

Aber ich möchte den Quelltext noch etwas optimieren.

zb. hier:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Button1.visible:=false;
Button2.visible:=false;
Button3.visible:=false;
Button4.visible:=false;
Button5.visible:=false;
Button6.visible:=false;
Button7.visible:=false;
Button8.visible:=false;
Button9.visible:=false;
Button10.visible:=false;


gibt es irgendwie ne Möglichkeit das kleiner zu bekommen? Bestimmt.

Vllt. sowas wie:

With Buttons 1-10 do visible:=false



thx...


Blackheart666 - Sa 05.05.07 21:18

FindComponent


Programmierer83 - Sa 05.05.07 21:34

user profile iconBlackheart666 hat folgendes geschrieben:
FindComponent


???


jakobwenzel - Sa 05.05.07 21:35

Das Forum hat ne Suche und Delphi hat ne Hilfe.


Programmierer83 - Sa 05.05.07 22:56

Ich hatte schon danach gesucht und auch die delphihilfe bemüht, hab aber nichts richtiges gefunden.

PS:

Ich möchte noch einen Button einbauen, der das Programm "resetet" - also das alles wieder so hergestellt ist, wie beim Start des Programmes - gibts da was?


Blackheart666 - Sa 05.05.07 23:08

Einen Reset Button gibs nicht, da musst Du Dich schon selbst drum kümmern und zu FindComponent gibt es hier im Forum doch ettliches.
Aber wir werden mal nicht so sein, aber dafür ohne Erklärung das findest Du mit etwas Eigeninitiative.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button6Click(Sender: TObject);
var
 i:Integer;
begin
  for i:= 1 to 5 do
  TButton(FindComponent('Button'+IntToStr(i))).Visible := False;
end;

Neue Frage - Neuer Thread :!: :wink:


Programmierer83 - So 06.05.07 14:36

hm...

Es muss doch irgendeinen befehl geben, mit dem das Programm schließt und dann von selber wieder startet.


Karlson - So 06.05.07 14:48

Nö, so einen Befehl gibts natürlich nicht...Merk dir doch einfach was du gemachst hast und mach es beim Wunsch nach Reset rückgängig.

Theoretisch ginge das von dir gewünschte über eine Batchfile aber lass das lieber. Unötiger kann man Systemressourcen kaum verschleudern^^


JayEff - So 06.05.07 15:08

Ich würde es auch etwas seltsam finden, wenn ich sehen würde, wie sich erst einer umbringt und dann sich selbst wiederbelebt :gruebel:
Nun, wie Karlson schon gesagt hat: Mit einer Batchdatei ginge es, aber das ist wirklich totaler Blödsinn.. Benutzerunfreundlich, meiner Ansicht nach, und natürlich unsauberer Programmierstil.
Eine andere Möglichkeit wäre es, dein Programm per Shellexecute ein zweites Mal zu starten und dann die erste Instanz zu schließen. Auch unsauber. Machs lieber wie Karlson gesagt hat: Du als Programmierer weißt ja, was alles durch den Benutzer verändert werden kann. Schreib dir also einfach eine Prozedur, die all das zurück setzt.


Timosch - So 06.05.07 15:41

user profile iconJayEff hat folgendes geschrieben:
Ich würde es auch etwas seltsam finden, wenn ich sehen würde, wie sich erst einer umbringt und dann sich selbst wiederbelebt :gruebel:

You made my day... :mrgreen: :lol:


Programmierer83 - So 06.05.07 19:14

user profile iconBlackheart666 hat folgendes geschrieben:
Einen Reset Button gibs nicht, da musst Du Dich schon selbst drum kümmern und zu FindComponent gibt es hier im Forum doch ettliches.
Aber wir werden mal nicht so sein, aber dafür ohne Erklärung das findest Du mit etwas Eigeninitiative.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button6Click(Sender: TObject);
var
 i:Integer;
begin
  for i:= 1 to 5 do
  TButton(FindComponent('Button'+IntToStr(i))).Visible := False;
end;

Neue Frage - Neuer Thread :!: :wink:


Ok, danke - das hat sehr gut funktioniert. :)

Geht das mit dem Zusammenfassen auch bei diesem code?


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:
procedure TForm1.Button1Click(Sender: TObject);
begin
if Length(Edit1.text)< 4 then Edit1.text:=Edit1.text + '1'
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '2'
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '3'
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '4'
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '5'
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '6'
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '7'
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '8'
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '9'
end;

procedure TForm1.Button10Click(Sender: TObject);
begin
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + '0'
end;


also da funzt das mit FindComponent ntürlich nicht.

Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt


jakobwenzel - So 06.05.07 19:17

Du weist der Eigenschaft tag vom Button deinen Wert zu und setzt bei allen Buttons die gleiche Ereignisbehandlung.
Im Eventhandler kannste dann mit (Sender as TButton).tag drauf zugreifen.


Programmierer83 - So 06.05.07 19:29

user profile iconjakobwenzel hat folgendes geschrieben:
Du weist der Eigenschaft tag vom Button deinen Wert zu und setzt bei allen Buttons die gleiche Ereignisbehandlung.
Im Eventhandler kannste dann mit (Sender as TButton).tag drauf zugreifen.


Meinst du wie eine Schleife, oder wie?


jakobwenzel - So 06.05.07 19:48

Nein.

Du kannst einfach mehreren buttons die gleiche Ereignisbehandlung zuweisen. Um sie trotzdem unterscheiden zu können, wird im Parameter sender der auslösende Knopf angegeben.
Mit (sender as TButton).caption kommste dann z.B. an die Caption.


Jungsta - So 06.05.07 19:49

Genau :zustimm:


Programmierer83 - So 06.05.07 19:58

Könnt ihr mir nen Tip geben, wie ich da bei dem obengenannten code rangehen könnte?

Ich habe ja jetzt 10 einzelne Prozeduren.

Ich weiss im Moment nicht wie ich anfangen soll. :/


jakobwenzel - So 06.05.07 20:04

Erstmal löschst du deine bisherigen Ereignisbehandlungen.
Dann legste die Ereignisbehandlung für einen Button an. Bei den anderen kannste dann das Feld über den eingeblendeten Pfeil rechts im Feld (erst nach selektieren sichtbar) die schon vorhandene Funktion auswählen.

Dann sind alle Buttons mit der Ereignisbehandlung verknüpft. Jetzt kannste die Methode ausprogrammieren.


Programmierer83 - So 06.05.07 20:09

user profile iconjakobwenzel hat folgendes geschrieben:
Erstmal löschst du deine bisherigen Ereignisbehandlungen.
Dann legste die Ereignisbehandlung für einen Button an. Bei den anderen kannste dann das Feld über den eingeblendeten Pfeil rechts im Feld (erst nach selektieren sichtbar) die schon vorhandene Funktion auswählen.

Dann sind alle Buttons mit der Ereignisbehandlung verknüpft. Jetzt kannste die Methode ausprogrammieren.


Welcher Pfeil? Welches Pfeil?

Ich bin halt noch ziemlich frisch.


jakobwenzel - So 06.05.07 20:11

Du selektierst im OI unter Ereignisse das Feld OnClick. dann haste da rechts so nen Pfeil wie von ner ComboBox --> anklicken und Methode auswählen.


Programmierer83 - So 06.05.07 20:16

Hm, ich weiss nicht, ob wir beide das selbe meinen.

Der obrige Code zeigt ja 10 Prozeduren, eine für jeden Button.

Bei Klick auf den jeweiligen Button wird wird die Zahl 1 bis 0 in ein Editfeld eingetragen.

Und da hab ich jetzt halt so einen langen Code.
Ich möchte diesen code halt so klein wie möglich bekommen.


jakobwenzel - So 06.05.07 20:19

Ja, ich meine das gleiche.
Der Code sähe dann in etwa so aus:

Delphi-Quelltext
1:
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + (sender as TButton).Caption;                    


Programmierer83 - So 06.05.07 20:21

user profile iconjakobwenzel hat folgendes geschrieben:
Ja, ich meine das gleiche.
Der Code sähe dann in etwa so aus:

Delphi-Quelltext
1:
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + (sender as TButton).Caption;                    


hm, aber wie leg ich dann jetzt welche Zahl in das editfeld eingetragen wird?
Und im OI kann ich alle Buttons auswählen, aber ich kann die ja nicht irgendwie "festmachen"


jakobwenzel - So 06.05.07 20:34

user profile iconProgrammierer83 hat folgendes geschrieben:
user profile iconjakobwenzel hat folgendes geschrieben:
Ja, ich meine das gleiche.
Der Code sähe dann in etwa so aus:

Delphi-Quelltext
1:
if Length(Edit1.Text)< 4 then Edit1.Text:=Edit1.Text + (sender as TButton).Caption;                    


hm, aber wie leg ich dann jetzt welche Zahl in das editfeld eingetragen wird?

Die zahl ist immer die, die auf dem Button steht, der angeklickt wird.
user profile iconProgrammierer83 hat folgendes geschrieben:
Und im OI kann ich alle Buttons auswählen, aber ich kann die ja nicht irgendwie "festmachen"

HÄ?
Vllt. hilft dir ja der Screenshot...


Programmierer83 - So 06.05.07 20:42

hm also wenn ich auf der Form zB Button 1 anklicke dann erscheint im OI bei OnClick die ganze Liste alle Buttons, etc, die noch auf der Liste sind


jakobwenzel - So 06.05.07 20:53

Das sind die ganzen anderen Ereignisbehandlungen. Du musst dir dann eine aussuchen, die du allen zuordnen willst und die anderen löschen.


Programmierer83 - So 06.05.07 21:08

user profile iconjakobwenzel hat folgendes geschrieben:
Das sind die ganzen anderen Ereignisbehandlungen. Du musst dir dann eine aussuchen, die du allen zuordnen willst und die anderen löschen.


die kann man nicht aus der Liste löschen


Blackheart666 - So 06.05.07 21:17

Kleines Bsp., vieleicht kannste damit was anfangen.


jakobwenzel - So 06.05.07 21:26

user profile iconProgrammierer83 hat folgendes geschrieben:
user profile iconjakobwenzel hat folgendes geschrieben:
Das sind die ganzen anderen Ereignisbehandlungen. Du musst dir dann eine aussuchen, die du allen zuordnen willst und die anderen löschen.


die kann man nicht aus der Liste löschen

Wenn du die zugehörige Ereignisbehandlung leerst (keine lokalen Variablen mehr, nix zwischen begin und end), wirds beim nächsten kompilieren automatisch gelöscht.