![]() |
Eigenen Funktionsaufruf in vorhandene Klasse "einhaken&
Hallo DPler,
ich suche mal wieder etwas ungewöhnliches. Ich möchte über eine Unit für meine gesamte Anwendung z.B. die CreateParams ersetzen. Ich möchte dabei keine Objektablage nutzen und auch keine Vererbung. Ich suche etwas in Richtung einer Manipulation der TForm bzw. TCustomForm Klasse durch einen neuen Sprung an eine andere CreateParams Funktion die den gegebenfalls bereits vorhandenen inherited aufruft. Gibt es in Delphi eine solche Möglichkeit? Ich denke so in der Lösungs-Richtung der VistaAltFix Unit, die per OnApplicationIdle nach neuen Forms sucht und dort ja Repaints auslöst oder auch in Richtung dxgettext bzw. gnugettext, die ja auch massiv mit Datenmanipulation hantiert ;) Gruß winkel79 |
Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha
Dafür brauchst du dann einen Code-Hook. Such mal nach der uallCollection von brechi oder nimm z.B. meine
![]() // Nachtrag Mit meiner Unit sähe das dann so aus:
Delphi-Quellcode:
(ungetestet, ggf. das eine oder andere @ zu viel)
type
TCreateParamsProc = procedure(Form: TCustomForm; var Params: TCreateParams); var OldCreateParams: TCreateParamsProc; procedure NewCreateParams(Form: TCustomForm; var Params: TCreateParams); begin OldCreateParams(Form, Params); Params.Style := Params.Style or WS_WASWEISSICHAUCHIMMER; // ... end; procedure EstablishHook; begin if not Assigned(OldCreateParams) then CreateGenericCodeHook(@TCustomForm.CreateParams, @NewCreateParams, @OldCreateParams); end; Ich hab's jetzt absichtlich nicht an ein Objekt gebunden sondern "Self" explizit als ersten Parameter aufgeführt. |
Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha
Das könnte man vielleicht mt class helpers lösen ... die dann also die vorhandene Prozedur ersetzen, die alte aufrufen und die Parameter noch ändern ... Dass wäre etwas sauberer und ohne Pointer/Hook
|
Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha
Hallo,
du könntest es mit einer Unit ählich dieser versuchen:
Delphi-Quellcode:
Wichtig ist, daß unit_MyForm in die USES-Anweisung aller betroffenen Formular-Units aufgenommen wird und dort hinter der Unit Forms steht. Eine Erklärung dieses "Tricks" findest du in
unit unit_MyForm;
interface uses Controls, Forms; type TForm = class (Forms.TForm) protected procedure CreateParams (var Params: TCreateParams); override; end; implementation uses Windows; procedure TForm.CreateParams(var Params: TCreateParams); begin inherited; // hier die gewünschten Änderungen einbauen: Params.ExStyle := Params.ExStyle or WS_EX_TOOLWINDOW; end; end. ![]() Gruß Hawkeye |
Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha
Danke für die vielen Tipps. Class helper wollte ich möglichst vermeiden, auch den Workaround mit der Unit in der uses clause.
Aber Flockes Ansatz gefällt mir, da hab ich nicht das Problem, daß ein anderer Programmierer die Unit in der Uses clause vergisst. @Flocke: Ich habe das Problem, daß CreateParams sowohl bei TCustomForm als auch TForm im protected Bereich steht. Sprich bei der Zeile mit CreateGenericCodeHook(@TCustomForm.CreateParams, ... meckert der Compiler (meckern = E2003 Undefinierter Bezeichner 'CreateParams'). Dabei ist der Ansatz genau was ich suche. Ideen? Gruß winkel79 |
Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha
Zitat:
Delphi-Quellcode:
type
TCustomFormHack = class(TCustomForm) end; procedure EstablishHook; begin if not Assigned(OldCreateParams) then CreateGenericCodeHook(@TCustomFormHack.CreateParams, @NewCreateParams, @OldCreateParams); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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 by Thomas Breitkreuz