Re: Button erstellen und Funktion zuweisen....
Also, im Moment geht's mir noch ein bisschen :wiejetzt:
Also darf ich in solchen "selbstgeschriebenen" Ereignisroutinen kein Self verwenden, ja? |
Re: Button erstellen und Funktion zuweisen....
Wenn es eine Methode ist natürlich schon, wenn es eine Prozedur ist nein (es sein denn du manipulierst zusätzlich auch noch die Objekt-Referenz)... :)
|
Re: Button erstellen und Funktion zuweisen....
Die Objekt-Referenz manipulieren? So, wie ich oben geschrieben habe(Self := Sender), oder anders?
|
Re: Button erstellen und Funktion zuweisen....
Anders... du musst die Objekt-Referenz des Methodenzeigers manipulieren...
|
Re: Button erstellen und Funktion zuweisen....
WIE??? :roll:
|
Re: Button erstellen und Funktion zuweisen....
Delphi-Quellcode:
Kann ich die $124 und $120 auch noch durch einen Symbolischen Namen ersetzen.
procedure DynClick(Self, Sender : TObject);
begin if Self <> nil then // steht immer nil ShowMessage('Self: ' + Self.ClassName); ShowMessage(TButton(Sender).Caption); end; procedure TForm1.FormCreate(Sender: TObject); asm // @Button4.OnClick := @DynClick; // so steht self auf Form1 // in eax steht Self mov edx, [eax + offset Button4] // Adresse der Instance des Schalters mov [edx + $124], eax // DynClick(Self ) := form1 mov [edx + $120], offset DynClick end; |
Re: Button erstellen und Funktion zuweisen....
Urgs, Assembler-Code!!! :gruebel:
Kann eigentlich Sender auch was anderes sein, außer das Objekt selber, vorausgesetzt die Methode wird ganz "normal" durch einen Klick oder ein anderes Ereignis von seitens des Anwenders ausgelöst? |
Re: Button erstellen und Funktion zuweisen....
Dein Code ist ein bisschen unpraktisch, da er absolute Offsets verwendet ($120 / $124)... Delphi kann natürlich die absoluten Offsets der Objekt-Felder berechnen, aber ich bezweifle, dass du mir so einfach sagen kannst an welchem Offset das OnMouseDown-Ereignis liegt...
Ich bevorzuge daher etwas in dieser Richtung:
Delphi-Quellcode:
Ein Methoden-Zeiger hat immer die Größe 8, daher ist der Record MethodPointer zu jedem Methoden-Zeiger kompatibel. Der strenge Compiler lässt eine einfache Zuweisung von TMethodPointer an zB TNotifyEvent nicht zu, daher muss der Record immer zuerst in den entsprechenden Methoden-Zeiger gecastet werden.
type
PMethodPointer = ^TMethodPointer; TMethodPointer = packed record pMethod: Pointer; pObject: TObject; end; procedure ProcFormClick(Self: TObject; Sender: TObject); begin ShowMessage('Procedure'); TForm(Self).OnClick := TForm1(Self).FormClick; end; procedure TForm1.FormClick(Sender: TObject); begin ShowMessage('Method'); end; procedure TForm1.FormCreate(Sender: TObject); var aMP: TMethodPointer; begin aMP.pMethod := @ProcFormClick; aMP.pObject := Self; OnClick := TNotifyEvent(aMP); end; |
Re: Button erstellen und Funktion zuweisen....
Ok! :)
und notiert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 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