![]() |
Steuerelemente für eine Tabelle erstellen
Ich habe mir ein paar Nächte um die Ohren geschlagen um eine Navigationsleiste für Delphi Datasets zu erstellen. Es handelt sich um eine UserControl. Diese muß während der Laufzeit (am besten im Load-Event) noch mit einen DataSet und mit einer Tabelle verbunden werden.
Delphi-Quellcode:
procedure Winform1.FTalente_Load(sender: System.Object; e: System.EventArgs);
begin //Hier ist die Navigation bereits auf der Form gesetzt worden Navigation.BindingBase(MyDataSet, 'MeineTabellenNameAlsString'); end;
Delphi-Quellcode:
Edit: Es handelt sich um 7 Buttons und ein Textfeld. Die 7 Buttons übernehmen die Aufgaben des Navigierens Vor, Zurück, Erster und Letzter Datensatz, sowie löschen und einfügen. Der Button Save muß je nach Zugriff noch umgeschrieben werden.
unit CNavigation;
interface uses System.Drawing, System.Collections, System.ComponentModel, System.Windows.Forms, System.Data, System.Resources; type Navigation = class(System.Windows.Forms.UserControl) {$REGION 'Vom Designer verwalteter Code'} strict private /// <summary> /// Erforderliche Designervariable. /// </summary> components: System.ComponentModel.IContainer; btnFirst: System.Windows.Forms.Button; btnPrior: System.Windows.Forms.Button; btnNext: System.Windows.Forms.Button; btnLast: System.Windows.Forms.Button; Buttons: System.Windows.Forms.ImageList; btnNew: System.Windows.Forms.Button; btnDelete: System.Windows.Forms.Button; btnSave: System.Windows.Forms.Button; TextBox1: System.Windows.Forms.TextBox; /// <summary> /// Erforderliche Methode zur Unterstützung des Designers - /// ändern Sie die Methode nicht mit dem Quelltext-Editor /// </summary> procedure InitializeComponent; procedure btnFirst_Click(sender: System.Object; e: System.EventArgs); procedure btnPrior_Click(sender: System.Object; e: System.EventArgs); procedure btnNext_Click(sender: System.Object; e: System.EventArgs); procedure btnLast_Click(sender: System.Object; e: System.EventArgs); procedure btnDelete_Click(sender: System.Object; e: System.EventArgs); procedure btnNew_Click(sender: System.Object; e: System.EventArgs); procedure btnSave_Click(sender: System.Object; e: System.EventArgs); procedure TextBox1_Enter(sender: System.Object; e: System.EventArgs); procedure TextBox1_KeyPress(sender: System.Object; e: System.Windows.Forms.KeyPressEventArgs); procedure TextBox1_TextChanged(sender: System.Object; e: System.EventArgs); procedure TextBox1_Leave(sender: System.Object; e: System.EventArgs); procedure TextBox1_KeyDown(sender: System.Object; e: System.Windows.Forms.KeyEventArgs); {$ENDREGION} strict protected /// <summary> /// Ressourcen nach der Verwendung bereinigen /// </summary> procedure Dispose(Disposing: Boolean); override; private { Private-Deklarationen } myBindingManagerBase : BindingManagerBase; ICurrentPosition : Integer; MyTable : String; MyDataSet : DataSet; Changing : boolean; procedure BindingManagerBase_CurrentChanged(sender: System.Object; e: System.EventArgs); procedure BindingManagerBase_PositionChanged(sender: System.Object; e: System.EventArgs); procedure write_Position(pos:integer); procedure finde_Datensatz(pos: integer); public constructor Create; procedure BindingBase(aDataSet : Dataset; aTable : String); published property Position : integer read ICurrentPosition write write_Position; end; [assembly: RuntimeRequiredAttribute(TypeOf(TNavigation))] 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 TNavigation.InitializeComponent; var resources: System.Resources.ResourceManager; begin Self.components := System.ComponentModel.Container.Create; resources := System.Resources.ResourceManager.Create(TypeOf(TNavigation)); Self.btnFirst := System.Windows.Forms.Button.Create; Self.Buttons := System.Windows.Forms.ImageList.Create(Self.components); Self.btnPrior := System.Windows.Forms.Button.Create; Self.btnNext := System.Windows.Forms.Button.Create; Self.btnLast := System.Windows.Forms.Button.Create; Self.btnDelete := System.Windows.Forms.Button.Create; Self.TextBox1 := System.Windows.Forms.TextBox.Create; Self.btnNew := System.Windows.Forms.Button.Create; Self.btnSave := System.Windows.Forms.Button.Create; Self.SuspendLayout; // // btnFirst // Self.btnFirst.ImageIndex := 0; Self.btnFirst.ImageList := Self.Buttons; Self.btnFirst.Location := System.Drawing.Point.Create(1, 1); Self.btnFirst.Name := 'btnFirst'; Self.btnFirst.Size := System.Drawing.Size.Create(40, 23); Self.btnFirst.TabIndex := 0; Include(Self.btnFirst.Click, Self.btnFirst_Click); // // Buttons // Self.Buttons.ColorDepth := System.Windows.Forms.ColorDepth.Depth16Bit; Self.Buttons.ImageSize := System.Drawing.Size.Create(16, 16); Self.Buttons.ImageStream := (System.Windows.Forms.ImageListStreamer(resources.GetObject('B' + 'uttons.ImageStream'))); Self.Buttons.TransparentColor := System.Drawing.Color.FromArgb((Byte(254)), (Byte(0)), (Byte(254))); // // btnPrior // Self.btnPrior.ImageIndex := 1; Self.btnPrior.ImageList := Self.Buttons; Self.btnPrior.Location := System.Drawing.Point.Create(40, 1); Self.btnPrior.Name := 'btnPrior'; Self.btnPrior.Size := System.Drawing.Size.Create(40, 23); Self.btnPrior.TabIndex := 1; Include(Self.btnPrior.Click, Self.btnPrior_Click); // // btnNext // Self.btnNext.ImageIndex := 2; Self.btnNext.ImageList := Self.Buttons; Self.btnNext.Location := System.Drawing.Point.Create(152, 1); Self.btnNext.Name := 'btnNext'; Self.btnNext.Size := System.Drawing.Size.Create(40, 23); Self.btnNext.TabIndex := 2; Include(Self.btnNext.Click, Self.btnNext_Click); // // btnLast // Self.btnLast.ImageIndex := 3; Self.btnLast.ImageList := Self.Buttons; Self.btnLast.Location := System.Drawing.Point.Create(191, 1); Self.btnLast.Name := 'btnLast'; Self.btnLast.Size := System.Drawing.Size.Create(40, 23); Self.btnLast.TabIndex := 3; Include(Self.btnLast.Click, Self.btnLast_Click); // // btnDelete // Self.btnDelete.ImageIndex := 4; Self.btnDelete.ImageList := Self.Buttons; Self.btnDelete.Location := System.Drawing.Point.Create(230, 1); Self.btnDelete.Name := 'btnDelete'; Self.btnDelete.Size := System.Drawing.Size.Create(40, 23); Self.btnDelete.TabIndex := 6; Include(Self.btnDelete.Click, Self.btnDelete_Click); // // TextBox1 // Self.TextBox1.Font := System.Drawing.Font.Create('Microsoft Sans Serif', 10.25, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (Byte(0))); Self.TextBox1.Location := System.Drawing.Point.Create(78, 0); Self.TextBox1.Name := 'TextBox1'; Self.TextBox1.Size := System.Drawing.Size.Create(75, 23); Self.TextBox1.TabIndex := 8; Self.TextBox1.Text := 'TextBox1'; Self.TextBox1.TextAlign := System.Windows.Forms.HorizontalAlignment.Right; Include(Self.TextBox1.KeyDown, Self.TextBox1_KeyDown); Include(Self.TextBox1.KeyPress, Self.TextBox1_KeyPress); Include(Self.TextBox1.TextChanged, Self.TextBox1_TextChanged); Include(Self.TextBox1.Leave, Self.TextBox1_Leave); Include(Self.TextBox1.Enter, Self.TextBox1_Enter); // // btnNew // Self.btnNew.ImageIndex := 5; Self.btnNew.ImageList := Self.Buttons; Self.btnNew.Location := System.Drawing.Point.Create(269, 1); Self.btnNew.Name := 'btnNew'; Self.btnNew.Size := System.Drawing.Size.Create(40, 23); Self.btnNew.TabIndex := 9; Include(Self.btnNew.Click, Self.btnNew_Click); // // btnSave // Self.btnSave.ImageIndex := 6; Self.btnSave.ImageList := Self.Buttons; Self.btnSave.Location := System.Drawing.Point.Create(308, 1); Self.btnSave.Name := 'btnSave'; Self.btnSave.Size := System.Drawing.Size.Create(40, 23); Self.btnSave.TabIndex := 10; Include(Self.btnSave.Click, Self.btnSave_Click); // // TNavigation // Self.Controls.Add(Self.btnSave); Self.Controls.Add(Self.btnNew); Self.Controls.Add(Self.TextBox1); Self.Controls.Add(Self.btnDelete); Self.Controls.Add(Self.btnLast); Self.Controls.Add(Self.btnNext); Self.Controls.Add(Self.btnPrior); Self.Controls.Add(Self.btnFirst); Self.Name := 'TNavigation'; Self.Size := System.Drawing.Size.Create(349, 24); Self.ResumeLayout(False); end; {$ENDREGION} constructor TNavigation.Create; begin inherited Create; // // Erforderlich für die Unterstützung des Windows Forms-Designers // InitializeComponent; changing := false; // // end; procedure TNavigation.btnLast_Click(sender: System.Object; e: System.EventArgs); begin myBindingManagerBase.Position := myBindingManagerBase.Count - 1; end; procedure TNavigation.btnNext_Click(sender: System.Object; e: System.EventArgs); begin myBindingManagerBase.Position := myBindingManagerBase.Position + 1; end; procedure TNavigation.btnPrior_Click(sender: System.Object; e: System.EventArgs); begin myBindingManagerBase.Position := myBindingManagerBase.Position -1; end; procedure TNavigation.btnFirst_Click(sender: System.Object; e: System.EventArgs); begin myBindingManagerBase.Position := 0;; end; procedure TNavigation.BindingBase(aDataSet : Dataset; aTable : String); begin MyTable := aTable; MyDataSet := aDataSet; myBindingManagerBase := Self.BindingContext[aDataSet, aTable]; Include(myBindingManagerBase.PositionChanged, BindingManagerBase_PositionChanged); Include(myBindingManagerBase.CurrentChanged, BindingManagerBase_CurrentChanged); self.Position := 0; end; procedure TNavigation.TextBox1_KeyDown(sender: System.Object; e: System.Windows.Forms.KeyEventArgs); begin try convert.toint32(Textbox1.Text); except Textbox1.Text := ''; end; end; procedure TNavigation.TextBox1_Leave(sender: System.Object; e: System.EventArgs); begin changing := false; end; procedure TNavigation.TextBox1_TextChanged(sender: System.Object; e: System.EventArgs); var i, i1 : integer; begin if changing = true then begin if textbox1.text <> '' then begin i := convert.ToInt32(Textbox1.Text); if i > (myBindingManagerBase.Count) then begin textbox1.Text := MyBindingManagerbase.Count.ToString; end else if i < 1 then begin Textbox1.Text := '1'; end; end; end; end; procedure TNavigation.TextBox1_KeyPress(sender: System.Object; e: System.Windows.Forms.KeyPressEventArgs); begin if not( e.KeyChar in ['0'..'9']) then begin if e.KeyChar = #13 then begin finde_Datensatz(convert.ToInt32(Textbox1.Text)-1); end; e.Handled := true; end; end; procedure TNavigation.TextBox1_Enter(sender: System.Object; e: System.EventArgs); begin Textbox1.Text := ''; changing := true; end; procedure TNavigation.btnSave_Click(sender: System.Object; e: System.EventArgs); begin // Hier die Speicherprocedure end; procedure TNavigation.btnNew_Click(sender: System.Object; e: System.EventArgs); begin MyDataSet.Tables[MyTable].Rows.Add(MyDataSet.Tables[MyTable].NewRow); MyDataSet.AcceptChanges; end; procedure TNavigation.btnDelete_Click(sender: System.Object; e: System.EventArgs); begin self.MyDataSet.Tables[MyTable].Rows.RemoveAt(myBindingManagerBase.Position); end; procedure TNavigation.finde_Datensatz(pos: integer); begin myBindingManagerBase.Position := pos; end; procedure TNavigation.BindingManagerBase_PositionChanged(sender: System.Object; e: System.EventArgs); begin position := BindingManagerBase(sender).Position; end; procedure TNavigation.BindingManagerBase_CurrentChanged(sender: System.Object; e: System.EventArgs); begin position := BindingManagerBase(sender).Position; end; procedure TNavigation.write_Position(pos : Integer); var i, i1 : integer; begin ICurrentPosition := pos; if (position = 0) then begin btnfirst.Enabled := false; btnprior.Enabled := false; btnnext.Enabled := true; btnlast.Enabled := true; end else if (position = (myBindingManagerBase.Count - 1)) then begin btnfirst.Enabled := true; btnprior.Enabled := true; btnnext.Enabled := false; btnlast.Enabled := false; end else begin btnfirst.Enabled := true; btnprior.Enabled := true; btnnext.Enabled := true; btnlast.Enabled := true; end; if myBindingManagerBase <> nil then begin i := myBindingManagerBase.Count; i1 := ICurrentposition+1; textbox1.Text := i1.ToString + ' von ' + i.tostring; end; end; procedure TNavigation.Dispose(Disposing: Boolean); begin if Disposing then begin if Components <> nil then Components.Dispose(); end; inherited Dispose(Disposing); end; end. Edit2: Das Textfeld wird zur direkten Datensatz-Navigation verwendet. Wobei es bei .Net keinen Datensatzzeiger gibt. Für direkte Edits aus den Program gibt es die Eigenschaft Position zum auslesen. Das Textfeld mag nur Zahlen. |
Re: Steuerelemente für eine Tabelle erstellen
Hi,
in deinem Fall fände ich es besser, wenn du das ganze als Assembly verpacken würdest und es dann als OpenSource-Control in der OpenSource-Sparte vorstellen würdest. Ich denke da wäre dein Control etwas besser aufgehoben. ;) Chris |
DP-Maintenance
Dieses Thema wurde von "Chakotay1308" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Open-Source" verschoben.
Eher was für die OpenSource-Sparte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 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