![]() |
Gibt es einen Toggle Befehl ?
Hallo
Gibt es einen Toggle Befehl ? Ich habe das jetzt so gemacht :
Delphi-Quellcode:
Gibt es da irgend einen Befehl der das irgenwie macht ?if DLED1.checked then DLED1.checked:=false else DLED1.checked:=true; MfG |
Re: Gibt es einen Toggle Befehl ?
Im Endeffekt nicht, du kannst deinen Code aber noch deutlich zusammenfassen :zwinker:
Delphi-Quellcode:
DLED1.checked := not DLED1.checked;
|
Re: Gibt es einen Toggle Befehl ?
DLED1.checked:=not DLED1.checked;
|
Re: Gibt es einen Toggle Befehl ?
Moin ebber,
Du musst aber aufpassen, dass Du das nicht im OnClick-Ereignis der Checkbox machst, da dieses durch das Setzen der Eigenschaft Checked ausgelöst wird. |
Re: Gibt es einen Toggle Befehl ?
Zitat:
Allerdings wäre es auch reichlich sinnfrei, es dort einzubauen, weil ein Klick auf die CheckBox den Toggle ja schon von ganz alleine bewirkt. :wink: |
Re: Gibt es einen Toggle Befehl ?
Zitat:
wenn man einen Befehl haben möchte und es gibt ihn noch nicht, dann macht man ihn eben (die Logik wurde ja schon erklärt):
Delphi-Quellcode:
Gruss Reinhard
procedure Toggle (var B : boolean);
begin B := not B; end; ... Toggle (DLED1.checked); |
Re: Gibt es einen Toggle Befehl ?
Zitat:
[Fehler] E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden |
Re: Gibt es einen Toggle Befehl ?
Delphi-Quellcode:
function Toggle(const b:boolean):boolean;
begin result := not b; end; DLED1.checked := Toggle(DLED1.checked); Das sollte "mal eben" funktionieren :wink: |
Re: Gibt es einen Toggle Befehl ?
Ganz ehrlich, Ghostwalker: Ehe ich eine Toggle-Funktion schreibe, nehme ich doch lieber den Vorschlag von Katja und Axel:
Delphi-Quellcode:
Keine Frage, es geht so wie du schreibst, aber sinngemäß ist Toggle für mich eine Prozedur.
with DLED1 do Checked := not Checked;
Freundliche Grüße |
Re: Gibt es einen Toggle Befehl ?
Zitat:
Delphi-Quellcode:
ja nicht wirklich praktischer als
DLED1.checked := Toggle(DLED1.checked);
Delphi-Quellcode:
;)
DLED1.checked := not DLED1.checked;
|
Re: Gibt es einen Toggle Befehl ?
Ich will auch, ich will auch ... :-D
Prozedur:
Delphi-Quellcode:
Beschränkt auf TCheckBox natürlich.
procedure Toggle(aBox: TCheckBox);
begin if aBox is TCheckBox then aBox.Checked := not aBox.Checked; end; ... Toggle(DLED1); |
Re: Gibt es einen Toggle Befehl ?
Zitat:
stimmt, beim Aufruf mit einer CheckBox - aber das finde ich eine Inkonsistenz der Borländer: wenn ich einer Boolschen Variablen einen Wert zuweisen kann, dann kann sie nicht im Ernst konstant sein. Das ist der gleiche Unsinn wie mit den typisierten Konstanten, die in Wirklichkeit initialisierte Variable sind. Der Umgang von Borland mit dem Begriff "const" hat nach meinem Gefühl schon Hackerniveau, so etwas gibt es meines Wissens in anderen Sprachen nicht. Der wahre Grund für den Fehler ist, dass der Compiler statt der einfachen Zuweisung die Methode SetChecked einbauen muss, dazu muss er wissen, dass Checked eine Property von TCheckBox ist, und das ist zur Compiletime eben nicht bekannt. Daher hat sich Borland wohl den Trick mit dem unechten Const einfallen lassen. Die Tatsache, dass Checked eine Property ist und keine einfache Variable, wirkt sich aber auch in anderen Fällen aus, dann aber ohne Fehlermeldung:
Delphi-Quellcode:
ist korrekt und wird compiliert (auch der Aufruf mit TCheckBox.Checked), funktioniert aber nicht.
procedure Toggle (const B : Boolean);
var BPtr : PBoolean; begin BPtr := @B; BPtr^ := not B; end; Gruss Reinhard |
Re: Gibt es einen Toggle Befehl ?
Danke an euch alle. :thumb:
|
Re: Gibt es einen Toggle Befehl ?
Zitat:
Für die Anhänger von Prozeduren hat Reinhard ja die richtige Vorgehensweise aufgezeigt :) |
Re: Gibt es einen Toggle Befehl ?
Das:
Delphi-Quellcode:
kann garnicht funktionieren, da die Direktive 'const' CallByValue (Worth) bewirkt (also genauso wie ohne Direktive, ausser, dass der Wert des Aufrufparameters zusätzlich nicht änderbar ist). Dies hat zur Folge, dass der Wert der Eigenschaft Checked als Kopie übergeben wird und diese kannst Du mit diesem Trick natürlich ändern, das hat aber keinerlei Einfluss auf das Original.
procedure Toggle (const B : Boolean);
var BPtr : PBoolean; begin BPtr := @B; BPtr^ := not B; end; Dass man Properties nicht als Varparameter übergeben kann hat einen anderen Grund: Hier wird CallByReference (Wirth) zelebriert, also eigentlich wird intern nur ein Zeiger auf den Speicherbereich des Übergabeparameters übergeben. Das ist das, was die C-ler umständlich mit Pointern lösen müssen. Da eine Property aber nicht in dem Sinne eine 'Speicherzelle' wie eine 'normale' variable ist, kann man keinen Zeiger darauf übergeben. Das gleiche gilt auch für die Direktive 'out'. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 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