![]() |
Eigene Komponente Textbox mit eigenen Buttons
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
Delphi-Quellcode:
mir den Inhalt der Textbox zurückgeben und
eineVariable := Komponente.Text
Delphi-Quellcode:
als Zuweisung an die Textbox erfolgen. Das soll für alle anderen Ereigniss und Properties (Visible, Undo, CanUndo, MouseDown, KeyDown... usw. abenfalls passieren)
Komponente.Text := 'irgendwas'
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. |
Re: Eigene Komponente Textbox mit eigenen Buttons
Zitat:
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:
Zitat:
|
Re: Eigene Komponente Textbox mit eigenen Buttons
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
Delphi-Quellcode:
mit dem published Property müsste ich wie folgt arbeiten
eingegebenerText := TextBoxErw.Text
Delphi-Quellcode:
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.
eingegebenerText := TextBoxErw.TextBox.Text
Zitat:
Ich hatte zuerst einen anderen Lösungsweg beschritten, und zwar eine Komponente zu erzeugen, die von der standard-Textbox abgeleitet ist. Mit
Delphi-Quellcode:
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?
TextBoxErw = class(System.Windows.Forms.TextBox)
|
Re: Eigene Komponente Textbox mit eigenen Buttons
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.
|
Re: Eigene Komponente Textbox mit eigenen Buttons
Dieses ist dafür da, um möglichst einfach die Werte aus den Komponenten z.b. an Strings oder Datenbanken zu koppeln.
Delphi-Quellcode:
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.
Textbox.databindings.add('text', myDataSet, 'MyTable');
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). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:24 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-2025 by Thomas Breitkreuz