Autor Beitrag
Ku-Shi
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 21.09.05 13:43 
Hallo,
ich versuche mich an einem Hangman Spiel.
Das Wort habe ich in ein Array gespeichert (wort2) und nun will ich per Klick auf einen Button mit jeweils einem Buchstaben nach eben diesem im Lösungswort suchen und diesen Buchstaben dann in ein zweites Array (wort2) schreiben, bei dem ich zuvor alle Stellen mit '_'´s ausgefüllt habe, sodass sie nicht angezeigt werden. Ich habe mir gedacht, am besten schreibe ich dazu eine Prozedur, damit ich das Abfrageskript nicht für jeden Button neu schreiben muss. Dann brauche ich nur bei Klick auf den Button die Prozedur aufrufen und den entsprechenden Buchstaben als Parameter übergeben. Danach wird in der Prozedur überprüft, ob der Buchstabe in dem Wort vorkommt, wenn nicht, wird eine Variable inkrementiert. Hat die Variable einen bestimmten Wert erreicht, sollen Hangman-Bilder angezeigt werden (Visible := True). Diese habe ich unter den Namen f1, f2, ... f10 im Programm integriert. Bei der 'suchen'-Prozedur kommt jedoch die Fehlermeldung >>Undefinierter Bezeichner 'f1'<<. Woran liegt das? Kann ich innerhalb der Prozedur nicht auf globale Objekte zugreifen? In anderen Prozeduren geht das (Neustart-Button).

Ich habe es schon mal mit einem EditFeld anstatt dieser Buttons programmiert und da funktioniert es super, ist nur umständlicher, da man die Buchstaben per Hand eingeben muss und nicht per Buttonklick, es müsste also an der Prozedur liegen.

Ich kenne mich in Delphi leider nicht sonderlich gut aus (brauche es für die Schule), also bitte erklärt es mir Idiotensicher ;O)

mein Script:

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:
type

{... (die ganzen Objekte)}

end;
procedure suchen(b1, b2 :String); forward;
var

{... (diverse Prozeduren)}

procedure suchen(b1, b2 :String);
begin
v := 0;
wort.Caption := '';

for i:=0 to l-1 do
begin
  if (wort1[i]=b1) or (wort1[i]=b2) then wort2[i] := wort1[i] {ist Buchstabe vorhanden? ...}
  else v := v+1;
  wort.Caption := wort.Caption + wort2[i] + ' ';
end;

if (v = l) then f := f+1; {... Buchstabe nicht vorh., Variable inkrementieren}
if (f = 1) then f1.Visible := True; {Variable hat bestimmten Wert, Hangman aufbauen (Bild 1)}
{... }

end;

procedure TForm1.baClick(Sender: TObject);
begin
suchen('a', 'A'); {Buchstabe an Prozedur übergeben}
ba.Visible := False; {Button ausblenden}
end;


PS: Habe ich die Prozedur überhaupt richtig deklariert?

---------------------- Edit ---------------------

Wenn ich die Befehle aus der 'suchen'-Prozedur direkt in die 'b...Click'-Prozeduren schreibe (copy+paste) funktioniert es prima, es muss also an der 'suchen'-Prozedur liegen. Bitte helft mir dabei, ich vertehe das einfach nicht!

---------------------- Edit 2 -------------------

Ich habe gerade herausgefunden, dass die Prozedur im Prinzip funktioniert. Ich habe alles, das direkt mit den Objekt(nam)en zusammenhängt ausgeklammert ('wort' und 'f1', 'f2', ... 'f10') und es so laufen lassen. D.h. nur die IF-Abfragen. Dabei stellte sich heraus, dass die Buchstaben richtig ins zweite Array geschrieben wurden. Damit funktioniert nur die Ausgabe nicht, d.h. die Befehle, die direkt mit den Objekten zu tun haben und nicht nur mit Variablen arbeiten. (entschuldigt diese womöglich unverständliche Ausdrucksweise, aber ich kann es nicht besser <.<)
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 21.09.05 15:44 
1. Anstatt das ganze Wort durchzugehen und zu prüfen, ob das der Buchstabe ist,
kannst du dir mal in der Hilfe die Funktion Pos(); angucken. Dann prüfst du
einfach ob der Rückgabewert > 0 ist und du weißt, dass der Buchstabe vorhanden ist.
Danach kannst du immer noch herausfinden, an welchen Stellen.

2. Das forward brauchst du in diesem Fall nicht.

3. Außerdem musst du nicht 'a' und 'A' übergeben. Such mal in der Hilfe nach
LowerCase(); bzw. UpperCase();.


Das sind mal die 1. Tipps, die dir helfen werden.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Ku-Shi Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 21.09.05 16:11 
Vielen Dank für die Hinweise, aber im Grunde sind das nur verschönerungen an dem Programm.
Mein Hauptproblem bleibt damit leider noch:
Die Objekte 'Wort' (ein Panel) und 'f1', 'f2', ... 'f10' (jeweils Images) können innerhalb der Prozedur nicht angesprochen werden. Woran liegt das, bzw. gibt es Möglichkeiten dies zu umgehen, außer das ganze Script in jedes OnClick-Event der einzelnen Buchstaben-Buttons zu schreiben?
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 21.09.05 16:22 
Du musst Form1.F1.Visible := True; statt F1.Visible := True;
schreiben, sonst kennt Delphi 'F1' nicht.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Ku-Shi Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 21.09.05 16:30 
Vielend Dank, das hat mir bei meinem Problem sehr geholfen.
Jetzt funktioniert es prima, ohne zu mucken.

Das nenne ich mal eine schnelle Hilfe!!