![]() |
Re: Gemeinsame OnClick - Behandlung
Ohne Pointer zu programmieren ist also wie Safersex, Bernd, und was sind dann CrackerClasses, Pfui ;)
@Doc F: Weder CrackerClasses noch Konstruckte der Form
Delphi-Quellcode:
sind Lösungen, die "sicher" funktionieren (obgleich Crackerclasses bedingt auch in D8 funktioneren sollen... *grummel*)
asm
mov [Sender+$42], eax end; Ich habe schon Komponenten gesehen, die zwar von TControl erben, die Getter und Setter der Eigenschaft Caption jedoch nicht über TControl.GetText sondern über aggregierte Objekte implementiert worden sind. Nicht zuletzt in diesen Fällen würden die Zugriffe über Pointer oder CrackerClasses (die im Wesentlichen nichts anderes tun, weil sie von einem statischen Offset der Exemplarvariablen, der VMT oder einer "unbekannten" festen Methodenadresse mit einer "hingemauschelten Referenz" als impliziten Parameter ausgehen) nicht funktionieren... Abgesehen davon widerspricht dieser Ansatz dem Geheimnisprinzip der OOP! |
Re: Gemeinsame OnClick - Behandlung
Zitat:
Zitat:
Zitat:
Aber du hast ja recht - safer programming ist ne Crakcer Class nicht - können wir uns dann auf diese Variante einigen
Delphi-Quellcode:
( sag jetzt nicht nein - sonst komme ich mit TWinControl und WM_SetText , oder noch besser EnumWindows ...<g>)
procedure TForm1.Button2Click(Sender: TObject);
begin if Sender is TControl then TControl(Sender).SetTextBuf('Geht nich - gibbs nich'); end; Bernd |
Re: Gemeinsame OnClick - Behandlung
Zitat:
Zitat:
Für "die schnelle Nummer zwischendruch" ist die RTTI bei Published Properties aber durchaus eine gute Wahl, zb so (nur mit D7 getestet, ggf gibt es die easy accessors in anderen Versionen nicht in dieser Form)
Delphi-Quellcode:
uses
TypInfo; //... procedure SetStrPropIfPossible(const AnInstance: TObject; const APropName, AValue: string); begin Assert( Assigned(AnInstance) ); if IsPublishedProp(AnInstance, APropName) and (PropType(AnInstance, APropName) in [tkWChar, tkLString, tkWString]) then SetStrProp(AnInstance, APropName, AValue); end; procedure TForm1.Button1Click(Sender: TObject); begin SetStrPropIfPossible(Sender, 'Caption', 'What about RTTI?'); end; |
Re: Gemeinsame OnClick - Behandlung
Hi choose,
bei nicht Standardeigenschaften kann ich Dir bzgl RTTI nur zustimmen. Die easy Accessors sind schon einige Versionen dabei (mind D5) - aber wesentlich umständlicher wars in D1 auch nicht Grüsse Bernd |
Re: Gemeinsame OnClick - Behandlung
Der arme Doc weiß jetzt eventuell nicht mehr was hier abgeht.
Und ich bleibe dann wohl doch beim alten (kommt ja bei mir selten genug vor), da weiß/sehe ich wenigstens noch besser was dort passieren soll. :nerd: Zitat:
![]() ![]() ![]() |
Re: Gemeinsame OnClick - Behandlung
Zitat:
Wie kann man auf was klicken was enabled := false hat?
Delphi-Quellcode:
Wenn da Enabled auf True gesetzt wird, geh ich davon aus das es vorher auf false stand. Wie kann man also darauf klicken?
procedure TForm1.Button1Click(Sender:TObject);
begin If Sender.ClassType = TButton Then Begin TButton(Sender).Enabled := True; end; |
Re: Gemeinsame OnClick - Behandlung
Hi
Zitat:
Zitat:
Aber mal inm Ernst - war ja nur irgendein theorisches Beispiel. Abgesehen davon So ein Ergeinishandler kann ja auch am OnChange oder sonstwo hängen. Der Name ist ja schall und Rauch. Oder Du rufst den Ereignishandler "zu Fuss" auf
Delphi-Quellcode:
Bernd
...
Button1Click(ListBox1); ... |
Re: Gemeinsame OnClick - Behandlung
Zitat:
ich habe meine ad hoc-Lösung ein bisschen überarbeitet
Delphi-Quellcode:
so dass man die Lösung relativ simpel anwenden kann (vielleicht will sich jmd mal die Mühe machen, das ganze zu erweitern und in die Code-Library zu stellen?)
type
TTypeKinds = set of TTypeKind; procedure SetPropIfPossible(const AnInstance: TObject; const APropName: string; const ANeededTypes: TTypeKinds; const AValue: Variant); overload; begin Assert( Assigned(AnInstance) ); if IsPublishedProp(AnInstance, APropName) and (PropType(AnInstance, APropName) in ANeededTypes) then SetPropValue(AnInstance, APropName, AValue); end; procedure SetPropIfPossible(const AnInstance: TObject; const APropName, AValue: string); overload; begin SetPropIfPossible(AnInstance, APropName, [tkWChar, tkLString, tkWString], AValue); end; procedure SetPropIfPossible(const AnInstance: TObject; const APropName: string; const AValue: Boolean); overload; begin SetPropIfPossible(AnInstance, APropName, [tkEnumeration], AValue); end; procedure SetPropIfPossible(const AnInstance: TObject; const APropName: string; const AValue: Integer); overload; begin SetPropIfPossible(AnInstance, APropName, [tkInteger], AValue); end;
Delphi-Quellcode:
Ich muss sagen, dass ich die Lösung deutlich Übersichtlicher finde, als zB diese:
procedure TForm1.Button1Click(Sender: TObject);
begin SetPropIfPossible(Sender, 'Width', 200); SetPropIfPossible(Sender, 'Enabled', False); SetPropIfPossible(Sender, 'Caption', 'What about RTTI?'); end;
Delphi-Quellcode:
Darüber hinaus funktioniert sie mit jeder Delphi-Komponente, die im OI die entsprechenden Eigenschaften besitzt...
If Sender.ClassType = TButton Then Begin
TButton(Sender).Enabled := True; TButton(Sender.Width:= 200; Tbutton(Sender).Caption:= 'What about RTTI?'; End Else If Sender.ClassType = TBitBtn Then Begin TBitBtn(Sender).Enabled := True; TBitBtn(Sender.Width:= 200; TBitBtn(Sender).Caption:= 'What about RTTI?'; End Else If Sender.ClassType = TEdit Then Begin TEdit(Sender).Enabled := True; TEdit(Sender).Width:= 200; End Else If Sender.ClassType = TMemo Then Begin TMemo(Sender).Enabled := True; TMemo(Sender).Width:= 200; End; |
Re: Gemeinsame OnClick - Behandlung
@General2003: Ich hatte damit nur das Beispiel vom Anfang fortgesetzt und wie Bernd schon sagte war es halt nur eine theorisches Beispiel.
Zitat:
Werd' mir das wohl mal für gleiche Teile merken, allerdings habe ich da auch meistens noch Code, der nicht bei allen Typen vorhanden ist, und das läßt sich ja leider nicht auf so eine Weise einbinden. Da bleibt also nur meine alte Variante. http://www.delphipraxis.net/images/common/divider.jpg ![]() ![]() ![]() |
Re: Gemeinsame OnClick - Behandlung
Zitat:
Delphi-Quellcode:
bzw
SetPropIfPossibleAndIsInstanceOf(Sender, [TButton, TPanel], 'Width', 200);
Delphi-Quellcode:
Vielleicht sollte man das wirklich einmal in einer Unit zusammenfassen :gruebel:
SetPropIfPossibleAndIsNotInstanceOf(Sender, [TEdit, TMemo], 'Visible', True);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 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