![]() |
Datensensitive Controls zur Laufzeit erzeugen
Hallo,
ich zeige mit dem folgendem Sourcecode, wie man dynamisch zur Laufzeit datensensitive Controls (TDBEdit, TDBCheckBox, TDBMemo) zusammen mit beschreibenden Labels erzeugen kann. Das Ergebnis sieht dann ungefähr so aus (die eckigen Klammern stellen die Eingabefelder dar):
Code:
Als "Unterlage" (Parameter AOwner) für die dynamisch erzeugten Steuerelemente kann man ein Panel,
Feld1 [ ]
Feld2 [ ] Feld3 [ ] eine Groupbox oder ein TabSheet verwenden. Die beschreibenden Labels können links- oder rechtsbündig (taRightJustify) ausgerichtet werden. (ich finde rechtsbündig sieht besser aus)
Delphi-Quellcode:
[edit=Matze]Code formatiert. Mfg, Matze[/edit]
procedure CreateDynamicDetailPage(AOwner:TwinControl; ds:TDataSource; labelalignment:TAlignment);
const XPOS_LABELS = 5; XPOS_CONTROLS = 130; SPACING_CONTROLS = 1; NAME_DBCONTROL = 'DBControl_'; NAME_LABEL = 'LblField_'; var i: Integer; y: Integer; c,lbl: TControl; fd: TFieldDef; dataset : TDataSet; begin Assert(Assigned(AOwner)); Assert(Assigned(ds)); // Falls die DB-Elemente schon angelegt worden sind, erst mal löschen KillDynamicDetailPage(AOwner); dataset := ds.DataSet; if not Assigned(dataset) then Exit; y := SPACING_CONTROLS; for i := 0 to dataset.FieldDefs.Count-1 do begin c := nil; fd := dataset.FieldDefs[i]; case fd.DataType of ftString,ftFixedChar,ftWideString, ftSmallint,ftInteger,ftWord, ftFloat,ftCurrency,ftBCD, ftDate,ftTime,ftDateTime: begin c := TDBEdit.Create(AOwner); with TDBEdit(c) do begin Name := NAME_DBCONTROL+IntToStr(i); DataSource := ds; DataField := fd.Name; end; if fd.DataType in [ftSmallint,ftInteger,ftWord,ftDate,ftTime] then c.Width := 80 else if fd.DataType in [ftFloat,ftCurrency,ftBCD] then c.Width := 80 else if fd.DataType in [ftDateTime] then c.Width := 120 else c.Width := 300; end; ftBoolean: begin c := TDBCheckBox.Create(AOwner); with TDBCheckBox(c) do begin Name := NAME_DBCONTROL+IntToStr(i); DataSource := ds; DataField := fd.Name; Caption := ''; end; end; ftMemo: begin c := TDBMemo.Create(AOwner); with TDBMemo(c) do begin Parent := AOwner; WordWrap := False; ScrollBars := ssBoth; Name := NAME_DBCONTROL+IntToStr(i); DataSource := ds; DataField := fd.Name; end; c.Width := 300; c.Height := 100; end; else begin c := TLabel.Create(AOwner); with TLabel(c) do begin Name := NAME_DBCONTROL+IntToStr(i); Caption := '??? (' + GetEnumName(TypeInfo(TFieldType),Ord(fd.DataType)) + ')'; end; end; end; if Assigned(c) then begin // create a Label for the control c.Top := y; c.Left := XPOS_CONTROLS; if not (c is TDBMemo) then AOwner.InsertControl(c); lbl := TLabel.Create(AOwner); with TLabel(lbl) do begin Name := NAME_LABEL+IntToStr(i); Top := y+2; // Labels are smaller than DB-conrols if labelalignment= taRightJustify then begin Left := 0; Width := XPOS_CONTROLS-5; AutoSize := False; Alignment := labelalignment; end else Left := XPOS_LABELS; // Caption := fd.Name; Caption := fd.DisplayName; end; AOwner.InsertControl(lbl); y := y + c.Height + SPACING_CONTROLS; end; end; end; {************************************************************************** * NAME: KillDynamicDetailPage * DESC: Zum Abräumen der mit CreateDynamicDetailPage erstellten Controls * PARAMS: [-] * CREATED: 08-04-2004/shmia * CHANGED: 00-00-2004/shmia *************************************************************************} procedure KillDynamicDetailPage(AOwner:TWinControl); const NAME_DBCONTROL = 'DBControl_'; NAME_LABEL = 'LblField_'; var i: Integer; c : TControl; begin Assert(Assigned(AOwner)); for i := AOwner.ControlCount-1 downto 0 do begin c := AOwner.Controls[i]; if (Pos(NAME_DBCONTROL,c.Name) > 0) or (Pos(NAME_LABEL,c.Name) > 0) then c.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 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