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/)
-   -   Prism Textbox das Click ereignis hinzufügen. (https://www.delphipraxis.net/58524-textbox-das-click-ereignis-hinzufuegen.html)

Taladan 8. Dez 2005 13:49


Textbox das Click ereignis hinzufügen.
 
Wie man einer Textbox ein Click ereignis zur Laufzeit hinzufügt, ist mir bekannt. Doch da es sich um viele viele Textboxen handelt, möchte ich gerne eine eigene Komponente schreiben, wo man dies bereits über den Objectinspektor machen kann. Wie mache ich das?

Das ich dieses Erben muß ist mir klar, aber er findet angeblich nie etwas in der Basisklasse. Hier mein bisheriger Versuch

Delphi-Quellcode:
unit CTalasTextBox;

interface

uses
  System.Windows.Forms, System.Drawing, System.Collections, System.ComponentModel;

type

  TalasTextBox = class(System.Windows.Forms.Textbox)
  {$REGION 'Vom Designer verwalteter Code'}
  strict private
    /// <summary>
    /// Erforderliche Designervariable.
    /// </summary>
    Components: System.ComponentModel.Container;
    /// <summary>
    /// Erforderliche Methode zur Unterstützung des Designers -
    /// ändern Sie die Methode nicht mit dem Quelltext-Editor
    /// </summary>
    procedure InitializeComponent;
  {$ENDREGION}
  strict protected
    /// <summary>
    /// Ressourcen nach der Verwendung bereinigen
    /// </summary>
    procedure Dispose(Disposing: Boolean); override;
    procedure OnClick(sender: System.Object; e: System.EventArgs); override;
  private
    { Private-Deklarationen }
  public
    constructor Create; overload;
    constructor Create(Container: System.ComponentModel.IContainer); overload;
  published
    Property Click : OnClick;
  end;

implementation

uses
  System.Globalization;

{$AUTOBOX ON}

{$REGION 'Vom Windows Form-Designer erzeugter Code'}
/// <summary>
/// Erforderliche Methode zur Unterstützung des Designers -
/// ändern Sie die Methode nicht mit dem Quelltext-Editor
/// </summary>
procedure TalasTextBox.InitializeComponent;
begin
  Self.Components := System.ComponentModel.Container.Create;
end;
{$ENDREGION}

constructor TalasTextBox.Create;
begin
  inherited Create;
  //
  // Erforderlich für die Unterstützung des Windows Forms-Designers
  //
  InitializeComponent;
  //
  // TODO: Fügen Sie nach dem Aufruf von InitializeComponent Konstruktorcode hinzu.
  //
end;

constructor TalasTextBox.Create(Container: System.ComponentModel.IContainer);
begin
  inherited Create;
  //
  // Erforderlich für die Unterstützung des Windows Forms-Designers
  //
  Container.Add(Self);
  InitializeComponent;
  //
  // TODO: Fügen Sie nach dem Aufruf von InitializeComponent Konstruktorcode hinzu.
  //
end;

procedure TalasTextBox.Dispose(Disposing: Boolean);
begin
  if Disposing then
  begin
    if Components <> nil then
      Components.Dispose();
  end;
  inherited Dispose(Disposing);
end;

end.

Khabarakh 8. Dez 2005 14:11

Re: Textbox das Click ereignis hinzufügen.
 
Mir ist nicht wirklich klar, was du machen willst. Man kann doch Events schon im OI zuweisen und wozu willst du Click redefinieren?
Click ist in TextBoxBase so definiert:
Code:
[EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
public event EventHandler Click; // von Control.Click

Taladan 8. Dez 2005 16:30

Re: Textbox das Click ereignis hinzufügen.
 
Richtig. Aber bei einer TextBox gibt es das Event Click im Objectinspekotor nicht. Dort gibt es nur DoubleClick, aber kein Click. Zuordnen kann man jedoch ein Click verhalten wärend der Laufzeit für eine Textbox. Warum zeigt der OI dieses Event nicht an?

Neutral General 8. Dez 2005 16:34

Re: Textbox das Click ereignis hinzufügen.
 
Zitat:

Zitat von Taladan
Richtig. Aber bei einer TextBox gibt es das Event Click im Objectinspekotor nicht. Dort gibt es nur DoubleClick, aber kein Click. Zuordnen kann man jedoch ein Click verhalten wärend der Laufzeit für eine Textbox. Warum zeigt der OI dieses Event nicht an?

Naja im Notfall leitestest du halt schnell ne Komponente von der Textbox ab und schreibst in den published Teil einfach:

Delphi-Quellcode:
published
 property OnClick;
das müsste wenn ich mich nicht irre ohne Probleme gehen... (und erspart viel Code :D)

EDIT: Ich habe grad das Gefühl das ich ziemlich sicher Mist geredet hab :oops: :mrgreen:

Taladan 9. Dez 2005 12:51

Re: Textbox das Click ereignis hinzufügen.
 
Bekomme zwei Fehlermeldungen.
'OnClick' wurde vorher nicht als Property deklariert
Read und Write-Klausel erwartet, aber 'end' gefunden

Khabarakh 9. Dez 2005 20:07

Re: Textbox das Click ereignis hinzufügen.
 
Zitat:

Zitat von Taladan
Richtig. Aber bei einer TextBox gibt es das Event Click im Objectinspekotor nicht.

Du hast Recht, allerdings nur im alten 1.1 Framework. Das konnte ich wirklich nicht ahnen :stupid: .
Zitat:

'OnClick' wurde vorher nicht als Property deklariert
Stimmt, das Event heißt schließlich Click.

Elvis 9. Dez 2005 22:38

Re: Textbox das Click ereignis hinzufügen.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmmm ganz schön viel Code um einfach ein Event mit epnem anderen Attribut zu versehen.... :gruebel:
Code:
public class ClickableTextBox : TextBox
{
   [Browsable(true)]
   public new event EventHandler Click
   {
      add { base.Click += value; }
      remove { base.Click -= value; }
   }
}
Es gibt übrigens einen guten Grund, warum das Event für TextBox im Designer versteckt wurde:
Es gibt nämlich kaum gute Gründe, warum man das Event für TextBox im Designer besetzen sollte. (Mir fällt nichtmal ein einziger ein... :gruebel: )

btw: Dass es wirklich so easy geht sieht du wenn das Li.. äh wenn du auf den screenie schaust. ;)

faux 9. Dez 2005 22:56

Re: Textbox das Click ereignis hinzufügen.
 
Also so leid es mir tut, aber ich verstehe den Sinn darin nicht.
Ich habe auch bei einer System.Windows.Forms.TextBox ein Click - Event.

@Elvis:
Wie hast du das gemacht, dass du den Code in Zeile 9 bekommst, ohne dass dir der Designer entgegen springt? Eine zweite Datei angelegt?

Habs gerade im Reiter gesehen: ClickableTextBox.cs

Grüße
Faux

Khabarakh 9. Dez 2005 23:07

Re: Textbox das Click ereignis hinzufügen.
 
Zitat:

Zitat von faux
Also so leid es mir tut, aber ich verstehe den Sinn darin nicht.
Ich habe auch bei einer System.Windows.Forms.TextBox ein Click - Event.

Wie ich oben schon geschrieben habe, erst ab 2.0 lässt sich das Event im OI finden.

Elvis 9. Dez 2005 23:07

Re: Textbox das Click ereignis hinzufügen.
 
Zitat:

Also so leid es mir tut, aber ich verstehe den Sinn darin nicht.
Ich habe auch bei einer System.Windows.Forms.TextBox ein Click - Event.
:shock: Stümmt in 2.0 Ist TextBoxBase.Click nicht mehr Browsable(false)! Warum auch immer...

Edit: Nur um sicher zugehen habe ich mir gerade nochmal das alte #d gesaugt und es damit probiert: Es klappt natürlich. ;)

Zitat:

Wie hast du das gemacht, dass du den Code in Zeile 9 bekommst, ohne dass dir der Designer entgegen springt? Eine zweite Datei angelegt?
Indem ich es einfach tippe? :gruebel: Natürlich springt bei dir der Designer an, wenn du bei Componenten tandardmäßig den Designer starten lässt.(btw, ekelhafte default Einstellung im VS...)

Taladan 10. Dez 2005 16:46

Re: Textbox das Click ereignis hinzufügen.
 
Zitat:

Zitat von Elvis
Code:
public class ClickableTextBox : TextBox
{
   [Browsable(true)]
   public new event EventHandler Click
   {
      add { base.Click += value; }
      remove { base.Click -= value; }
   }
}

Kann mir jemand das mal für Pascal übersetzen. Ich bekomme das nicht hin :cry:

Ich habe das gemacht, funktioniert jedoch nicht, da das ereignis nirgends ausgelöst wird.
Delphi-Quellcode:
  OnClick = procedure(sender: System.Object; e: System.Windows.Forms.MouseEventArgs) of Object;

  TalasTextBox = class(System.Windows.Forms.Textbox)
  {$REGION 'Vom Designer verwalteter Code'}
  strict private
    /// <summary>
    /// Erforderliche Designervariable.
    /// </summary>
    Components: System.ComponentModel.Container;
    /// <summary>
    /// Erforderliche Methode zur Unterstützung des Designers -
    /// ändern Sie die Methode nicht mit dem Quelltext-Editor
    /// </summary>
    procedure InitializeComponent;
  {$ENDREGION}
  strict protected
    /// <summary>
    /// Ressourcen nach der Verwendung bereinigen
    /// </summary>
    procedure Dispose(Disposing: Boolean); override;
  private
    { Private-Deklarationen }
    FClick : OnClick;
  public
    constructor Create; overload;
    constructor Create(Container: System.ComponentModel.IContainer); overload;
  published
    [Category('Aktion'),
    Description('Tritt auf, wenn das Steuerelement geklickt wird'),
    Browsable(true)]
    property Click : OnClick add FClick remove FClick;
  end;

Elvis 10. Dez 2005 21:14

Re: Textbox das Click ereignis hinzufügen.
 
Zitat:

Kann mir jemand das mal für Pascal übersetzen. Ich bekomme das nicht hin :cry:
Ich habe das gemacht, funktioniert jedoch nicht, da das ereignis nirgends ausgelöst wird.
Bist du dir sicher, dass du weißt was du und vor allem was der designer da für dich macht?
Hast du irgendwo in meinem Code in Feld gesehen? (Soviel C# sollte man schon erwarten können ;) )
Nein. Warum _sollte_ eigentlich klar sein: Ich will den Event des Vorgängers nur mit einem Attribute versehen.
Ihn also durchschleifen, nicht verstecken! Da er nicht virtuell deklariert ist, musste ich ihn verpacken und, wie gesagt, alle Zugriffe auf Click des Vorgängers durchreichen.
Das hier könnte gehen:
Delphi-Quellcode:
ClickableTextBox = class(Textbox)
public
  Browsable(true)]
  property Click;
end;
Geht es nicht, bräuchte man eine 1:1 Umsetzung meines C# Codes zu D.Net:
Delphi-Quellcode:
ClickableTextBox = class(Textbox)
private
  procedure add_Click(value : EventHandler);
  procedure remove_Click(value : EventHandler);
public
  Browsable(true)]
  property Click : EventHandler add add_Click remove remove_Click; reintroduce;
