AGB  ·  Datenschutz  ·  Impressum  







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

Gibt es einen Toggle Befehl ?

Ein Thema von ebber · begonnen am 5. Mär 2007 · letzter Beitrag vom 7. Mär 2007
Antwort Antwort
Seite 2 von 2     12   
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Gibt es einen Toggle Befehl ?

  Alt 6. Mär 2007, 09:10
Ich will auch, ich will auch ...

Prozedur:
Delphi-Quellcode:
procedure Toggle(aBox: TCheckBox);
begin
   if aBox is TCheckBox then
      aBox.Checked := not aBox.Checked;
end;
...
Toggle(DLED1);
Beschränkt auf TCheckBox natürlich.
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#12

Re: Gibt es einen Toggle Befehl ?

  Alt 6. Mär 2007, 11:59
Zitat von Amateurprofi:
So mal eben funktioniert das aber nicht.
[Fehler] E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
Hallo,

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:
procedure Toggle (const B : Boolean);
var BPtr : PBoolean;
begin
BPtr := @B;
BPtr^ := not B;
end;
ist korrekt und wird compiliert (auch der Aufruf mit TCheckBox.Checked), funktioniert aber nicht.

Gruss Reinhard
  Mit Zitat antworten Zitat
ebber

Registriert seit: 31. Okt 2006
243 Beiträge
 
#13

Re: Gibt es einen Toggle Befehl ?

  Alt 6. Mär 2007, 17:28
Danke an euch alle.
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#14

Re: Gibt es einen Toggle Befehl ?

  Alt 7. Mär 2007, 17:10
Zitat von marabu:
Ganz ehrlich, Ghostwalker: Ehe ich eine Toggle-Funktion schreibe, nehme ich doch lieber den Vorschlag von Katja und Axel:

 with DLED1 do Checked := not Checked; Keine Frage, es geht so wie du schreibst, aber sinngemäß ist Toggle für mich eine Prozedur.

Freundliche Grüße
Ich habe nie behauptet das es sinnvoll ist, dafür eine Funktion/Prozedur zu schreiben, da ich, wie die meisten, dafür keine Funktion/Prozedur brauche (und mir ehrlich gesagt auch kein Fall einfallen würde, wo man so eine Vorgehen braucht). Aber die Fragestellung lautete nunmal so, daher auch meine Antwort

Für die Anhänger von Prozeduren hat Reinhard ja die richtige Vorgehensweise aufgezeigt
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#15

Re: Gibt es einen Toggle Befehl ?

  Alt 7. Mär 2007, 17:27
Das:
Delphi-Quellcode:
procedure Toggle (const B : Boolean);
var BPtr : PBoolean;
begin
BPtr := @B;
BPtr^ := not B;
end;
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.

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'.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 04:39 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