Forum: PC-Programmierung C++ Programmierung Button/ Panel


von Florian (Gast)


Lesenswert?

Hallo,

ich muss ein kleines Programm schreiben, das wie folgt ablaufen soll:

Es gibt 2 Buttons, deren Zustand OFF oder On sind.

Nun soll, wenn beide Buttons ON sind die Farbe des Panels Grün werden. 
Wenn die Zustände ungleich sind Schwarz.

Habe die Variablen global vergeben. Das Panel muss ich ja auch global 
reinschreiben, aber es kommt immer eine Fehlermeldung.

Bitte um Hilfe.

SG Florian

1
__fastcall TForm1::TForm1(TComponent* Owner)
2
        : TForm(Owner)
3
{
4
5
}
6
//-------------------------------------------------------------------------
7
static bool x = false;
8
static bool a = false;
9
if  ((a = true)&&(x=true))
10
      Panel1->Color=clGreen;
11
12
void __fastcall TForm1::Button3Click(TObject *Sender)
13
{
14
15
if (a == true)
16
{
17
    Button3->Caption = "On";
18
}
19
 else
20
{
21
   Button3->Caption = "Off";
22
   Panel1->Color=clBlack;
23
24
}
25
a = !a;
26
27
void __fastcall TForm1::Button4Click(TObject *Sender)
28
{
29
30
if (x == true)
31
{
32
    Button4->Caption = "On";
33
34
             //   if  ((a = true)&&(x=true))
35
            //    Panel1->Color=clGreen;
36
}
37
 else
38
{
39
   Button4->Caption = "Off";
40
   Panel1->Color=clBlack;
41
42
}
43
x = !x;
44
}

von Karl H. (kbuchegg)


Lesenswert?

saubere und konsequente Code Einrückung ist nicht einfach nur 
Selbstzweck!
1
__fastcall TForm1::TForm1(TComponent* Owner)
2
        : TForm(Owner)
3
{
4
5
}
6
//-------------------------------------------------------------------------
7
static bool x = false;
8
static bool a = false;
9
10
if  ((a = true)&&(x=true))
11
      Panel1->Color=clGreen;
Huch, was macht der Code da?
In C++ muss Code innerhalb einer Funktion stehen!

von Karl H. (kbuchegg)


Lesenswert?

1
__fastcall TForm1::TForm1(TComponent* Owner)
2
        : TForm(Owner)
3
{
4
}
5
//-------------------------------------------------------------------------
6
7
static bool x = false;
8
static bool a = false;
9
10
if  ((a = true)&&(x=true))
11
      Panel1->Color=clGreen;
12
13
void __fastcall TForm1::Button3Click(TObject *Sender)
14
{
15
  if (a == true)
16
  {
17
    Button3->Caption = "On";
18
  }
19
  else
20
  {
21
    Button3->Caption = "Off";
22
    Panel1->Color=clBlack;
23
  }
24
25
  a = !a;
26
27
28
  void __fastcall TForm1::Button4Click(TObject *Sender)
29
  {
30
    if (x == true)
31
    {
32
      Button4->Caption = "On";
33
34
      //   if  ((a = true)&&(x=true))
35
      //    Panel1->Color=clGreen;
36
    } 
37
    else
38
    {
39
      Button4->Caption = "Off";
40
      Panel1->Color=clBlack;
41
    }
42
    x = !x;
43
  }

Sieh dir das ganze nochmal an.
da fehlt recht offensichtlich eine schliessende } in der Funktion 
Button3Click. Nämlich die, die die Funtion beendet. Durch dein 
chaotisches Einrücken siehst du das natürlich nicht. Aber wenn man mal 
sauber einrückt, dann sieht man es! In jeder Funktion muss die letzte } 
wieder am linken Rand sein, sonst stimmt was nicht und man muss sich auf 
die Suche begeben, wo man eine { oder eine } verbummelt hat.
Grundvoraussetzung ist aber saubere Einrückung. Bei jeder { geht es um 2 
Leerzeichen weiter nach rechts rein, bei jeder } geht es wieder um 2 
Leerzeichen weiter nach links raus. Dann sieht man auch was.

Exzessize unmitivierte Leerzeilen kannst du dir hingegen sparen. Die 
ziehen den Code nur in die Länge und sonst nichts. Eine Leerzeile kommt 
rein, wenn ein neuer Gedankengang beginnt. Das kann innerhalb einer 
Funktion sein, kann aber auch beim Beginn einer neuen Funktion sein. Wie 
auch immer: Achte auf gut lesbaren Code, bei dem man die Struktur auch 
aus 2 Meter Entfernung noch sieht, dann siehst du derartige Fehler 
gleich viel besser.