end;
...
procedure ClickableTextBox.add_Click(value : EventHandler);
begin
  include(inherited Click, value);
end;

procedure ClickableTextBox.remove_Click(value : EventHandler);
begin
  exclude(inherited Click, value);
end;
Es kann sein, dass der Compiler am reintroduce abkackt. (habe keinen D.Net compiler und es auch ewig nicht angefast)
Wenn er es nicht kapiert, nimm es einfach weg.

Zu meiner Frage oben: Das war keine rocket science und auch keine architektonische Meisterleistung. Es scheiterte schon am Deklarieren eines einzigen Events...

Taladan 11. Dez 2005 14:34

Re: Textbox das Click ereignis hinzufügen.
 
Danke dafür. Wobei nach meinen Tests man nur folgendes machem muß

Delphi-Quellcode:
ClickableTextBox = class(System.Windows.Forms.Textbox)
public
    [Category('Aktion'),
    Browsable(true)]
    property Click;
end;
Wichtig ist das beides, also Category und Browsable angegeben wird. An sonnsten wird das Event immer noch versteckt :-)

Elvis 11. Dez 2005 16:24

Re: Textbox das Click ereignis hinzufügen.
 
Zitat:

Zitat von Taladan
Wichtig ist das beides, also Category und Browsable angegeben wird. An sonnsten wird das Event immer noch versteckt :-)

Schaue mal ganz unten unter "misc.".
Man nimmt auch generell niemals deutsche Namen für Kategorien. Generell nimmt eigentlich niemals deutsche Bezeichner, Kommentare,... (wer weiß, wer den Code später bearbeiten muss...)
Nimm den englischen und er wird in jeder Sprache richtig dargestellt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 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 by Thomas Breitkreuz