AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Komponente Textbox mit eigenen Buttons

Ein Thema von eddie11 · begonnen am 13. Dez 2005 · letzter Beitrag vom 15. Dez 2005
Antwort Antwort
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
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Eigene Komponente Textbox mit eigenen Buttons

  Alt 13. Dez 2005, 17:17
Zitat von eddie11:
Hi,
Wie krieg ich es jetzt hin, dass alle Ereignisse und Eigenschaften der TextBox zur Laufzeit an die Komponente übergeben werden?
Einfachste lösung. Mach aus deiner Textbox eine Published Property.
Delphi-Quellcode:
    [Category('Textbox'),
     Description('Hier kann man die Voreinstellungen der Textbox ändern')]
    property Textbox: Textbox read MyTextbox write MyTextbox;
    // wie das mit den Ereignissen klappt habe ich noch nie probiert.


Zitat von eddiell:
Muss ich für jedes Ereignis das in der Textbox ausgelöst wird ein Ereignis schreiben um es an die Übergeordnete Komponente weiterzugeben?
Wie meinste das?

Zitat von eddie11:
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?
 eineVariable := Komponente.Text mir den Inhalt der Textbox zurückgeben und
Mach Propertys draus und per Getter und Setter legst du die dan auf die Textbox fest.
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat
eddie11

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

Re: Eigene Komponente Textbox mit eigenen Buttons

  Alt 14. Dez 2005, 09:26
ja, das mit der published Property ist schon klar, dann kann ich im Objektinspektor darauf zugreifen und Eigenschaften ändern bzw. später im Programm darauf zugreifen, das ist es aber nicht was ich will.

Wenn ich meine Komponente (ich nenne sie TextBoxErw) später in irgendeinem Form definiere, dann möchte ich wie folgt darauf zugreifen können
eingegebenerText := TextBoxErw.Text mit dem published Property müsste ich wie folgt arbeiten
eingegebenerText := TextBoxErw.TextBox.Text Das bedeutet, diese Komponente soll alle Eigenschaften und Ereignisse einer Textbox haben, sich auch (fast) genauso verhalten, lediglich erweitert um die Möglichkeit diese drei Buttons zu beinhalten.

Zitat:
Mach Propertys draus und per Getter und Setter legst du die dan auf die Textbox fest.
Ja, wahrscheinlich wird mir nix anderes übrigbleiben


Ich hatte zuerst einen anderen Lösungsweg beschritten, und zwar eine Komponente zu erzeugen, die von der standard-Textbox abgeleitet ist. Mit
TextBoxErw = class(System.Windows.Forms.TextBox) würde genau das funzen was ich will, alle Ereignisse und Properties werden geerbt. Ich könnte auch zur Laufzeit die Buttons erzeugen und hinten rechts in der Textbox plazieren. Dann habe ich nur das Problem, dass der Eingabebereich der Textbox rechts unter den Buttons liegen würde. Gibt es vielleicht eine Möglichkeit den Eingabebereich einer Textbox zu beschränken? Wenn also die Textbox eine Breite von 180 hat, den Eingebereich auf 140 zu begrenzen?
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

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

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

Re: Eigene Komponente Textbox mit eigenen Buttons

  Alt 15. Dez 2005, 11:31
geht die Übernahme von Eigenschaften eventuell mit einer Datenanbindung? Der Objektinspektor hat unter "DataBindings" eine Eigenschaft "Erweitert", da kann ich dann irgendwelche Daten-Anbindungen eingeben, habe aber keine Peilung wie das geht.
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Eigene Komponente Textbox mit eigenen Buttons

  Alt 15. Dez 2005, 13:28
Dieses ist dafür da, um möglichst einfach die Werte aus den Komponenten z.b. an Strings oder Datenbanken zu koppeln.

Textbox.databindings.add('text', myDataSet, 'MyTable'); Dies wäre die übliche Databindung für alle TEXT Eigenschaften, die mit einen Dataset zur speicherung verbunden sind. Natürlich kann man auch Stringarrays oder ähnlich dran binden. Habe ich bisher noch nicht gemacht.

Trotz einer Databindung müßtest auch bei eine eigene Property setzen, denn wo nichts ist, kann auch nichts gebunden werden. Dann kannste aber auch gleich getter und setter nehmen, wobei das vermutlich durch ne Datenbindung weniger Quelltext ist, da dies wohl auch zum Durchschleifen genutzt werden kann, da man durch die Datenbindung fast alles verknüpfen kann (incl. Objecte/Listen).
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:05 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