Einzelnen Beitrag anzeigen

eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#1

Eigene Komponente Textbox mit eigenen Buttons

  Alt 13. Dez 2005, 15:10
Hi,

ich habe folgendes Problem: Ich brauche für eine größere Anwendung eine Textbox hinter der hinten rechts ein bis drei Buttons eingefügt sind (ähnlich wie bei einer Kombo-Box). Da ich faul bin und nicht jedesmal eine Textbox und drei Buttons ins Formular einfügen möchte, habe ich mir also eine eigene Komponente erstellt. Ich brauche nur diese Komponente ins Window zu platzieren und die Buttons sind auch da. Die Komponente besteht aus einem Panel (als Umrahmung), einer Textbox ohne Rahmen und drei Buttons. Die Textbox und die Buttons sind im Panel plaziert. Ich habe eigene Properties für das Erscheinen der Buttons definiert, kann also über die Properties der Komponte bestimmen ob die Buttons erscheinen oder nicht. Soweit sogut, das funzt auch alles prima. Wie krieg ich es jetzt hin, dass alle Ereignisse und Eigenschaften der TextBox zur Laufzeit an die Komponente übergeben werden? Muss ich für jedes Ereignis das in der Textbox ausgelöst wird ein Ereignis schreiben um es an die Übergeordnete Komponente weiterzugeben? Oder gibt es eine einfachere Möglichkeit z.B. KeyDown, TextChanged or ganz profan nur den Text etc. aus der Textbox an die übergeordnete Komponente weiterzureichen?

Im späteren Formular soll dann

 eineVariable := Komponente.Text mir den Inhalt der Textbox zurückgeben und Komponente.Text := 'irgendwas' als Zuweisung an die Textbox erfolgen. Das soll für alle anderen Ereigniss und Properties (Visible, Undo, CanUndo, MouseDown, KeyDown... usw. abenfalls passieren)

Hier mein Quelltext:

Delphi-Quellcode:
unit ControlTextBoxErw;

interface

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

type
  AssistClickHandler = Procedure(sender: System.Object; e: EventArgs);
  TextBoxErw = class(System.Windows.Forms.UserControl)
  {$REGION 'Vom Designer verwalteter Code'}
  strict private
    /// <summary>
    /// Erforderliche Designervariable.
    /// </summary>
    components: System.ComponentModel.IContainer;
    Panel1: System.Windows.Forms.Panel;
    TextBox: System.Windows.Forms.TextBox;
    AssistButton: System.Windows.Forms.Button;
    LookUpButton: System.Windows.Forms.Button;
    DrillDownButton: System.Windows.Forms.Button;
    /// <summary>
    /// Erforderliche Methode zur Unterstützung des Designers -
    /// ändern Sie die Methode nicht mit dem Quelltext-Editor
    /// </summary>
    procedure InitializeComponent;
    procedure Assist_Click(sender: System.Object; e: System.EventArgs);
  {$ENDREGION}
  strict protected
    procedure OnSizeChanged(e: EventArgs); override;
    procedure OnPaint(e: PaintEventArgs); override;

    /// <summary>
    /// Ressourcen nach der Verwendung bereinigen
    /// </summary>
    procedure Dispose(Disposing: Boolean); override;
  private
    { Private-Deklarationen }
    var fAssistClick: AssistClickHandler;
        PropertyHatAssistButton: boolean;
        PropertyHatLookUpButton: boolean;
        PropertyHatDrillDownButton: boolean;
    Procedure Zeichnen();
  protected
    Procedure OnAssistClick;
  public
    constructor Create;
  published
    property Text;
    [Category('Eigene Properties')]
    [Description('Control hat DrillDown-Button')]
    property HatDrillDownButton: Boolean read PropertyHatDrillDownButton write PropertyHatDrillDownButton default false;
    [Category('Eigene Properties')]
    [Description('Control hat Lookup-Button')]
    property HatLookUpButton: Boolean read PropertyHatLookUpButton write PropertyHatLookUpButton default false;
    [Category('Eigene Properties')]
    [Description('Control hat Assist-Button')]
    property HatAssistButton: Boolean read PropertyHatAssistButton write PropertyHatAssistButton default false;
    [Category('Eigene Ereignisse')]
    [Description('tritt auf wenn der Assist-Button gedrückt wird')]
    property AssistClick: AssistClickHandler add fAssistClick remove fAssistclick;
  end;

  [assembly: RuntimeRequiredAttribute(TypeOf(TextBoxErw))]

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 TextBoxErw.InitializeComponent;
var
  resources: System.Resources.ResourceManager;
