![]() |
Button wird sichtbar
Hallo Community,
ich habe folgende Frage: Ich habe ein Programm geschrieben, dass vorsieht, das ein Button sichtbar wird bzw. eingeschaltet wird, wenn eine Variable einen Wert über 0 hat. Ist der Wert aber nun gleich 0, soll dieser ausgeschaltet bleiben und dafür ein anderer Button aktiviert werden. Nun klappt das leider nicht so ganz. Der Code sieht so aus:
Code:
Ich hoffe ihr kennt meinen Fehler.
procedure TForm1.B_100erClick(Sender: TObject);
begin Preis:=Preis-100; L_Rest.Caption:=inttostr(Preis)+'€'; if Preis <=0 then begin L_Wechsel.Caption:='Ihr Wechselgeld: '+inttostr((Preis-Wechsel)*-1)+'€'; L_Rest.Caption:=inttostr(0)+'€'; Wechsel:=Wechsel+100; B_5er.Enabled:=false; B_10er.Enabled:=false; B_20er.Enabled:=false; B_50er.Enabled:=false; B_100er.Enabled:=false; B_200er.Enabled:=false; B_500er.Enabled:=false; B_Wechsel.Enabled:=false; B_zumTicket.Enabled:=true; end; if Wechsel >0 then begin B_Wechsel.Enabled:=true; B_zumTicket.Enabled:=false; end; end; Danke schonmal justMatzi |
AW: Button wird sichtbar
Zitat:
|
AW: Button wird sichtbar
Nur eine Anmerkung am Rande. Das:
Delphi-Quellcode:
ist u. U. interessanter wenn man es so löst:
if Preis <=0 then
begin ... B_Wechsel.Enabled:=false; B_zumTicket.Enabled:=true; end; if Wechsel >0 then begin B_Wechsel.Enabled:=true; B_zumTicket.Enabled:=false; end;
Delphi-Quellcode:
Man spart sich die doppelte Pflege.
if Preis <=0 then
begin ... end; B_Wechsel.Enabled := Wechsel > 0; B_zumTicket.Enabled := not B_Wechsel.Enabled; |
AW: Button wird sichtbar
Also ich klicke mit Buttons den Betrag von Preis runter. Wenn die auf genau 0 auskommt, schaltet sich der Button B_Wechsel ein, obwohl er das nicht sollte. Wenn dabei genau 0 rauskommt, soll nur der Button B_zumTicket aktiviert werden, wobei der Button B_Wechsel deaktiviert bleibt.
Gruß justMatzi |
AW: Button wird sichtbar
Das macht er auch. Hier:
Delphi-Quellcode:
Was ist aber damit?
if Preis <=0 then
begin ... B_Wechsel.Enabled:=false; B_zumTicket.Enabled:=true; end;
Delphi-Quellcode:
Beide Abfragen sind in einer Prozedur. Die erste Anfrage mit Preis <= 0 stellt Wechsel.Enabled auf False, dann aber kommt die zweite Anfrage mit Wechsel > 0. Ist also der Pries <= 0, aber der Wechsel > 0, dann wird zwar zuerst der Button Wechsel abgeschaltet, dann aber gleich wieder eingeschaltet.
if Wechsel >0 then
begin B_Wechsel.Enabled:=true; B_zumTicket.Enabled:=false; end; |
AW: Button wird sichtbar
Hallo Popov,
das ist mir schon klar und das ist auch eigentlich Absicht. In der Prozedur steht ja, dass Wechsel einen höheren Wert bekommt, wenn der Preis, welcher bei jedem Klick verringert wird, unter 0 fällt, bzw. gleich 0 ist. Das soll letztendlich eine Art Wechselgeld sein, welches man durch B_Wechsel entnehmen kann. Nun ist es aber ja blöd, wenn B_zumTicket deaktiviert ist, selbst wenn das Wechselgeld 0 ist. Ich muss also, auch wenn die Variable Wechsel 0 ist, erst B_Wechsel betätigen, um B_zumTicket zu aktivieren. Und das soll halt nicht sein, wenn Wechsel =0 ist. Gruß justMatzi |
AW: Button wird sichtbar
Zitat:
|
AW: Button wird sichtbar
Geh in die erste Zeile der oberen Prozedur, also in
Delphi-Quellcode:
. Drücke da auf die Funktionstaste F5. Es wird eine Haltemarke gesetzt. Drücke danach STRG+ALT+W. Es öffnet sich das Debug-Fenster "Überwachte Ausdrücke". Zu diesem Zeitpunkt ist es noch leer. Drücke STRG+A und gibt dort "Preis" ein, dann "Wechsel", dann "B_Wechsel.Enabled", dann "B_zumTicket.Enabled" und noch alles was du wissen willst. Starte das Programm. Es bleibt an der Haltemarke stehen.
Preis:=Preis-100;
Mit der Funktionstaste F7 kannst du Zeile für Zeile durchgehen und dabei die überwachten Ausdrücke beobachten, bzw. welchen Wert sie zu dem Zeitpunkt haben. Vielleicht findest du da Antworten auf deine Fragen. |
AW: Button wird sichtbar
Ich denke auch, es liegt hier ganz einfach ein Rechenfehler vor. Einfach mal wie Popov schon sagte die Variablenwerte anschauen, und nachvollziehen was das Programm an der Stelle macht. Was ist denn der Anfangswert für Wechsel? Wenn du den plus 100 setzt und der ist schon größer als -100, wird der genannte Effekt auftreten.
OT: Kann es sein, dass der Server noch auf Winterzeit eingestellt ist, oder wird der nicht umgestellt? |
AW: Button wird sichtbar
Du hast die Variablen nicht wirklich nach ihrer Funktion benannt.
Der Preis ist der Preis und der kann nicht geringer werden, nur weil ich dort Geld gebe. Und das Wechselgeld kann ich auch nicht um den gegebenen Betrag erhöhen. Auch wenn die Berechnung irgendwie funktioniert, so ist es doch sehr schwer nachzuvollziehen, weil man sich anhand der Begrifflichkeit durch den Code hangelt - vor allem, weil man den nicht selber geschrieben hat. Aus Erfahrung kann ich dir schon mal sagen, dass es dir wahrscheinlich nach einer gewissen Zeit genauso ergehen wird. Ich würde dir empfehlen die Variablen (oder besser Eigenschaften)
Delphi-Quellcode:
und
Preis
Delphi-Quellcode:
zu nennen.
Gezahlt
Die Bestimmung ob genug bezahlt worden ist lautet dann
Delphi-Quellcode:
und klingt irgendwie natürlicher ;)
if Gezahlt >= Preis then
|
AW: Button wird sichtbar
Hier ein Simulator:
Delphi-Quellcode:
Man bracht zwei Buttons und Labels. Danach kann man tasten was passiert wenn man etwas angibt.
procedure TForm1.Button1Click(Sender: TObject);
const GBGN = 'Gibt einen Betrag größer Null ein:'; HHS = 'Himmi Herrgott Sakrament, Wert größer Null'; var Abzug: Integer; begin Preis := StrToIntDef(InputBox('Preis angeben', GBGN, '100'), 0); if Preis <= 0 then raise Exception.Create(HHS); Abzug := StrToIntDef(InputBox('Abzug (Ersatz für Button mit Preis) angeben', GBGN, '100'), 0); if Abzug <= 0 then raise Exception.Create(HHS); //---------------------------------------------------------------------------- Preis := Preis - Abzug; //100 erstetzt durch Variable Abzug; L_Rest.Caption:=inttostr(Preis)+'€'; if Preis <=0 then begin L_Wechsel.Caption := 'Ihr Wechselgeld: ' + IntToStr((Preis-Wechsel)*-1)+'€'; L_Rest.Caption := IntToStr(0)+'€'; Wechsel := Wechsel + Abzug; //100 erstetzt durch Variable Abzug; //... das ist hier unwichtig B_Wechsel.Enabled := False; B_zumTicket.Enabled := True; end; if Wechsel > 0 then begin B_Wechsel.Enabled := True; B_zumTicket.Enabled := False; end; end; Also es ist mir bisher nicht gelungen was der TE vor hatte. Der Button bleib immer an. |
AW: Button wird sichtbar
Zitat:
|
AW: Button wird sichtbar
So, ich habe jetzt mal versucht nachzuvollziehen, was Du genau meinst:
Der Preis ist eigenlich der noch zu bezahlende Betrag, der immer kleiner wird. Wenn man alles abbezahlt hat und kein Wechselgeld übrig bleibt, soll sofort der zum_Ticket- Button freigeschaltet werden, wenn zu viel bezahlt wurde und Wechselgeld herausgegeben wird, soll der Wechselgeld- Button freigeschaltet werden. Das Problem ist, dass du das Wechselgeld extra zählst. Eigentlich ist es ja nichts anderes als das noch zu zahlende und zwar negativ. Du sagst gleich Wechselgeld:= Wechselgeld +100; (falls jemand noch mal Bezahlt obwohl alles schon bezahlt ist) wo das Wechselgeld eigentlich 0 sein müsste. Deswegen gehört stattdessen dort eigentlich ein Wechselgeld:= -Preis;. Damit bekommst du den Betrag heraus, der zuviel gezahlt wurde. Soweit meine Interpretation des Quellcodes. Trotz alledem wäre es hier angebracht das ganze anders zu lösen, so dass Du 3 Möglichkeiten hast (>0, 0 und <0) und nicht erst den Button anschaltest und dann wieder ausschaltest. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:07 Uhr. |
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