Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler im Programm-nur wo? (https://www.delphipraxis.net/130642-fehler-im-programm-nur-wo.html)

ichnixwissen 11. Mär 2009 17:11


Fehler im Programm-nur wo?
 
Ich such schon die ganze Zeit nach dem Fehler und find ihn einfach nicht. Situation:
Es sind 20 Wörter in Lablels vorgegeben, die man sich Möglichst merken sollte. Naach einiger Zeit verschwinden die Labels und es erscheint ein Edit in dem man die gemerkten Wörter eingeben kann. Wenn das Wort vorhanden ist soll richtig angezeigt werden un wenn nich , dann Falsch.
Problem: Beim ersten mal funktioniert allles wunderbar,aber ab dem zweiten Button-Klick kommt nur noch Falsch :!:

Bitte helft mir!!!

Delphi-Quellcode:
var a: string; i,j: integer;
    b: boolean;
begin
a:= edit1.Text;
i := 0;
repeat
  b:=false;
  i := i+1;
  if a = TLabel(FindComponent('label'+IntToStr(i))).Caption then
    begin
    b:=true;
    TLabel(FindComponent('label'+IntToStr(i))).Visible:= true;
    i := 20;
  end;
until i = 20;

if b then
  Richtig.Visible:= true
else
  Falsch.Visible:= true;

delay(2000);
Edit1.Text:= ' ';
Richtig.Visible:= false;
Falsch.Visible:= false;
[edit=mkinzler]Tag korrigiert Mfg, mkinzler[/edit]

jaenicke 11. Mär 2009 17:18

Re: Fehler im Programm-nur wo?
 
Ich habe mir deinen Quelltext noch nicht näher angeschaut, aber ein ähnliches Problem war dieses, da habe ich eine entsprechende Lösung gepostet:
http://www.delphi-forum.de/viewtopic...=552894#552894
Dabei ging es um die Auswahl von 5 aus 12 Checkboxen und den Vergleich mit zufällig gezogenen.

kaiser1401 11. Mär 2009 17:21

Re: Fehler im Programm-nur wo?
 
Willkommen in der DP :dp:

als erstes solltest du mal deinen beitrag bearbeiten und die Code tags richtig setzen ;-) und über die Vorschau schauen ob es so aussieht wie du willst.

dann währe eine for schleife schöner, aus der du mit "break" aussteigen kannst (imho)

Delphi-Quellcode:
[..]
b:=false;
for i:= 1 to 20 do
 begin
  if a = TLabel(FindComponent('label'+IntToStr(i))).Caption then
   begin
    b:=true;
    break;
   end;
 end;

[...]
Ansonsten seh ich aber momentan noch ncith warum es nciht klappt. kannst du mal den gesammten quelltext hochladen?

ichnixwissen 11. Mär 2009 17:31

Re: Fehler im Programm-nur wo?
 
Delphi-Quellcode:
procedure Delay(ATime:Integer);
 {diese Prozedur sorgt für eine Pause, Parameter in Millsekunden,
   also Aufruf durch delay(1000) entspricht 1 sec}
var
  Start : Integer;
begin
  Start:=GetTickCount;
  repeat
    Application.ProcessMessages;
  until GetTickCount-Start > ATime;
end;

procedure TForm7.FormCreate(Sender: TObject);
const p: Array [1..70] of string =
      ('Hund','Herz','Haus','Kind','Riss','Tank',
      'Pferd','grau','Öl','nass','kalt','Kirche',
      'Mann','Boss','Ski','neu','kurz','Uhr',
      'Schiff','Hand','schief','Ball','Kreis',
      'Puppe','Auto','Buch','Turm','schlau',
      'reich','tief','Meer','Sand','Baum','weit',
      'Stadt','Land','Handy','fit','Licht','Spott',
      'Moodle','Maus','Dame','Wind','Würfel','breit',
      'Katze','einsam','Traube','Zunge','fair','Brief',
      'alt','See','sanft','Dach','Feuer','Gas','Jacke',
      'jung','Fisch','lahm','Kraft','Apfel','Bahn','Computer',
      'Mauer','nah','Zimmer','grob');
var i: integer;
begin
i:= 0;
randomize;
for i:= 1 to 20 do begin
TLabel(FindComponent('label'+IntToStr(i))).Caption:= p[random(70)+1];

end;
timer1.Enabled:= true;
end;

