Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Hinzufügen von neuen Ereignissen zu Komponenten (https://www.delphipraxis.net/10754-hinzufuegen-von-neuen-ereignissen-zu-komponenten.html)

DelphiUser7 24. Okt 2003 15:41


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

DelphiUser7 24. Okt 2003 15:49

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

DelphiUser7 24. Okt 2003 17:07

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

APP 24. Okt 2003 17:14

Re: Hinzufügen von neuen Ereignissen zu Komponenten
 
Hallo DelphiUser7,
zeig mal ein bisschen Code...

kiar 24. Okt 2003 17:14

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?

DelphiUser7 24. Okt 2003 17:31

Re: Hinzufügen von neuen Ereignissen zu Komponenten
 
Hier:
Delphi-Quellcode:
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.
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'!;
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

kiar 24. Okt 2003 17:45

Re: Hinzufügen von neuen Ereignissen zu Komponenten
 
du überschreibst dort etwas, was es in der TTrackbar nicht gibt?

DelphiUser7 24. Okt 2003 17:47

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;

kiar 24. Okt 2003 18:18

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.

DelphiUser7 24. Okt 2003 18:31

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;

DelphiUser7 25. Okt 2003 09:01

Re: Hinzufügen von neuen Ereignissen zu Komponenten
 
Hab die Sache (wieder) selbst gelöst; :mrgreen: :mrgreen: :mrgreen: :bouncing4: :bouncing4:

DelphiUser7

iaby 28. Okt 2003 08:17

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

DelphiUser7 28. Okt 2003 09:06

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:
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.
Habs logischerweise schon längst getestet: funzt;

Gruss
DelphiUser7

iaby 29. Okt 2003 12:11

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:
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.
die komponente ist nicht von mir, ich benutze sie aber und will nun eine onMouseDown Event(oder OnClick)
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

iaby 29. Okt 2003 15:26

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

iaby 30. Okt 2003 07:14

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

DelphiUser7 30. Okt 2003 10:56

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

MrKnogge 30. Okt 2003 11:07

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:

DelphiUser7 30. Okt 2003 11:37

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

iaby 1. Nov 2003 17:55

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

scp 1. Nov 2003 18:17

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;

iaby 2. Nov 2003 10:42

Re: Hinzufügen von neuen Ereignissen zu Komponenten
 
muss ich die procedure also erst "starten"?
werde das gleich mal testen!!!

danke, nils

iaby 2. Nov 2003 11:09

Re: Hinzufügen von neuen Ereignissen zu Komponenten
 
jetzt habe ich aber bei folgender zeile
Delphi-Quellcode:
    property OnMouseDown : TLedGroupMouseDownEvent read FOnMouseDown write FOnMouseDown;
folgende fehlermeldung:
Code:
[Error] Ledgroup.pas(56): Published property 'OnMouseDown' cannot be of type PROCEDURE
kannst du mir weiterhelfen?

gruss,
iaby

iaby 9. Nov 2003 11:49

Re: Hinzufügen von neuen Ereignissen zu Komponenten
 
thread.bringtotop;

Christian Seehase 9. Nov 2003 12:57

Re: Hinzufügen von neuen Ereignissen zu Komponenten
 
Moin iaby,

guckst Du hier:

prozedur aufruf und sender

scp 9. Nov 2003 13:26

Re: Hinzufügen von neuen Ereignissen zu Komponenten
 
Sorry, war auch mein Fehler.
Das Event muss so aussehen:

Delphi-Quellcode:
type
  TDigitLedMouseDownEvent = procedure(Sender : TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer) of object;
Und der Aufruf in der MouseDown function so:
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;

iaby 11. Nov 2003 18:39

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!

Der_Ventilator 1. Jul 2004 18:54

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.

Der_Ventilator 1. Jul 2004 19:43

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.

Stevie 2. Jul 2004 08:30

Re: Hinzufügen von neuen Ereignissen zu Komponenten
 
Zitat:

Zitat von iaby
also es geht immer noch nicht!
es wird zwar kompiliert, aber die onmousedown prozedur wird einfach nie "betreten"

Tja, woran das wohl liegt??? Vielleicht daran, dass auch die GroupBox überhaupt nix davon mitbekommt, wenn ein TDigitLed auf ihr angeklickt wird??? Also:

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;

Stevie 2. Jul 2004 09:17

Re: Hinzufügen von neuen Ereignissen zu Komponenten
 
Zitat:

Zitat von Der_Ventilator
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?
Meine OnEnterEvent - Vererbungsversuche (von einer Listbox halt abgeschaut) bringen mich nicht weiter.

Das dürfte - meiner Meinung nach - ohne sehr großen Aufwand nicht gehen, da solche Funktionsweisen in TWinControl implementiert sind. Mein erster Ansatz war über SetWindowLong die Eigenschaft WS_TABSTOP zu ändern, aber dafür brauch in ein Handle, was leider auch erst in TWinControl ist und TImage ist kein Nachfolger davon, leider...

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 01:29 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