Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Datenbanken (https://www.delphipraxis.net/22-library-datenbanken/)
-   -   Delphi Datensensitive Controls zur Laufzeit erzeugen (https://www.delphipraxis.net/19762-datensensitive-controls-zur-laufzeit-erzeugen.html)

shmia 8. Apr 2004 13:51


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:
   Feld1   [             ]
   Feld2   [             ]
   Feld3   [                    ]
Als "Unterlage" (Parameter AOwner) für die dynamisch erzeugten Steuerelemente kann man ein Panel,
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:
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;
[edit=Matze]Code formatiert. Mfg, Matze[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 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