AGB  ·  Datenschutz  ·  Impressum  







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

Gemeinsame OnClick - Behandlung

Ein Thema von Doc F · begonnen am 4. Dez 2003 · letzter Beitrag vom 15. Dez 2003
Antwort Antwort
Seite 2 von 3     12 3      
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#11

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 09:19
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:
asm
  mov [Sender+$42], eax
end;
sind Lösungen, die "sicher" funktionieren (obgleich Crackerclasses bedingt auch in D8 funktioneren sollen... *grummel*)
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!
gruß, choose
  Mit Zitat antworten Zitat
Bernd Ua

Registriert seit: 10. Nov 2003
Ort: Lindhorst
87 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 09:36
Zitat:
Ohne Pointer zu programmieren ist also wie Safersex, Bernd, und was sind dann CrackerClasses, Pfui
Crackerklasse = Seitensprung ??????

Zitat:
(obgleich Crackerclasses bedingt auch in D8 funktioneren sollen... *grummel*)
Dagegen hilft dann aber die neue Sichtbarkeit strictly protected in Delphi 8.

Zitat:
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.
Hmmmmhh - wie soll das gehen, wo doch GetText und SetText private sind ? Da hat doch wohl niemand eine Property selben Namens redeklariert, wo allgemein bekannt ist, dass Properties nicht polymorph sind ?

Aber du hast ja recht - safer programming ist ne Crakcer Class nicht - können wir uns dann auf diese Variante einigen

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  if Sender is TControl then
    TControl(Sender).SetTextBuf('Geht nich - gibbs nich');
end;
( sag jetzt nicht nein - sonst komme ich mit TWinControl und WM_SetText , oder noch besser EnumWindows ...<g>)

Bernd
Bernd Ua
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#13

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 09:55
Zitat von Bernd Ua:
Crackerklasse = Seitensprung ??????


Zitat von Bernd Ua:
[...] können wir uns dann auf diese Variante einigen [...] ( sag jetzt nicht nein - sonst komme ich mit TWinControl und WM_SetText , oder noch besser EnumWindows ...<g>)
Probleme wird es dann geben, wenn es sich nicht um "Standardeigenschaften" handeln sollte. Hier sollte IMHO eine sichere, wartbare und übersichtliche Lösung gewählt werden.
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;
gruß, choose
  Mit Zitat antworten Zitat
Bernd Ua

Registriert seit: 10. Nov 2003
Ort: Lindhorst
87 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 10:27
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
Bernd Ua
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#15

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 10:34
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.

Zitat von (me):
Delphi-Quellcode:
If Sender.ClassType = TButton Then Begin
  TButton(Sender).Enabled := True;
End Else If Sender.ClassType = TBitBtn Then Begin
  TBitBtn(Sender).Enabled := True;
End Else If Sender.ClassType = TEdit Then Begin
  TEdit(Sender).Enabled := True;
End Else If Sender.ClassType = TMemo Then Begin
  TMemo(Sender).Enabled := True;
End;

http://www.FrankNStein.de/Smiley-Kuss.gif http://www.FrankNStein.de/Smiley-Spinne.gif http://www.FrankNStein.de/Smiley-Winken.gif
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Nalincah
Nalincah

Registriert seit: 18. Jul 2003
898 Beiträge
 
Delphi 6 Professional
 
#16

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 10:41
Zitat von himitsu:
Ausverseh'n 'Edit' an statt 'Zitat'
(weiß aber nicht mehr genau was hier stand, dashalb nicht wundern)

Vorher hat den Typ abfragen:
Delphi-Quellcode:
If Sender.ClassType = TButton Then Begin
  TButton(Sender).Enabled := True;
End Else If Sender.ClassType = TBitBtn Then Begin
  TBitBtn(Sender).Enabled := True;
End Else If Sender.ClassType = TEdit Then Begin
  TEdit(Sender).Enabled := True;
End Else If Sender.ClassType = TMemo Then Begin
  TMemo(Sender).Enabled := True;
End;

http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
Vielleicht hab ich was nicht mitgekriegt, beim lesen des Threads, aber wie geht sowas?

Wie kann man auf was klicken was enabled := false hat?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender:TObject);
begin
  If Sender.ClassType = TButton Then Begin
    TButton(Sender).Enabled := True;
end;
Wenn da Enabled auf True gesetzt wird, geh ich davon aus das es vorher auf false stand. Wie kann man also darauf klicken?
Sebastian
Ehemals bekannt als General2004
  Mit Zitat antworten Zitat
Bernd Ua

Registriert seit: 10. Nov 2003
Ort: Lindhorst
87 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 10:47
Hi

Zitat:
Wenn da Enabled auf True gesetzt wird, geh ich davon aus das es vorher auf false stand.
Na ja - muss ja nicht so sein.

Zitat:
Wie kann man also darauf klicken?
Mit der Maus - passiert zwar nix- aber klicken kann man <bg>

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:
...
Button1Click(ListBox1);
...
Bernd
Bernd Ua
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#18

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 10:54
Zitat von himitsu:
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.
Hi himitsu,

ich habe meine ad hoc-Lösung ein bisschen überarbeitet
Delphi-Quellcode:
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;
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?)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  SetPropIfPossible(Sender, 'Width', 200);
  SetPropIfPossible(Sender, 'Enabled', False);
  SetPropIfPossible(Sender, 'Caption', 'What about RTTI?');
end;
Ich muss sagen, dass ich die Lösung deutlich Übersichtlicher finde, als zB diese:
Delphi-Quellcode:
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;
Darüber hinaus funktioniert sie mit jeder Delphi-Komponente, die im OI die entsprechenden Eigenschaften besitzt...
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#19

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 11:16
@General2003: Ich hatte damit nur das Beispiel vom Anfang fortgesetzt und wie Bernd schon sagte war es halt nur eine theorisches Beispiel.
Zitat von Der Doc:
Code:
BtnFirst[id].enabled := True;
@choose: OK, wenn das so aussieht, sieht es einfacher aus.
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.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#20

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 11:54
Zitat von himitsu:
OK, [...] 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.
Was hältst Du von einem Parameter, dem Du die auszusparenden bzw. zu verwendenen Klassen angibst?
SetPropIfPossibleAndIsInstanceOf(Sender, [TButton, TPanel], 'Width', 200); bzw
SetPropIfPossibleAndIsNotInstanceOf(Sender, [TEdit, TMemo], 'Visible', True); Vielleicht sollte man das wirklich einmal in einer Unit zusammenfassen
gruß, choose
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 21:05 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