AGB  ·  Datenschutz  ·  Impressum  







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

CodeRedirect von Protected-Methoden

Ein Thema von freedy · begonnen am 3. Apr 2012 · letzter Beitrag vom 4. Apr 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: CodeRedirect von Protected-Methoden

  Alt 3. Apr 2012, 22:21
Gibt es nicht in XE oder XE2 eine hauseigene Lösung?

Mir ist so, als hatte ich das vor 'ner Weile hier mal gesehn.
Ich glaub da wird intern ein generisches Objekt erstellt, worüber die Umleitung geregelt wird und dann wird die RTTI auf die neue Klasse umgeleitet, bzw. der Typ wird im gewünschten Objekt ersetzt, so daß ab nun alles über die neue Klasse abläuft, oder irgendwie so.



SetEnabled ist ja virtual, also könnte man auch einfach die VMT ändern.



TApplicationEvents.OnMessage und dort auf CM_ENABLEDCHANGED mit dem Handle deiner Komponente warten. [edit]alle[/edit]
PS: Du hast dir nicht umsonst den VCL-Quellcode gekauft ... ich an deiner Stelle würde dort öfters mal nachsehn.



Ab XE2 könnte man eventuell auch das DataBinding für sowas verwenden.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Apr 2012 um 22:31 Uhr)
  Mit Zitat antworten Zitat
freedy

Registriert seit: 16. Apr 2007
Ort: Göttingen
11 Beiträge
 
Delphi XE Professional
 
#2

AW: CodeRedirect von Protected-Methoden

  Alt 3. Apr 2012, 22:35
Gibt es nicht in XE oder XE2 eine hauseigene Lösung?

Mir ist so, als hatte ich das vor 'ner Weile hier mal gesehn.
Ich glaub da wird intern ein generisches Objekt erstellt, worüber die Umleitung geregelt wird und dann wird die RTTI auf die neue Klasse umgeleitet, bzw. der Typ wird im gewünschten Objekt ersetzt, so daß ab nun alles über die neue Klasse abläuft, oder irgendwie so.
Hallo Himitsu,

eine hauseigene Lösung kenne ich hier nicht.


SetEnabled ist ja virtual, also könnte man auch einfach die VMT ändern.
Sollen dann alle Nutzer meiner Rechteverwaltung die VCL neu erstellen? Das halte ich für nicht sinnvoll und wird bei anderen höchst wahrscheinlich auch auf Ablehnung stoßen.

TApplicationEvents.OnMessage und dort auf CM_ENABLEDCHANGED mit dem Handle deiner Komponente warten. [edit]alle[/edit]
PS: Du hast dir nicht umsonst den VCL-Quellcode gekauft ... ich an deiner Stelle würde dort öfters mal nachsehn.
An der Stelle, wo die Message ausgelöst wird, bin ich bereits zu spät. Nach meinem Konzept muss ich mir merken, ob aus dem Programmverlauf heraus das Control deaktiviert ist oder ob es durch die Rechteverwaltung deaktiviert wurde. Beides zusammen ergibt dann den Zustand von Enabled. Bei meinen Versuchen die Message abzufangen, fingen die Controls an leicht zu flackern.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: CodeRedirect von Protected-Methoden

  Alt 3. Apr 2012, 22:53
Ich weiß es leider auch nicht mehr genau ... glaub nur es mal gesehn zu haben


Es lassen sich über die neue RTTI alle möglichen Klassen suchen.
Darüber kommt man nun auch an die TypeInfo dieser Klassen und kann darin die VMT bearbeiten und den Prozedurzeiger ersetzen.
> auf seine Prozedur umleiten und sich natürlich den alten Zeiger merken, um die alte Prozedur wieder aufrufen zu können.



CM_ENABLEDCHANGED:
Über TApplicationEvents kommst du als Erstes an diese Message (solange sich voeher kein Anderer dort auch drangehängt hat)

Handled auf True setzen, damit die Message nicht weitergeleitet wird und dann über die neue RTTI das private FEnabled suchen und dort den alten Wert (negierter aktueller Wert) am Setter vorbei setzen.
Einziges Problem währe, wenn SetEnabled in den Klassen überschrieben wurde.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#4

AW: CodeRedirect von Protected-Methoden

  Alt 4. Apr 2012, 17:38
oder du machst dir eine eigene Unit in der Art (musst dir dann jedoch die Controls alle einmal selsbt erstellen und als letztes einbinden):

Delphi-Quellcode:
unit Unit17;

interface

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls;

type
  TEdit = class(StdCtrls.TEdit)
  public
    procedure SetEnabled(Value: Boolean); override;
  end;

  TForm17 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure NotifyEnabled(_Control: TControl);
  end;

var
  Form17: TForm17;

implementation

{$R *.dfm}

procedure TForm17.Button1Click(Sender: TObject);
var
  C: TControl;
begin
  C := FindComponent(Format('Edit%d', [Random(2) + 1])) as TControl;
  C.Enabled := not C.Enabled;
end;

procedure TEdit.SetEnabled(Value: Boolean);
begin
  inherited;
  Form17.NotifyEnabled(Self)
end;

procedure TForm17.NotifyEnabled(_Control: TControl);
begin
  caption := _Control.Name + ' ' + BoolToStr(_Control.Enabled, True);
end;
geht dann auch mit ueberschriebenen Funktionen
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 20:54 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