Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Button erstellen und Funktion zuweisen.... (https://www.delphipraxis.net/8579-button-erstellen-und-funktion-zuweisen.html)

Stevie 17. Sep 2003 11:05

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?

Motzi 17. Sep 2003 11:32

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)... :)

Stevie 17. Sep 2003 11:35

Re: Button erstellen und Funktion zuweisen....
 
Die Objekt-Referenz manipulieren? So, wie ich oben geschrieben habe(Self := Sender), oder anders?

Motzi 17. Sep 2003 12:11

Re: Button erstellen und Funktion zuweisen....
 
Anders... du musst die Objekt-Referenz des Methodenzeigers manipulieren...

Stevie 17. Sep 2003 12:14

Re: Button erstellen und Funktion zuweisen....
 
WIE??? :roll:

neolithos 17. Sep 2003 13:37

Re: Button erstellen und Funktion zuweisen....
 
Delphi-Quellcode:
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;
Kann ich die $124 und $120 auch noch durch einen Symbolischen Namen ersetzen.

Stevie 17. Sep 2003 13:43

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?

Motzi 18. Sep 2003 08:37

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:
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;
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.

neolithos 18. Sep 2003 08:46

Re: Button erstellen und Funktion zuweisen....
 
Ok! :)
und notiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 Uhr.
Seite 3 von 3     123   

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