AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TCheckBox und das Bedingungsproblem

Ein Thema von iTzElKay · begonnen am 19. Sep 2018 · letzter Beitrag vom 20. Sep 2018
Antwort Antwort
iTzElKay

Registriert seit: 11. Sep 2018
Ort: Vlotho, im wundervollen NRW.
25 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

TCheckBox und das Bedingungsproblem

  Alt 19. Sep 2018, 10:43
Delphi-Version: 10.2 Tokyo
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;
Leon
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TCheckBox und das Bedingungsproblem

  Alt 19. Sep 2018, 10:54
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
iTzElKay

Registriert seit: 11. Sep 2018
Ort: Vlotho, im wundervollen NRW.
25 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: TCheckBox und das Bedingungsproblem

  Alt 19. Sep 2018, 10:54
Ich habe das Problem gefunden, haha. Probieren geht über Studieren!
Code:
if ( Sender as TCheckBox ).Checked then
anstatt:

Code:
if ( Sender = player2CB3Pasch )
Leon
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: TCheckBox und das Bedingungsproblem

  Alt 19. Sep 2018, 11:05
[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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
iTzElKay

Registriert seit: 11. Sep 2018
Ort: Vlotho, im wundervollen NRW.
25 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: TCheckBox und das Bedingungsproblem

  Alt 19. Sep 2018, 11:59
Okay, wusste ich nicht - danke für den Tipp!
Leon
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TCheckBox und das Bedingungsproblem

  Alt 20. Sep 2018, 15:47
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)
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)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TCheckBox und das Bedingungsproblem

  Alt 20. Sep 2018, 15:53
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 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