AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Eigenen Funktionsaufruf in vorhandene Klasse "einhaken"
Thema durchsuchen
Ansicht
Themen-Optionen

Eigenen Funktionsaufruf in vorhandene Klasse "einhaken"

Ein Thema von Assertor · begonnen am 26. Apr 2007 · letzter Beitrag vom 26. Apr 2007
Antwort Antwort
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#1

Eigenen Funktionsaufruf in vorhandene Klasse "einhaken&

  Alt 26. Apr 2007, 16:06
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
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha

  Alt 26. Apr 2007, 16:11
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha

  Alt 26. Apr 2007, 17:14
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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha

  Alt 26. Apr 2007, 18:24
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
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#5

Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha

  Alt 26. Apr 2007, 22:18
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
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: Eigenen Funktionsaufruf in vorhandene Klasse "einha

  Alt 26. Apr 2007, 22:56
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;
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  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 05:39 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