Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TCheckBox und das Bedingungsproblem (https://www.delphipraxis.net/197925-tcheckbox-und-das-bedingungsproblem.html)

iTzElKay 19. Sep 2018 09:43

Delphi-Version: 10.2 Tokyo

TCheckBox und das Bedingungsproblem
 
Moinsen Männers

und zwar habe ich das Problem, dass ich derzeit eine Art Kniffel mit Checkboxen erstelle. Jetzt ist das Ding, dass diese Checkbox nur Disabled und Gecheckt sein sollen, wenn das Labelfeld einen Wert zugewiesen bekommen hat. Das heißt, dass wenn nicht gewürfelt wurde, soll eine MessageBox auftauchen. Das tut es auch, aber zweimal, da sich durch das ( Sender as TCheckBox ).Checked := false; das OnClick doppelt auslöst. Wie kann ich nun den Code umschreiben, dass er es nicht mehr tut?
Code:
function TKnuffel.wurdeGewuerfelt : boolean;
begin
  if wuerfel1BBtn.Caption = '0' then
  begin
     result := false;
     Application.MessageBox('Bitte würfeln Sie erst!', 'Hinweis', mb_OK);
  end
  else
     result := true;
end;
Code:
 if ( Sender = player1CB3Pasch ) then
    if wurdeGewuerfelt = false then begin
    ( Sender as TCheckBox ).Enabled := true;
    ( Sender as TCheckBox ).Checked := false;
    end
    else if wurdeGewuerfelt = true then
    if dreierPasch = true then begin
      wert1Label3Pasch.Caption := IntToStr( alleWuerfelErgebnis );
      ergebnisUnten1();
      ( Sender as TCheckBox ).Enabled := false;
      wuerfelReset();

      if niSpielerAnz = 2 then begin
        spielerWechsel( Sender as TObject );
        wuerfelReset();
      end;
    end
    else if dreierPasch = false then
    begin
      MessageBox(0, 'Es ist kein Dreier Pasch vorhanden. Bitte wählen Sie etwas anderes!', 'Hinweis', MB_OK);
      ( Sender as TCheckBox ).Checked := false;
    end;

KodeZwerg 19. Sep 2018 09:54

AW: TCheckBox und das Bedingungsproblem
 
Zitat:

Zitat von iTzElKay (Beitrag 1413576)
Code:
 if ( Sender = player1CB3Pasch ) then
    if wurdeGewuerfelt = false then begin
    ( Sender as TCheckBox ).Enabled := true;
    ( Sender as TCheckBox ).Checked := false;
    end
    else begin
    if dreierPasch = true then begin
      wert1Label3Pasch.Caption := IntToStr( alleWuerfelErgebnis );
      ergebnisUnten1();
      ( Sender as TCheckBox ).Enabled := false;
      wuerfelReset();

      if niSpielerAnz = 2 then begin
        spielerWechsel( Sender as TObject );
        wuerfelReset();
      end;
     end;
    end
    else if dreierPasch = false then
    begin
      MessageBox(0, 'Es ist kein Dreier Pasch vorhanden. Bitte wählen Sie etwas anderes!', 'Hinweis', MB_OK);
      ( Sender as TCheckBox ).Checked := false;
    end;

So sollte es nur einmal passieren.

iTzElKay 19. Sep 2018 09:54

AW: TCheckBox und das Bedingungsproblem
 
Ich habe das Problem gefunden, haha. Probieren geht über Studieren!
Code:
if ( Sender as TCheckBox ).Checked then
anstatt:

Code:
if ( Sender = player2CB3Pasch )

DeddyH 19. Sep 2018 10:05

AW: TCheckBox und das Bedingungsproblem
 
[OT] Tu Dir selbst einen Gefallen und gewöhn Dir Vergleiche mit true oder false wieder ab, das kann sonst zu unerwarteten Fehlern führen.
Delphi-Quellcode:
if Dings = true then
  Code;
->
Delphi-Quellcode:
if Dings then
  Code;
und
Delphi-Quellcode:
if Dings = false then
  Code;
->
Delphi-Quellcode:
if not Dings then
  Code;
Grund: false ist mit 0 definiert und true mit 1. Es kann aber auch vorkommen, dass z.B. API-Funktionen von Windows als true eine -1 zurückgeben, dann schlägt der Vergleich fehl, und das ganze Programm macht Mist.
[/OT]

iTzElKay 19. Sep 2018 10:59

AW: TCheckBox und das Bedingungsproblem
 
Okay, wusste ich nicht - danke für den Tipp!;)

freimatz 20. Sep 2018 14:47

AW: TCheckBox und das Bedingungsproblem
 
Zitat:

Zitat von DeddyH (Beitrag 1413587)
Tu Dir selbst einen Gefallen und gewöhn Dir Vergleiche mit true oder false wieder ab, das kann sonst zu unerwarteten Fehlern führen.

Richtig (allermeist)
Zitat:

Zitat von DeddyH (Beitrag 1413587)
Grund: false ist mit 0 definiert und true mit 1. Es kann aber auch vorkommen, dass z.B. API-Funktionen von Windows als true eine -1 zurückgeben, dann schlägt der Vergleich fehl, und das ganze Programm macht Mist.

Falsch.
false ist als erster Wert des Aufzählungstyp Boolean definiert, true als zweiter. (Wobei bei der RTTI und TValue noch Spezialbehandlungen drin sind.)
Der Ordinalwert ist dann natürlich schon 0 bzw 1.
Wenn eine Funktion -1 zurückliefert, dann macht nicht das Programm Mist sondern der Compiler meldet einen Fehler.
(Gilt nur sofern mit false und true die in unit System definierten gemeint sind)

stahli 20. Sep 2018 14:53

AW: TCheckBox und das Bedingungsproblem
 
Hi,

ich kenne Deinen Programmier-Kontext nicht, aber evtl. kannst Du auch mal versuchen, die Businesslogik von der GUI zu trennen.

Das ist im ersten Moment etwas schwieriger, bringt aber mehr Übersicht in das Ganze.

Du könntest eine Komponente für die Businesslogik erstellen, die alle Daten und Methoden beinhaltet:

Delphi-Quellcode:
TKnuffelBL = class
  WurdeGewürfelt: Boolean;
  procedure Würfeln;
end;
Alle Daten und Methoden zur Datenänderung gehören dann in die Klasse.

Im Formular benutzt Du dann nur noch eine Klasseninstanz:

Delphi-Quellcode:
KuffelBL: TKnuffelBL;
...
KnuffelBL := TKnuffelBL.Create;
Alle Komponenten, greifen dann auf die BL-Komponente zu:


Delphi-Quellcode:
CheckBox1.Enabled := KnuffelBL.WurdeGewürfelt;
...
procedure Button1.OnClick(...)
begin
  KnuffelBL.Würfeln.
end;

So hast Du schon mal eine schöne Trennung von Geschäftslogik und Benutzerschnittstelle.
Das macht es später einfacher, das Projekt auszubauen.

Am Anfang erscheint es vielleicht etwas kompliziert, aber es lohnt sich, sich mal mit dem Konzept auseinander zu setzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 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