![]() |
Zwei-mal onmousedown?
Hallo!
Ich nutze in meiner Komponente ein onmousedown ereignis.
Delphi-Quellcode:
Wenn ich dann in meinem Form auf meine Komponente auch ein mousedown-ereignis aufrufe funktioniert dieses Ereignis nicht.
OnMouseDown := buttonskinonmousedown;
procedure TButtonskin.buttonskinonmousedown; begin end; Was mache ich da falsch? Max |
Re: Zwei-mal onmousedown?
moin
ich verstehe das problem nicht genau! kannst du das noch etwas näher erläutern bitte? |
Re: Zwei-mal onmousedown?
Moin...
Auf jeden Fall solltest du das so schreiben:
Delphi-Quellcode:
Ansonsten müsstest du mal mit mehr infos kommen, bidde...
MyObject.OnMouseDown := buttonskinonmousedown;
procedure TForm.buttonskinonmousedown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin end; |
Re: Zwei-mal onmousedown?
Also, das ist jetzt mein verkützter Komponenten Quellcode:
Delphi-Quellcode:
So und das ist mein Form Quellcode:procedure buttonskinonmousedown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); { Public-Deklarationen } published { Published-Deklarationen } end; procedure Register; implementation procedure TButtonskin.buttonskinonmousedown; begin ImageList1.GetBitmap(1,Picture.Bitmap); Refresh; end; constructor TButtonskin.set_koordinaten; begin TButtonskin.Create(self); Parent := parent; OnMouseDown := buttonskinonmousedown; end;
Delphi-Quellcode:
Wenn ich in meinem Form auf meinen Buttonskin clicke, verändert sich das Bild, aber ich bekomme keine Message.procedure TForm1.Buttonskin1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin showMessage('asd'); end; Danke! |
Re: Zwei-mal onmousedown?
Hi...
Ich bin mir über deinen Code immer noch nicht gabz im Klaren... Und als ich das Letzte mal ne Komponente entwickelt hab, habe ich einen hochroten Kopf bekommen und es dann doch anders realisiert :) Ich vermute, dass es sich um ein generelles Problem handelt... Du hast jetzt in deiner Kompo die OnClick fest eingetragen. Wenn nun das Event ausgeführt wird, wird nach dem passenden Stück Code gesucht und in deiner Kompo gefunden. Woher soll dein Programmzeiger wissen, dass er, nachdem er alles abgehakt hat (dein Programm) nämlich auch noch einen zweiten Code suchen soll, der nicht in der Kompo steht..? Du solltest versuchen, den gesammten Code in einer Funktion (Prozedur) unterzubringen. Und dass am Besten außerhalb der Kompo... |
Re: Zwei-mal onmousedown?
Hi hat Tonic schon geschrieben:
Zitat:
Also entweder so:
Delphi-Quellcode:
oder so
constructor TButtonskin.set_koordinaten;
begin with TButtonskin.Create(self) do begin Parent := parent; OnMouseDown := buttonskinonmousedown; end; end;
Delphi-Quellcode:
constructor TButtonskin.set_koordinaten;
begin TButtonskin.Create(self); TButtonskin.Parent := parent; TButtonskin.OnMouseDown := buttonskinonmousedown; end; |
Re: Zwei-mal onmousedown?
erm moment mal wieso eigentlich im Constructer nochmal create aufrufen??
set_koordinaten ist doch schon dein constructor.
Delphi-Quellcode:
macht keinen Sinn, wenn dann:
constructor TButtonskin.set_koordinaten;
begin with TButtonskin.Create(self) do begin Parent := parent; OnMouseDown := buttonskinonmousedown; end; end;
Delphi-Quellcode:
constructor TButtonskin.set_koordinaten;
begin inherited Create(Self); Parent := parent; OnMouseDown := buttonskinonmousedown; end; |
Re: Zwei-mal onmousedown?
Von was ist TButtonSkin abgeleitet? Grundsätzlich sollte man immer erst im Konstruktor den Konstruktor des Parents aufrufen (inherited Create) und dann alles eigene initialisieren. Im Destruktor dann eben genau umgekehrt (inherited Destroy).
|
Re: Zwei-mal onmousedown?
Hier liegt der Fehler: Du weist dem Ereignis explizit eine andere Methode zu:
Zitat:
Will heissen:
Delphi-Quellcode:
...
protected MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; ... procedure TButtonskin.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; // <-- ganz! wichtig ImageList1.GetBitmap(1,Picture.Bitmap); Refresh; end; // weiter auf dem form: procedure TForm1.Buttonskin1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; // <-- fast noch wichtiger ;-) showMessage('asd'); end; |
Re: Zwei-mal onmousedown?
am besten du machst ein neues Event das bei Onmousedown ausgeführt wird denn sobald zum beispiel im Objectinspektor für deine componente das onMousedownevent zugewiesen wird zeigt der Zeiger nicht mehr auf deine funktion sondern auf die welche im Form definiert wurde.
Delphi-Quellcode:
Also sollte im Objectinspektor nur "MyComponentOnMouseDown" zu sehen sein (außer du hast schon bei der vorgängerkomponente müll gemacht) und somit kein dein ereignis nicht mehr überschrieben werden. Ne weitere möglichkeit wäere das du einfach ne kontainerklasse machst und darein dein eigentliches object packst. Somit vermeidest du das irgendjemand an dein eigentliches Object ran kommt (natürlich im Private oder Protected-part definieren) und deien eventproceduren überschreibt. Ist allerdings auch mehr aufwand
MyComponent = class(TWincontrol)
private fnewmousedown: TMouseevent; procedure myMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); [...] published MyComponentOnMouseDown: TMouseevent read fnewmousedown write fnewmousedown; end; [...] constructor TMyComponent.Create(blabla); begin self.onmousedown = myMousedown; end; procedure TMyComponent.myMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if assigned(fnewmousedown) then fnewmousedown(Sender, Button, Shift, x, y); //dein eigenes zeugs [...] end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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-2025 by Thomas Breitkreuz