![]() |
Hinzufügen von neuen Ereignissen zu Komponenten
Hi,
wie kann ich neue (von mir programmierte) Ereignisse in eine vorhandene Komponente mit rein bringen, oder eine Neue Komponente mit den neuen Ereignissen erstellen?; MfG DelphiUser7 |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Over and out; Selbst gelöst; :-D
Für alle, die es nicht wissen: Menü -> Datei -> Neu -> Weitere -> 'Komponente' auswählen => have fun; :mrgreen: :mrgreen: :mrgreen: Gruss DelphiUser7 |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Oh nein! :shock: ;
Ich weiss nicht, wie ich die Properties der neuen Komponente verwenden kann!, dabei gibt es gar keine neuen Properties, sondern nur neue Ereignisse; Weiss jemand, wie ich die Properties (=Eigenschaften) der neuen Komponenten in Procedures verwenden kann, z.B. in 'OnClick' von 'Button1' oder so? Im OI werden sie alle aufgelistet, und sollten demnach auch verwendbar sein; aber in der Liste, die angezeigt wird, sobald man einen '.' hinter eine Komponente setzt, gibt es nur 2 Eigenschaften; In Hoffnung DelphiUser7 |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Hallo DelphiUser7,
zeig mal ein bisschen Code... |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
zeig uns doch mal ein bisschen code. zb wie werden die ereignisse erstellt und was sollen sie machen?
|
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Hier:
Delphi-Quellcode:
Die Ereignisse sind ja der eigentliche Grund, wieso ich überhaupt diese neue Komponente erstellt habe; ich habe sie erstellt, wie oben beschrieben und dann, wie im Quellcode zu sehen ist, die nötigen Procedures 'dazudeklariert'!;
unit MouseTrackBar;
interface uses SysUtils, Classes, Controls, ComCtrls; type TMouseTrackBar = class(TTrackBar) private { Private-Deklarationen } protected procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseDown (Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseMove (Shift: TShiftState; X, Y: Integer); override; { Protected-Deklarationen } public { Public-Deklarationen } published property OnMouseUp; property OnMouseDown; property OnMouseMove; { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TMouseTrackBar]); end; procedure TMouseTrackBar.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; end; procedure TMouseTrackBar.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; end; procedure TMouseTrackBar.MouseMove(Shift: TShiftState; X, Y: Integer); begin inherited; end; end. darum geht es momentan aber eigentlich weniger, als darum, wie ich diese Online-Hilfe, oder wie diese Liste auch immer, richtig vererben kann, und nicht nur so, dass man sie lediglich im OI benutzen kann!; MfG DelphiUser7 |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
du überschreibst dort etwas, was es in der TTrackbar nicht gibt?
|
Re: Hinzufügen von neuen Ereignissen zu Komponenten
was heißt in diesem Fall 'überschreiben'? Ich habe die doch selbst deklariert; d.h. nicht 'ich' sondern 'Gandalfus', von dem ich den Code habe;
|
Re: Hinzufügen von neuen Ereignissen zu Komponenten
ist richtig ttrackbar ist von twincontrol und da gibt es die ereignisse. du mußt denen baer noch das auslösende event geben . suche mal nach cm_mouseleave und cm_mouseenter, das müsste es sein was du zuweisen musst.
|
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Neeee :shock: , das hat doch nichts mit den Ereignissen zu tun, ich rede bzw. schreibe doch gerade von Eigenschaften, '.Max','.Length' etc., die ich anderen Eigenschaften nicht in einer Procedure zuweisen kann :shock: , weil der Compiler sie nicht erkennt;
|
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Hab die Sache (wieder) selbst gelöst; :mrgreen: :mrgreen: :mrgreen: :bouncing4: :bouncing4:
DelphiUser7 |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
wie kann ich denn jetzt ein neues ereignis z.B onClick zu einer komponente hinzufügen?
ich hab da eine opensource komponente, die das nicht unterstützt und will da jetzt ein onClick event! wie geht das? gruss, iaby |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Also,
du gehst auf irgendeine Komponente die das OnClick-Ereignis besitzt, und erstellst dieses; da siehst du dann schon mal den Aufbau des Ereignisses; Dann kopierst du ihn in die Zwischenablage (Strg+C), und fügst ihn nachher so ein (Strg+V): (für Delphi 7:) Datei -> Neu -> Weitere -> Komponente; bei anderen Delphi-Versionen könnte es etwas anders sein... :-D ; Bei Vorfahrentyp gibst du die Komponente ein, der du die Eigenschaft hinzufügen möchtest; KlassenName: //gib den Namen der neuen Klasse bzw. Komponente ein; Palettenseite: //gib die Palette ein, auf der du deine Neue Komponente wiederfinden willst; Name der Unit & Suchpfad: //erledigt Delphi für dich; Auf 'Ok' (nicht 'Installieren'!) klicken; Hier mal als Beispiel: Meine TrackBar, die mit Mouse-Ereignissen ausgestattet wurde:
Delphi-Quellcode:
Habs logischerweise schon längst getestet: funzt;
unit MouseTrackBar;
interface uses SysUtils, Classes, Controls, ComCtrls; type TMouseTrackBar = class(TTrackBar) private { Private-Deklarationen } protected procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseDown (Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseMove (Shift: TShiftState; X, Y: Integer); override; { Protected-Deklarationen } public { Public-Deklarationen } published property OnMouseUp; property OnMouseDown; property OnMouseMove; { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TMouseTrackBar]); end; procedure TMouseTrackBar.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; end; procedure TMouseTrackBar.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; end; procedure TMouseTrackBar.MouseMove(Shift: TShiftState; X, Y: Integer); begin inherited; end; end. Gruss DelphiUser7 |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
also ich hab das jetzt mal so probiert, wie du es gepostet hast, aber onMouseDown ist im ObjectInspector
immer noch nicht sichtbar! hier mal der code:
Delphi-Quellcode:
die komponente ist nicht von mir, ich benutze sie aber und will nun eine onMouseDown Event(oder OnClick)
unit DigitLed;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; ... type TDigitLed = class(TPaintBox) private ... protected { Protected declarations } ... procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; public { Public declarations } ... published { Published declarations } ... property OnMouseDown; end; procedure Register; implementation {$R DIGITLED.DCR} procedure Register; begin RegisterComponents('MoonRed', [TDigitLed]); end; ... procedure TDigitLed.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; end; ... end. ich hab die alte komponente runter geschmissen, die modifizierte feherfrei installiert und es geht immer noch nicht! woran kann das liegen? Jemand eine Idee? gruss, iaby |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
ok ich habs hinbekommen, war mein fehler!
wenn ich jetzt aber auf die komponente clicke(hab vorher ein showmessage in die onclick prozedur geschrieben) dann kommt gar nichts!!! woran liegt das schon wieder? ich verzweifle noch :wall: gruss, iaby |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
weiß niemand wieso da einfach nichts passiert?
ich habe sonst eigentlich alles richtig gemacht. jemand einen vorschlag? gruss, iaby |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Oh, da weiss ich nicht, ob ich das lösen kann, weil ich mit dem OnClick-Ereignis schon mal selbst immense Probleme hatte; und wie schon gesagt: Der Code stammt nicht von mir, sondern von Gandalfus; also kann ich dir darüber folglich wenig Auskunft geben; ausserdem hab ich ja die Komponente nicht, weiß also nicht, wie diese Komponente, zumal sie ja bei Delphi normalerweise gar nicht mitgeliefert ist, auf irgendwelche neu hinzugefügten Ereignisse reagiert!; :evil: :evil:
Gruss DelphiUser7 P.S.: Die Smileys gelten nicht dir, sondern der Komponente :mrgreen: ; |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
:wiejetzt:
weden die Ereignisse genauso deklariert wie die Eigenschaften ? und woher weis Delphi obs n Ereigniss is oder ne Eigenschaft ? Und woher weis Delphi, auf was dieses Ereigniss reagieren soll ? Ich bin jetzt sehr verwirrt :gruebel: |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Die Ereignisse werden so deklariert, wie ich sie in meinem Beispiel angegeben habe; und da funzen alle drei (OnMouseUp, OnMouseDown, OnMouseMove);
Gruss DelphiUser7 |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
also mit onMouseDown hab ichs auch probiert, das ging aber auch nicht!
echt komisch, kein fehler beim kompilieren, alles einwandfrei! aber reagiert wird darauf eben nicht gruss, iaby |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Wie wärs damit:
Delphi-Quellcode:
type
TDigitLedMouseDownEvent = procedure(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); TDigitLed = class(TPaintBox) private ... protected { Protected declarations } ... FOnMouseDown : TDigitLedMouseDownEvent; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; public { Public declarations } ... published { Published declarations } ... property OnMouseDown : TDigitLedMouseDownEvent read FOnMouseDown write FOnMouseDown; end; procedure Register; implementation {$R DIGITLED.DCR} procedure Register; begin RegisterComponents('MoonRed', [TDigitLed]); end; ... procedure TDigitLed.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; If Assigned(FOnMouseDown) then FOnMouseDown(Button, Shift, X, Y); end; |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
muss ich die procedure also erst "starten"?
werde das gleich mal testen!!! danke, nils |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
jetzt habe ich aber bei folgender zeile
Delphi-Quellcode:
folgende fehlermeldung:
property OnMouseDown : TLedGroupMouseDownEvent read FOnMouseDown write FOnMouseDown;
Code:
kannst du mir weiterhelfen?
[Error] Ledgroup.pas(56): Published property 'OnMouseDown' cannot be of type PROCEDURE
gruss, iaby |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
thread.bringtotop;
|
Re: Hinzufügen von neuen Ereignissen zu Komponenten
|
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Sorry, war auch mein Fehler.
Das Event muss so aussehen:
Delphi-Quellcode:
Und der Aufruf in der MouseDown function so:
type
TDigitLedMouseDownEvent = procedure(Sender : TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;
Delphi-Quellcode:
procedure TDigitLed.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin inherited; If Assigned(FOnMouseDown) then FOnMouseDown(self, Button, Shift, X, Y); end; |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Liste der Anhänge anzeigen (Anzahl: 1)
also es geht immer noch nicht!
es wird zwar kompiliert, aber die onmousedown prozedur wird einfach nie "betreten" ich hab jetzt mal die komponente (die modifizierte) in den anhang gepackt. in dem zustand in dem sie jetzt ist, sollte sie eigentlich funktionieren! wenn ihr also mal lust&zeit habt könntet ihr sie euch ja mal anschauen gruss, iaby PS: es geht um die TLedGroup komponente, nich um die andere! |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Ich werde die mir mal anschauen, weil ich ein ähnliches Problem habe:
Eine Image-Komponente, abgeleitet von TImage, soll OnKeyDown/Up usw. Ereignisse bekommen. Bin bisher nicht sehr weit gekommen: ;-)
Delphi-Quellcode:
unit Sli;
interface uses SysUtils, Classes, Controls, ExtCtrls; type TSli = class(TImage) private { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TSli]); end; end. |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
OK, jetzt habe ich auch ein KeyDownEvent, aber es funktioniert nicht alleine, da ich das Image ja nicht 'markieren' kann.
Wie kriege ich das aktiv, damit bei einem Tastendruck meine KeyDown Pozedure aufgerufen wird?
Delphi-Quellcode:
unit Sli; { StringListImage Grafische Ausgabe einer Stringlist (eine Art bessere Listbox) type TSliKeyDownEvent = procedure (Sender: TObject; var Key: Word; Shift: TShiftState) of object; type TSliEnterEvent = procedure (Sender: TObject) of object; type TSli = class(TImage) private { Private-Deklarationen } protected { Protected-Deklarationen } FOnkeyDown: TSliKeyDownEvent; FOnEnter: TSliEnterEvent; procedure KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Enter(Sender: TObject) ; public { Public-Deklarationen } constructor Create(AOwner:TImage); published { Published-Deklarationen } property OnKeyDown : TSliKeyDownEvent read FOnKeyDown write FOnKeyDown; property OnEnter : TSliEnterEvent read FOnEnter write FOnEnter; end; procedure Register; implementation ... procedure TSli.KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin inherited; If Assigned(FOnKeyDown) then FOnKeyDown(self, Key, Shift); end; procedure TSli.Enter(Sender: TObject); begin inherited; If Assigned(FOnEnter) then FOnEnter(self); end; Meine OnEnterEvent - Vererbungsversuche (von einer Listbox halt abgeschaut) bringen mich nicht weiter. |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Zitat:
Delphi-Quellcode:
TLedGroup = class(TCustomGroupBox)
private ... FOnMouseDown: TMouseEvent; ... protected procedure SetOnMouseDown(Value: TMouseEvent); public ... published ... property OnMouseDown read FOnMouseDown write SetOnMouseDown; end; ... procedure TLedGroup.CreateDigits; var f:byte; aux: TComponent; begin for f:=1 to FMaxDigits do begin aux:=FindComponent('Led'+IntToStr(f)); if (aux=nil) then // if the led number does not exists begin //creates the led Led:=TDigitled.Create(self); Led.Name:='Led'+IntToStr(f); led.top:=Margin; led.width:=Round((Width-Margin) / FMaxDigits); led.left:=(f-1)*(Round((Width-Margin-Margin) / FMaxDigits))+Margin; led.height:=height-(Margin+Margin); led.OnMouseDown := FOnMouseDown; // <--- Hier noch allen DigitLeds das OnMouseDown zuweisen!!! InsertControl(Led); end; end; end; // Allen DigitLeds das OnMouseDown zuweisen!!! procedure TLedGroup.SetOnMouseDown(Value: TMouseEvent); var f:byte; aux: TComponent; begin FOnMouseDown := Value; for f:=1 to FMaxDigits do begin aux:=FindComponent('Led'+IntToStr(f)); (aux as TDigitLed).OnMouseDown := OnMouseDown; end; end; |
Re: Hinzufügen von neuen Ereignissen zu Komponenten
Zitat:
Ich weiß ja nicht, was du machen willst außer eine StringList ausgeben zu lassen, aber mach das doch mit nem Panel, auf dem ein Image ist, dann kannst du auch auf Tastatur-Botschaften reagieren (weil TPanel ein Nachfahre von TWinControl ist)... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 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