Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zwei-mal onmousedown? (https://www.delphipraxis.net/15044-zwei-mal-onmousedown.html)

maximi 21. Jan 2004 08:22


Zwei-mal onmousedown?
 
Hallo!
Ich nutze in meiner Komponente ein onmousedown ereignis.

Delphi-Quellcode:
OnMouseDown := buttonskinonmousedown;

procedure TButtonskin.buttonskinonmousedown;
begin
end;
Wenn ich dann in meinem Form auf meine Komponente auch ein mousedown-ereignis aufrufe funktioniert dieses Ereignis nicht.
Was mache ich da falsch?

Max

MikeS 21. Jan 2004 09:31

Re: Zwei-mal onmousedown?
 
moin

ich verstehe das problem nicht genau!
kannst du das noch etwas näher erläutern bitte?

Tonic1024 21. Jan 2004 09:39

Re: Zwei-mal onmousedown?
 
Moin...

Auf jeden Fall solltest du das so schreiben:
Delphi-Quellcode:
MyObject.OnMouseDown := buttonskinonmousedown;

procedure TForm.buttonskinonmousedown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin

end;
Ansonsten müsstest du mal mit mehr infos kommen, bidde...

maximi 21. Jan 2004 13:01

Re: Zwei-mal onmousedown?
 
Also, das ist jetzt mein verkützter Komponenten Quellcode:
Delphi-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;
So und das ist mein Form Quellcode:

Delphi-Quellcode:

procedure TForm1.Buttonskin1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
showMessage('asd');
end;
Wenn ich in meinem Form auf meinen Buttonskin clicke, verändert sich das Bild, aber ich bekomme keine Message.

Danke!

Tonic1024 26. Jan 2004 07:35

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

Minz 26. Jan 2004 08:43

Re: Zwei-mal onmousedown?
 
Hi hat Tonic schon geschrieben:

Zitat:

constructor TButtonskin.set_koordinaten;

begin

TButtonskin.Create(self);
Parent := parent;
OnMouseDown := buttonskinonmousedown;


end;
Parent und OnMouseDown müssen TButtonskin auch zugeordnet werden.

Also entweder so:
Delphi-Quellcode:
constructor TButtonskin.set_koordinaten;
begin
  with TButtonskin.Create(self) do begin
       Parent := parent;
       OnMouseDown := buttonskinonmousedown;
  end;
end;
oder so

Delphi-Quellcode:
constructor TButtonskin.set_koordinaten;
begin
  TButtonskin.Create(self);
  TButtonskin.Parent := parent;
  TButtonskin.OnMouseDown := buttonskinonmousedown;
end;

Minz 26. Jan 2004 08:45

Re: Zwei-mal onmousedown?
 
erm moment mal wieso eigentlich im Constructer nochmal create aufrufen??

set_koordinaten ist doch schon dein constructor.

Delphi-Quellcode:
constructor TButtonskin.set_koordinaten;
begin
  with TButtonskin.Create(self) do begin
       Parent := parent;
       OnMouseDown := buttonskinonmousedown;
  end;
end;
macht keinen Sinn, wenn dann:

Delphi-Quellcode:
constructor TButtonskin.set_koordinaten;
begin
  inherited Create(Self);
  Parent := parent;
  OnMouseDown := buttonskinonmousedown;
end;

Luckie 26. Jan 2004 08:50

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

Phoenix 26. Jan 2004 08:57

Re: Zwei-mal onmousedown?
 
Hier liegt der Fehler: Du weist dem Ereignis explizit eine andere Methode zu:
Zitat:

Delphi-Quellcode:
OnMouseDown := buttonskinonmousedown;

Wenn Du nun 'einfach nur' die OnMouseDown Methode überschreiben und nicht umbiegen würdest, könntest Du auf dem Formular die Methode umbiegen und mit 'inherited' den ursprünglichen Code ausführen lassen.

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;

SirThornberry 26. Jan 2004 09:28

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 Uhr.
Seite 1 von 2  1 2      

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