begin
  Self.components := System.ComponentModel.Container.Create;
  resources := System.Resources.ResourceManager.Create(TypeOf(TextBoxErw));
  Self.Panel1 := System.Windows.Forms.Panel.Create;
  Self.LookUpButton := System.Windows.Forms.Button.Create(Self.components);
  Self.AssistButton := System.Windows.Forms.Button.Create(Self.components);
  Self.TextBox := System.Windows.Forms.TextBox.Create(Self.components);
  Self.DrillDownButton := System.Windows.Forms.Button.Create(Self.components);
  Self.Panel1.SuspendLayout;
  Self.SuspendLayout;
  //
  // Panel1
  //
  Self.Panel1.BackColor := System.Drawing.SystemColors.Window;
  Self.Panel1.BorderStyle := System.Windows.Forms.BorderStyle.Fixed3D;
  Self.Panel1.Controls.Add(Self.LookUpButton);
  Self.Panel1.Controls.Add(Self.AssistButton);
  Self.Panel1.Controls.Add(Self.TextBox);
  Self.Panel1.Controls.Add(Self.DrillDownButton);
  Self.Panel1.Dock := System.Windows.Forms.DockStyle.Fill;
  Self.Panel1.Location := System.Drawing.Point.Create(0, 0);
  Self.Panel1.Name := 'Panel1';
  Self.Panel1.Size := System.Drawing.Size.Create(128, 21);
  Self.Panel1.TabIndex := 0;
  //
  // LookUpButton
  //
  Self.LookUpButton.BackColor := System.Drawing.SystemColors.Control;
  Self.LookUpButton.Image := (System.Drawing.Image(resources.GetObject('Look' +
    'UpButton.Image')));
  Self.LookUpButton.Location := System.Drawing.Point.Create(92, 0);
  Self.LookUpButton.Name := 'LookUpButton';
  Self.LookUpButton.Size := System.Drawing.Size.Create(16, 16);
  Self.LookUpButton.TabIndex := 2;
  Self.LookUpButton.TabStop := False;
  Self.LookUpButton.Visible := False;
  //
  // AssistButton
  //
  Self.AssistButton.BackColor := System.Drawing.SystemColors.Control;
  Self.AssistButton.Image := (System.Drawing.Image(resources.GetObject('Assi' +
    'stButton.Image')));
  Self.AssistButton.Location := System.Drawing.Point.Create(108, 0);
  Self.AssistButton.Name := 'AssistButton';
  Self.AssistButton.Size := System.Drawing.Size.Create(16, 16);
  Self.AssistButton.TabIndex := 1;
  Self.AssistButton.TabStop := False;
  Self.AssistButton.Visible := False;
  //
  // TextBox
  //
  Self.TextBox.AutoSize := False;
  Self.TextBox.BorderStyle := System.Windows.Forms.BorderStyle.None;
  Self.TextBox.Location := System.Drawing.Point.Create(1, 1);
  Self.TextBox.Name := 'TextBox';
  Self.TextBox.Size := System.Drawing.Size.Create(55, 20);
  Self.TextBox.TabIndex := 0;
  Self.TextBox.Text := 'TextBox';
  //
  // DrillDownButton
  //
  Self.DrillDownButton.BackColor := System.Drawing.SystemColors.Control;
  Self.DrillDownButton.Image := (System.Drawing.Image(resources.GetObject('D' +
    'rillDownButton.Image')));
  Self.DrillDownButton.Location := System.Drawing.Point.Create(76, 0);
  Self.DrillDownButton.Name := 'DrillDownButton';
  Self.DrillDownButton.Size := System.Drawing.Size.Create(16, 16);
  Self.DrillDownButton.TabIndex := 2;
  Self.DrillDownButton.TabStop := False;
  Self.DrillDownButton.Visible := False;
  //
  // TextBoxErw
  //
  Self.BackColor := System.Drawing.SystemColors.HotTrack;
  Self.Controls.Add(Self.Panel1);
  Self.Name := 'TextBoxErw';
  Self.Size := System.Drawing.Size.Create(128, 21);
  Self.Panel1.ResumeLayout(False);
  Self.ResumeLayout(False);
end;
{$ENDREGION}

constructor TextBoxErw.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;

procedure TextBoxErw.Assist_Click(sender: System.Object; e: System.EventArgs);
begin
  OnAssistClick();
end;

Procedure TextBoxErw.OnAssistClick;
begin;
  if assigned(fAssistClick) then
    fAssistClick(self, EventArgs.Create);
end;

procedure TextBoxErw.OnSizeChanged(e: EventArgs);
begin;
  Zeichnen();
  inherited OnSizeChanged(e);
end;


procedure TextBoxErw.OnPaint(e: PaintEventArgs);
begin;
  Zeichnen();
  inherited OnPaint(e);
end;

procedure TextBoxErw.Zeichnen();
var FreieLinksBreite: integer;

begin;
  FreieLinksBreite := self.Width-3;

  if Self.PropertyHatDrillDownButton then begin
    FreieLinksBreite := FreieLinksBreite - self.DrillDownButton.Width;
    self.DrillDownButton.Top := 0;
    self.DrillDownButton.Left := FreieLinksBreite;
    self.DrillDownButton.Height := self.Height-4;
    self.DrillDownButton.Visible := true;
  end;

  if Self.PropertyHatLookUpButton then begin
    FreieLinksBreite := FreieLinksBreite - self.LookUpButton.Width;
    self.LookUpButton.Top := 0;
    self.LookUpButton.Left := FreieLinksBreite;
    self.LookUpButton.Height := self.Height-4;
    self.LookUpButton.Visible := true;
  end;

  if Self.PropertyHatAssistButton then begin
    FreieLinksBreite := FreieLinksBreite - self.AssistButton.Width;
    self.AssistButton.Top := 0;
    self.AssistButton.Left := FreieLinksBreite;
    self.AssistButton.Height := self.Height-4;
    self.AssistButton.Visible := true;
  end;

  TextBox.width := FreieLinksBreite-1;
end;

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

end.
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat