Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Eigenen Funktionsaufruf in vorhandene Klasse "einhaken" (https://www.delphipraxis.net/90962-eigenen-funktionsaufruf-vorhandene-klasse-einhaken.html)

Assertor 26. Apr 2007 16:06


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

Flocke 26. Apr 2007 16:11

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 GenCodeHook-Unit.

// Nachtrag

Mit meiner Unit sähe das dann so aus:
Delphi-Quellcode:
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;
(ungetestet, ggf. das eine oder andere @ zu viel)

Ich hab's jetzt absichtlich nicht an ein Objekt gebunden sondern "Self" explizit als ersten Parameter aufgeführt.

jfheins 26. Apr 2007 17:14

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

Hawkeye219 26. Apr 2007 18:24

Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha
 
Hallo,

du könntest es mit einer Unit ählich dieser versuchen:

Delphi-Quellcode:
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.
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 diesem Artikel von Hallvard Vassbotn.

Gruß Hawkeye

Assertor 26. Apr 2007 22:18

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

Flocke 26. Apr 2007 22:56

Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha
 
Zitat:

Zitat von winkel79
Ich habe das Problem, daß CreateParams sowohl bei TCustomForm als auch TForm im protected Bereich steht.

Das kannst du relativ einfach umgehen. Einfach in deiner Unit eine Klasse davon ableiten und über die darauf zugreifen:
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 06:00 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