procedure TForm7.Timer1Timer(Sender: TObject);
begin
edit1.Visible:= true;
button1.Visible:= true;
    Label1.Visible:= false;
    Label2.Visible:= false;
    Label3.Visible:= false;
    Label4.Visible:= false;
    Label5.Visible:= false;
    Label6.Visible:= false;
    Label7.Visible:= false;
    Label8.Visible:= false;
    Label9.Visible:= false;
    Label10.Visible:= false;
    Label11.Visible:= false;
    Label12.Visible:= false;
    Label13.Visible:= false;
    Label14.Visible:= false;
    Label15.Visible:= false;
    Label16.Visible:= false;
    Label17.Visible:= false;
    Label18.Visible:= false;
    Label19.Visible:= false;
    Label20.Visible:= false;
end;

procedure TForm7.Button1Click(Sender: TObject);
var a: string; i,j: integer;
    b: boolean;
begin
a:= edit1.Text;
i := 0;
repeat
  b:=false;
  i := i+1;
  if a = TLabel(FindComponent('label'+IntToStr(i))).Caption then
    begin
    b:=true;
    TLabel(FindComponent('label'+IntToStr(i))).Visible:= true;
    i := 20;
  end;
until i = 20;

if b then
  Richtig.Visible:= true
else
  Falsch.Visible:= true;

delay(2000);
Edit1.Text:= ' ';
Richtig.Visible:= false;
Falsch.Visible:= false;

end;



end.

BAMatze 11. Mär 2009 17:38

Re: Fehler im Programm-nur wo?
 
Also ist jetzt nur mal eine Vermutung, aber könnte der Fehler eventuell hier liegen:
Delphi-Quellcode:
Edit1.Text:= ' ';
Du schreibst hier ein Leerzeichen in das Feld, welches eventuell nicht gelöscht wird. Das sollte beim vergleich dann immer einen Fehler erzeugen, weil " Hund" verschieden von "Hund" sein sollte.

besser wäre:
Delphi-Quellcode:
Edit1.Text:= '';
Ist nur eine Vermutung.

kaiser1401 11. Mär 2009 17:39

Re: Fehler im Programm-nur wo?
 
Zunächstmal brauchst du das Delay nicht selbst zu schreiben, es gibt eine Funktion "Sleep()" die in etwa das machen dürfte was du wilst.

Dann würd ich im OnTimer-Event empfehlen den Timer dort wieder auszuschalten damit das nciht öfter durchlaufen wird. (es sei denn du willst das)

Du kannst Edit1.Text auch auf einen Leerstring setzen also '' statt ' '

Setz doch mal einen Breakpoint im Anfang von Button1Click (mit F5) , starte das Programm (F9) und geh dann Schrittweise durch ( F8 ) und schau dir an was in den variablen drin steht.

ichnixwissen 11. Mär 2009 17:52

Re: Fehler im Programm-nur wo?
 
Das mit dem Edit war der Fehler. Danke für die schnelle Antwort... :-D

_frank_ 11. Mär 2009 17:59

Re: Fehler im Programm-nur wo?
 
Zitat:

Zitat von kaiser1401
Zunächstmal brauchst du das Delay nicht selbst zu schreiben, es gibt eine Funktion "Sleep()" die in etwa das machen dürfte was du wilst.

falsch, sleep hält die Programmausführung an (Nachrichten werden nicht abgearbeitet).
ansonsten fehlt mir auf, dass es sein kann, dass bestimmte worte doppelt auftauchen können, ws sicher auch nicht so gedacht ist...

warum eigentlich so viele labels? reicht nicht ein label, was du änderst, wenn das vorherige wort richtig war? die gefundenen Worte kannst du ja trotzdem nach dem finden in eine liste schreiben...

vielleicht wäre eine stringliste auch eine bessere Alternative für den Vergleich...anzeigen kann mans ja per label, aber dann kannst du dir das FindComponent sparen (ggf. Pointer auf das label an den Stringlist-Eintrag anhängen, um das label sichtbar zu machen).

sonst sehe ich auch den Fehler nicht, ohne es zu testen...

Gruß Frank

jaenicke 11. Mär 2009 18:34

Re: Fehler im Programm-nur wo?
 
Zitat:

Zitat von _frank_
Zitat:

Zitat von kaiser1401
Zunächstmal brauchst du das Delay nicht selbst zu schreiben, es gibt eine Funktion "Sleep()" die in etwa das machen dürfte was du wilst.

falsch, sleep hält die Programmausführung an (Nachrichten werden nicht abgearbeitet).

Genau! Hier gibt es auch eine ressourcenschonendere Variante des oben geposteten Codes:
http://www.delphipraxis.net/internal...ect.php?t=7355


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz