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 Eigene Kompo von TButton ableiten? Wie OnClick realisieren? (https://www.delphipraxis.net/115457-eigene-kompo-von-tbutton-ableiten-wie-onclick-realisieren.html)

winx 12. Jun 2008 12:43


Eigene Kompo von TButton ableiten? Wie OnClick realisieren?
 
Hallo,

wenn ich mir selbst ne Komponente schreibe und diese von TButton ableiten möchte, klappt bisher fast alles.

Nun möchte ich jedoch, bei einem Klick auf den Button meine abgeleitet Kompo aufrufen.

Wie muß ich dazu das OnClick Ereignis des Buttons ableiten?

Delphi-Quellcode:
//...
type
  TMyButton = class(TButton)
  private
    fActionGroup : TActionGroup;

  protected

  public
    property Actiongroup: TActionGroup read factiongroup write fActionGroup;
    procedure Click();override;  //Geht Nicht
  published
    { Published declarations }
  end;

procedure Register;
//...

implementation
Danke,
winx

Muetze1 12. Jun 2008 13:10

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
OnClick ableiten? OnClick ist doch nur eine Property für ein closure... - hä?

Und was heisst "geht nicht?"?

winx 12. Jun 2008 13:30

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
nein, was ich möchte ist, dass ich, wenn ich auf den Button klicke, in meine eigene Funktion springe, die ich in der MyButton Klasse deklariert habe.

Muetze1 12. Jun 2008 13:59

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
Verstanden, aber...

Zitat:

Zitat von Muetze1
Und was heisst "geht nicht?"?


Alter Mann 12. Jun 2008 14:02

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
Hi

sollte es nich so heißen?
Delphi-Quellcode:
//...
type
  TMyButton = class(TButton)
  private
    fActionGroup : TActionGroup;

  protected
    procedure Click();override;  
  public
    property Actiongroup: TActionGroup read factiongroup write fActionGroup;
  published
    { Published declarations } 
  end;
...
TButton stammt von TButtonControl ab und das wiederum von TWinControl und damit ist Click -> protected.

Gruß

mkinzler 12. Jun 2008 14:05

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
Ausserdem macht die Methode etwas anderes, nämlich den Klick auslösen

Muetze1 12. Jun 2008 14:07

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
Zitat:

Zitat von Alter Mann
TButton stammt von TButtonControl ab und das wiederum von TWinControl und damit ist Click -> protected.

Nein, laut meiner Hilfe ist Click Public und ich weiss auch, dass ich die Methode schon öfter mal von aussen aufgerufen habe, um einen Click des Buttons zu erreichen. Und selbst wenn, würde höchstens eine Sichtbarkeitswarnung vom Compiler erscheinen.

Grundlegend ist an dem Code nichts falsch, von daher möchste ich endlich mal geklärt wissen, was "geht nicht" heisst!

/EDIT: richtig, und wenn wir endlich mal die schon vermutete Fehlerbeschreibung haben, dann können wir auf Delphi-Referenz durchsuchenDoClick Delphi-Referenz durchsuchenCN_COMMAND mit Delphi-Referenz durchsuchenBN_CLICKED verweisen. Aber so lange die Leute keine ordentliche Fehlerbeschreibung abgeben und nur schreiben "geht nicht", bin ich nicht bereit mein Wissen zu offerieren. Wer ordentlich mitarbeitet und gute Fehlerbeschreibungen bzw. Fragen liefert, bekommt auch ebenbürtige Antworten/Lösungen.

xxl1 12. Jun 2008 14:09

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
du musst dem Button.onclick ne methode zuweisen wenn du den button creates, geht aber später glaub ich auch noch....

Delphi-Quellcode:
...
Button.OnClick:=deine_procedure;
...
end;

procedure deine_procedure(Sender: TObject);
begin
// Das hier wird ausgeführt...
end;
//edit: wenn du kleinlich mit hobbyprogrammierern sein willst muetze...bitte

mkinzler 12. Jun 2008 14:10

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
Zitat:

Zitat von Delphi Hilfe
Simuliert einen Mausklick durch den Benutzer auf eine Schaltfläche.


Muetze1 12. Jun 2008 14:10

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
Zitat:

Zitat von xxl1
du musst dem Button.onclick ne procedure zuweisen wenn du den button creates, geht aber später glaub ich auch noch....

Delphi-Quellcode:
...
Button.OnClick:=deine_procedure;
...
end;

procedure deine_procedure(Sender: TObject);
begin
// Das hier wird ausgeführt...
end;

1. Kannst du nur Methoden zuweisen und keine Proceduren
2. Schön wenn im Objektinspektor das OnClick Ereignis nicht mehr nutzbar ist, da die Komponente sich selbst belegt. Die ist doch dann recht schlecht nutzbar, oder?

winx 12. Jun 2008 14:38

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
danke!!!

ich habs jetzt mal beides und zwar so:

Delphi-Quellcode:
 
  public
    property Actiongroup: TActionGroup read factiongroup write fActionGroup;

    constructor Create();
    procedure Clicked(Sender:TObject);
    procedure Click();override;

  published

  ...


procedure TAdvActionGlowButton.Click;
begin
  inherited;
  showmessage('CLICKED');
end;

constructor TAdvActionGlowButton.Create;
begin
  self.onClick := Clicked;
end;
Wenn ich nun jedoch einen MyButton erzeuge und auf diese klicke, passiert nix!

Muß ich noch irgendwas verknüpfen???

Neutral General 12. Jun 2008 14:48

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
Hi winx,

Du solltest es am besten so machen, wie Muetze es vorgeschlagen hat. Fange die WM_COMMAND (CN_COMMAND ?) und überprüfe auf BN_CLICKED und führe dann eine Methode aus. Dann bleibt das OnClick Ereignis unangetastet, was mit Sicherheit im Sinne des Benutzers und auch in deinem Sinne sein dürfte.

Gruß
Neutral General

winx 12. Jun 2008 15:02

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
Hi,

das Problem mit dem Objektinspektor wäre mir erstmals egal, da ich die Buttons dynamisch erzeuge. Was mich wundert, ist, dass es nicht funktioniert, wenn ich
im Konstruktor das onClick Ereigniss neu zuweise:

constructor TAdvActionGlowButton.Create;
begin
self.onClick := Clicked;
end;

will das jetzt irgendwie verstehen :-)

oki 12. Jun 2008 20:27

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
Hi,

also, ich bin etwas verwirrt. Eigentlich so verwirrt, dass ich es schnell mal ausprobiert habe. Wo ist das Problem? Procedure Click vererben und alles ist gut.

Klicke ich im folgenden Bsp. auf den Button, dann kommt mein Hallo. Das OnClick muss dabei nicht vergewaltigt werden.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TMyButton = class(TButton)
  public
    procedure Click; override;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
    Button2 : TMyButton;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button2 := TMyButton.Create(self);
  Button2.parent := self;
  Button2.top := 50;
  Button2.Left := 50;
end;

{ TMyButton }

procedure TmyButton.Click;
begin
  inherited;
  MessageDlg('Hallo', mtInformation, [mbOK], 0);
end;

end.
Gruß oki

NickelM 13. Jun 2008 08:56

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
Also ich hab bei einem Panel (das macht aber keinen unterschied) die proceduren DoMouseDown und DoMouseUp überschrieben.

Hab als erstes inherited gemacht und dan meine eigenen Funktionen eingebaut. Es funkt super :mrgreen: :zwinker:

oki 13. Jun 2008 09:02

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
Viele Wege führen nach Rom.

Man sollte nur nich Published-Events auf eigene Proceduren der Klasse umleiten. Die sind eben mal dafür gedacht, dass der Benutzer der Klasse auf Ereignisse reagieren kann. Die Klasse selbst arbeitet ja mit ihren Methoden. Dafür gibt es ja nun mal die Vererbung.

Gruß oki

winx 13. Jun 2008 10:03

Re: Eigene Kompo von TButton ableiten? Wie OnClick realisier
 
bei mir jetzt auch, hab nur das inherited im Konstruktor vergessen ich volldepp


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 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