Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   If ...and... and... and... then (https://www.delphipraxis.net/215158-if-then.html)

HCB 19. Mai 2024 09:48

Delphi-Version: 12 Athens

If ...and... and... and... then
 
Hallo,
bin mal wieder am grübeln: Es sind 4 checkboxen die wenn alle unchecked sind der Wert einer Variable auf 0 gesetzt werden soll. Ist jeweils z.B. nur eine oder zwei gecheckt erhält dieser einen anderen Wert. Beispiel: Nichts gecheckt = 0, nur Rabatt aktiv = 2, nur Provision = 4, Rabatt+Provision aktiv = 6 usw.
Jetzt wollte ich das mit diesem Statement abfragen:
Delphi-Quellcode:
if (cb_rabatt.Checked= false) and (cb_StockOn.Checked:= false) and (cb_provision.Checked= false) and (cb_Serials.Checked= false)
then DataMod.Q_sArtikelArtOptionen.Value:= 0;
Ich habe es schon mit oder ohne Klammern versucht, nach dem and nochmal if eingefügt. Komme nicht klar. Mal wird das and moniert das andere Mal nimmt Delphi die 0 nicht.
Kann man wohl gar nicht mehrere and beim ifThenElse Statement verwenden?
Über einen Lösungsvorschlag wäre ich sehr erfreut.

LG Harry

Papaschlumpf73 19. Mai 2024 09:58

AW: If ...and... and... and... then
 
Hier muss der Doppelpunkt raus:
Delphi-Quellcode:
(cb_StockOn.Checked:= false)
Gleichheitszeichen mit Doppelpunkt ist es eine Zuweisung; ohne Doppelpunkt ist es der Vergleich, den du hier brauchst.

Und dann müsste noch ein
Delphi-Quellcode:
else
am Ende eingefügt werden, was passieren soll, wenn mind. eins checked=true ist.

HCB 19. Mai 2024 10:12

AW: If ...and... and... and... then
 
Danke Papaschlumpf73,
manchmal sieht man den Wald vor lauter Bäume nicht...:oops:

Kas Ob. 19. Mai 2024 10:19

AW: If ...and... and... and... then
 
Hi,

I may not fully understand the question right, but have you tried this approach
Code:
var
  SettingsInt: Integer;
begin
  SettingsInt := Ord(cb_rabatt.Checked) + Ord(cb_StockOn.Checked) shl 1 + Ord(cb_provision.Checked) shl 2 + Ord(cb_Serials.Checked) shl 3;
every combination will result in different value in the range [0..15].

Also you can switch to enums with a set to enhance handling and it is better readable from the enum names.

DeddyH 19. Mai 2024 12:47

AW: If ...and... and... and... then
 
Lesbarer fände ich persönlich so etwas:
Delphi-Quellcode:
type
  TMyDataItems = (Discount, StockOn, Provision, Serials);

  TMyData = set of TMyDataItems;

  TfrmTest = class(TForm)
    cbDiscount: TCheckBox;
    cbStockOn: TCheckBox;
    cbProvision: TCheckBox;
    cbSerials: TCheckBox;
    ...
  private
    { Private-Deklarationen }
    function GetData: TMyData;
  public
    { Public-Deklarationen }
  end;

...

function TfrmTest.GetData: TMyData;
begin
  Result := [];
  if cbDiscount.Checked then
    Include(Result, TMyDataItems.Discount);
  if cbStockOn.Checked then
    Include(Result, TMyDataItems.StockOn);
  if cbProvision.Checked then
    Include(Result, TMyDataItems.Provision);
  if cbSerials.Checked then
    Include(Result, TMyDataItems.Serials);
end;

jaenicke 19. Mai 2024 12:49

AW: If ...and... and... and... then
 
Zitat:

Zitat von HCB (Beitrag 1536846)
Delphi-Quellcode:
if (cb_rabatt.Checked= false) and (cb_StockOn.Checked:= false) and (cb_provision.Checked= false) and (cb_Serials.Checked= false)
then DataMod.Q_sArtikelArtOptionen.Value:= 0;

Würdest du so reden? ;-) Wenn "das Wetter ist schön" nicht wahr ist, dann bleibe ich zu Hause.

Viel einfacher:
Delphi-Quellcode:
if not cb_rabatt.Checked and not cb_StockOn.Checked and not cb_provision.Checked and not cb_Serials.Checked then
  DataMod.Q_sArtikelArtOptionen.Value := 0;
Zitat:

Zitat von HCB (Beitrag 1536846)
Ist jeweils z.B. nur eine oder zwei gecheckt erhält dieser einen anderen Wert. Beispiel: Nichts gecheckt = 0, nur Rabatt aktiv = 2, nur Provision = 4, Rabatt+Provision aktiv = 6 usw.

Das ist allerdings etwas ganz anderes als dein Code macht.

Deine Beschreibung ist:
Delphi-Quellcode:
  Value := 0;
  if cb_rabatt.Checked then
     Value := Value + 2;
  if cb_StockOn.Checked then
     Value := Value + 4;
  if cb_provision.Checked then
     Value := Value + 8;
  if cb_Serials.Checked then
     Value := Value + 16;
  DataMod.Q_sArtikelArtOptionen.Value := Value;
Oder du machst es wie DeddyH geschrieben hat.

Benmik 19. Mai 2024 13:10

AW: If ...and... and... and... then
 
Und wäre nicht
Delphi-Quellcode:
if not (cb_rabatt.Checked or cb_StockOn.Checked or cb_provision.Checked or cb_Serials.Checked) then
  DataMod.Q_sArtikelArtOptionen.Value := 0;
noch etwas übersichtlicher?

TomyN 19. Mai 2024 21:07

AW: If ...and... and... and... then
 
Ich würde Konstanten definiern und jaenikes Vorschlag verwenden.

Delphi-Quellcode:
Const
  O_RABATT = $01;
  O_STOCKON = $02;
  O_PROVISION = $04;
  O_SERIALS  = $08;

Procedure
  Value := 0;
  if cb_rabatt.Checked then
     Value := Value OR O_RABATT; //Hier ginge auch value := O_RABATT;
  if cb_StockOn.Checked then
     Value := Value OR O_STOCKON;
  if cb_provision.Checked then
     Value := Value OR O_PROVISION;
  if cb_Serials.Checked then
     Value := Value OR O_SERIALS;
  DataMod.Q_sArtikelArtOptionen.Value := Value;
end;

Benmik 20. Mai 2024 17:22

AW: If ...and... and... and... then
 
Und welche Vorteile hat so ein ausgedehnter Code gegenüber einem schlichten Zweizeiler, der augenblicklich eingängig ist?

Uwe Raabe 20. Mai 2024 17:52

AW: If ...and... and... and... then
 
Zitat:

Zitat von Benmik (Beitrag 1536875)
Und welche Vorteile hat so ein ausgedehnter Code gegenüber einem schlichten Zweizeiler, der augenblicklich eingängig ist?

Na ja, er setzt den gewünschten Wert gleich für alle Kombinationen richtig, während der Zweizeiler lediglich den 0-Fall abdeckt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr.
Seite 1 von 2  1 2      

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