AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Datenbanken Delphi Datensensitive Controls zur Laufzeit erzeugen
Thema durchsuchen
Ansicht
Themen-Optionen

Datensensitive Controls zur Laufzeit erzeugen

Ein Thema von shmia · begonnen am 8. Apr 2004
Antwort Antwort
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#1

Datensensitive Controls zur Laufzeit erzeugen

  Alt 8. Apr 2004, 14:51
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]
Andreas
  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 02:06 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