von Sven B. (scummos)


Lesenswert?

Überhaupt, was ist den "a = true && x = true" für ein Murks? Das setzt a 
auf true und x auf true. Was du willst ist wohl eher "a && x".

von Karl H. (kbuchegg)


Lesenswert?

PS:
Sieh von solchen Dingen ab

  if( a == true )

das bringt nichts. A ist sowieso bei dir ein bool. Den musst du in C++ 
nicht auf true vergleichen. Nenn lieber die Variable besser.

static bool button1Pressed = false;

...


   if( button1Pressed )
      ....


da haben alle mehr davon, als wie wenn du sinnlose Vergleiche machst. 
Das if interessiert sich nur dafür, ob der Ausdruck in der Klammer true 
oder false ergibt. Ob das jetzt so ist, weil die boolsche Variable 
selbst schon true oder false ist, oder ob du da noch einen Vergleich 
machst, das ist dem if völlig wurscht. Das if interessiert nur, welches 
Ergebnis der Ausdruck insgesamt hat, true oder false. Ob dazu ein 
Vergleiche notwendig ist oder nicht, ist dem if Powidel.

Und noch ein PS:
Du sollst nicht selbst über den Status des Buttons Buch führen, sondern 
den Button selbst befragen, ob er gedrückt ist oder nicht! Dann kann 
auch nie irgdnwas durcheinander kommen. Wenn du dieselbe 'Information' 
wie der Button selbst noch einmal speicherst (denn der Button führt ja 
selber auch darüber Buch ob er gedrückt ist oder nicht, schliesslich 
muss er sich ja anders hinmalen), dann läufst potentiell in das 
Datenbank Dlemma: Speichere dieselbe Information 5 mal ab, und alle 5 
Kopien werden irgendwann nicht mehr übereinstimmen. Man speichert ein 
und dieselbe Information nur ein einziges mal, dann kann da auch nichts 
inkonsistent sein.

von Florian (Gast)


Lesenswert?

Danke,

habe die fehlende Klammer gefunden, jedoch kommt der Fehler wieder.

Wie müsste ich das umschreiben, dass ich das Panel1 nur dann grün ist, 
wenn beide auf ON sind?

Die Deklaration müsste ja stimmen? Jedoch weiß ich nicht wo ich das 
hineinschreibe, weil im Button selber hat es meiner Meinung nach auch 
nicht verloren? Des wegen müsste ja wenn beide On den Wert Global 
weitergeben?

if  ((a = true)&&(x=true))
      Panel1->Color=clGreen;

von Sven B. (scummos)


Lesenswert?

Schrieb ich doch schon: Du willst (a && x).

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:

> Die Deklaration müsste ja stimmen? Jedoch weiß ich nicht wo ich das
> hineinschreibe, weil im Button selber hat es meiner Meinung nach auch
> nicht verloren?

Der Button weiß selber, ob er gedrückt ist oder nicht.
Du brauchst ihn nur zu 'befragen'. Welche Funktion des Buttons dir diese 
Information liefert steht in der Doku.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Florian schrieb:
>
>> Die Deklaration müsste ja stimmen? Jedoch weiß ich nicht wo ich das
>> hineinschreibe, weil im Button selber hat es meiner Meinung nach auch
>> nicht verloren?
>
> Der Button weiß selber, ob er gedrückt ist oder nicht.
> Du brauchst ihn nur zu 'befragen'. Welche Funktion des Buttons dir diese
> Information liefert steht in der Doku.

Bzw. hat der sicher ein 'Property' (so wie er auch ein Caption-Property 
hat), welches dir mitteilt, ob er gedrückt ist oder nicht.

von Karoly (Gast)


Lesenswert?

Florian schrieb:
> if  ((a = true)&&(x=true))
>
>       Panel1->Color=clGreen;

Hallo Florian,

definiere eine Funktion z.B. Check()

void __fastcall TForm1::Check()
{
 if  ((a == true)&&(x==true))

       Panel1->Color=clGreen;
}
oder
void __fastcall TForm1::Check()
{
 if  (a && x)

       Panel1->Color=clGreen;
}

und rufe sie auf von beiden Button_click Ereignissen als letzter Befehl.
Nicht vergessen die Funktion im Header zu deklarieren.
private void __fastcall Check(void);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.