Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Probleme mit Operator und Operandentyp


Chrizzwalze - Mi 01.09.10 18:50
Titel: Probleme mit Operator und Operandentyp
Hallo,
Ich muss für meine Facharbeit ein Programm schreiben und habe mich entschieden, ein Quiz zu programmieren.
Ich hab das soweit durchdacht, allerdings hängts jetzt an der Umsetzung.
Hier mal das Stück Quelltext, welches mir gerade Probleme bereitet:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
begin
 if merke1<0
  then showmessage('Du darfst nur einmal pro Frage antworten!')
 else merke1:=merke1+1 and
   if merke1=1
    then begin Richtig:=Richtig+1;
               showmessage('Richtig!');
         end
    else if merke1>1
         then
           begin showmessage('Du darfst nur einmal pro Frage antworten!');
         end;
end;

So... Wenn ich nun das Programm starte, zeigt der mir in der Zeile beim vorletzten "end;" an:
"Operator ist auf diesen Operandentyp nicht anwendbar".
Allerdings habe ich keine Ahnung, was ich mit dieser Information anfangen soll...
Kann mir jemand erklären, wo im Quelltext das Problem liegt und wie ich es löse?
Vielen Dank im Voraus. LG

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 01.09.2010 um 22:06


platzwart - Mi 01.09.10 19:06


Delphi-Quelltext
1:
else merke1:=merke1+1 and                    


Das ist die kritische Zeile. Das 'and' passt da irgendwie nicht.

(Ausdruck 1) and (Ausdruck 2) -> liefert true oder false zurück. Bei dir ist Ausdruck 1 eine Zuweisung (merke1:=merke1+1) und Ausdruck 2 ist ein if-Konstrukt...


Chrizzwalze - Mi 01.09.10 19:43

hmm.... also sollte ich das "and" weglassen und ein Semikolon setzen?
Ich weiß nur nicht, ob das dann so funktioniert wie ich möchte...

Zumindest geht das Programm so zu starten. Ich melde mich, wenn es wieder ein Problem gibt, danke :) .


platzwart - Mi 01.09.10 19:43

Ob das so funktioniert, wie du willst, kannst nur du wissen. Oder du teilst uns mit, was du willst ;)


Marc. - Mi 01.09.10 19:54

OT: Ich empfehle Dir dringenst einen StyleGuide [http://www.delphi-treff.de/object-pascal/delphi-styleguide/], denn im jetztigen Augeblick ist es ein Krampf Deinen Quelltext zu lesen. :? Bei richtiger Formatierung fallen einem Fehler sehr viel eher auf oder schleichen sich erst gar nicht ein. ;)


Chrizzwalze - Mi 01.09.10 20:05

Ok, ich versuchs mal zu erklären^^.

Wie gesagt, es soll ein Quiz werden.
Vorerst wollte ich es mit nur 1 Frage (Die Frage wird in einem Label gestellt) und 3 Antworten dazu (also 3 Buttons) probieren.
Es gibt die Variablen "merke1" und "Richtig", beide integer. Beide werden beim Programmstart auf Null gesetzt.
Button 1 enthält die richtige Antwort. Wenn der Button1 geklickt passiert folgendes:
merke1:=merke1+1 und wenn merke1=1 ist, dann Richtig:=Richtig+1.
Auf diese Weise werden die richtigen Antworten gezählt.
Dann musste ich ja noch sowas wie "Sicherungen" einbauen, damit man pro Frage nur einmal antworten kann ;) sonst würde ja das
Ergebnis verfälscht werden. Also habe ich da ein paar Vergleiche von merke1 drin und im entsprechenden Fall zeigt das Programm
eben eine Meldung, dass man nur einmal antworten darf pro Frage.
So hab ich mir das grob vorgestellt... und es funktioniert :D .


Delete - Mi 01.09.10 20:34

Das sieht nach einer konzeptionellen Schwäche aus. Eine Frage kann nur richtig oder falsch sein. Also reícht eine boolean Variable. Zum Zählen der Versuche und der richtigen Antworten kann man ein Integer nehmen.

Aber davon mal abgesehen. Kann man so was auch schön OOP konform in einer Klasse implementieren.


Chrizzwalze - Mi 01.09.10 20:40

Luckie, ich finde deine Ausdrucksweise zwar herrlich...
aber kannst du mir das so erklären, dass ich es auch verstehe? o.O
Ich bin bei Delphi annähernd auf dem Wissensstand vom Lehrplan Informatik Klasse 11 Gymnasium ... Sowas wie
Boolean haben wir nie gemacht :x


Delete - Mi 01.09.10 21:10

Ich habe keine Ahnung was im Lehrplan für Informatik in der 11. Klasse steht, zu meiner Zeit gab es das noch nicht.

Hier habe ich ein Tutorial: http://www.michael-puff.de/Programmierung/Delphi/Tutorials/Klassen/

Und was eine boolean Variable ist, kannst du in der Hilfe nachgucken.


Chrizzwalze - Do 02.09.10 19:28

ok ich habe nun eine andere Frage:
Ich habe mir mehrere Formulare erstellt. Im ersten Formular habe ich die Variable 'Richtig' (integer) als global vereinbart.
Diese Variable brauche ich in allen von mir erstellten Formularen und ihr Wert soll veränderbar sein.
Kann mir jemand erklären, wie ich das zu machen habe?


Stundenplan - Do 02.09.10 21:00

Schreib die Variable in den oben bei der Deklaration type TDeinErstesForm = class(TForm) in den public-Bereich, also

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TDeinErstesForm = class(TForm)
  //...
  public
    Richtig: Integer;
  end;


Chrizzwalze - Sa 11.09.10 10:21

Hallo,
Ich danke allen für die Antworten, habe mein Quiz soweit fertig und muss nurnoch Feinarbeiten
machen ;) , Fragen eintragen usw.

MfG Chrizzwalze.


Tranx - Sa 11.09.10 10:28

user profile iconChrizzwalze hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
begin
 if merke1<0
  then showmessage('Du darfst nur einmal pro Frage antworten!')
 else merke1:=merke1+1 and
   if merke1=1
    then begin Richtig:=Richtig+1;
               showmessage('Richtig!');
         end
    else if merke1>1
         then
           begin showmessage('Du darfst nur einmal pro Frage antworten!');
         end;
end;

vielleicht versuchst Du, die begin .. end überall einzusetzen, auch wenn es übertrieben erscheint:

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if merke1<0 then 
  begin
    showmessage('Du darfst nur einmal pro Frage antworten!');
  end else 
  begin
    merke1:=merke1+1// oder: inc(merke1);
    if merke1=1 then 
    begin 
      Richtig:=Richtig+1;
      showmessage('Richtig!');
    end else 
    begin 
      showmessage('Du darfst nur einmal pro Frage antworten!');
    end;
  end;
end;

// sollte merke1 als globale Variable vor der Clickprozedur auf einem Wert von 0 stehen braucht man die Abfrage (if merke1>1) nicht, da ja Merke1 nach Addition entweder 1 oder größer 1 ist. Allerdings wird dann die Abfraqge if merke1<0 überflüssig und es geht dann so:

procedure TForm1.Button1Click(Sender: TObject);
begin
   merke1:=merke1+1;  // oder inc(merke1);
   if merke1=1 then 
   begin 
     Richtig:=Richtig+1;
     showmessage('Richtig!');
   end else 
   begin 
     showmessage('Du darfst nur einmal pro Frage antworten!');
   end;
end;


Das and war definitiv falsch gesetzt!!!

Moderiert von user profile iconNarses: Zitat gekürzt.