Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 Uhr.
Seite 3 von 4     123 4      

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