Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TInteger-/TStringField zur Laufzeit erzeugen (https://www.delphipraxis.net/13160-tinteger-tstringfield-zur-laufzeit-erzeugen.html)

Nalincah 12. Dez 2003 09:59


TInteger-/TStringField zur Laufzeit erzeugen
 
Wenn man bei ner aktiven ADOTable nen Doppelklick macht, öffnen sich ein kleines Fenster. Per rechtsklick lassen sich dann mit "Alle Felder hinzufügen" alle Felder hinzufügen (Was sonst *g*). Jetzt meine Frage. Wie mach ich sowas zur Laufzeit? User öffnet ne Tabelle, drückt nen Button und alle Felder aus der Tabelle wurden erzeugt. Hoffe ihr versteht mich

BluesKid 12. Dez 2003 11:36

Re: TInteger-/TStringField zur Laufzeit erzeugen
 
Moin moin

So...die Wahrscheinlichkeit dass ich mich irre is zwar hoch, aber ich denke das du den Feld-Editor zur Laufzeit nicht Einsetzen kannst, weil dieser imho persistente Feldobjekte erzeugt.... :gruebel: ...

Bitte korrigiert mich wenn ich mich irre ... :wink:

Was dir aber helfen könnte um Felder zur Laufzeit zu erstellen is die Eigenschaft fielddefs...

schöne Grüße

Sam

Nalincah 12. Dez 2003 11:47

Re: TInteger-/TStringField zur Laufzeit erzeugen
 
Ich habs mal so versucht:

Delphi-Quellcode:
procedure FormatFelder(Tabelle:TADOTable;GridFelder:TADOTable);
var i : Integer;
    IntFeld   : TIntegerField;
    StrFeld   : TStringField;
    WStrFeld  : TWideStringField;
    SmaIntFeld : TSmallintField;
    LarIntFeld : TLargeintField;
    WrdField  : TWordField;
    AIncField : TAutoIncField;
    FloField  : TFloatField;
    CurField  : TCurrencyField;
    BooField  : TBooleanField;
    DTField   : TDateTimeField;
    DatField  : TDateField;
    TimField  : TTimeField;
    BytField  : TBytesField;
    BCDField  : TBCDField;
    BlobField : TBlobField;
    MemoField : TMemoField;
    VarField  : TVariantField;
    VarBytField: TVarBytesField;
begin
end;
GridFelder.First;
  // Alle Felder der Tabelle werden durchlaufen, und je nach Feldtyp wird für jedes
  // Feld ein Objekt erstellt, in dem Feldspezifische Eigenschaften geändert werden.
  for i := 0 to Tabelle.FieldCount - 1 do
  begin
    // Abfrage des Datentyps
    case Tabelle.Fields[i].DataType of
      // Feldtyp = DataType - ft (z.B. String, Integer)
      ftString:
            begin
                  StrFeld := TStringField.Create(Tabelle);
                  StrFeld.Name := Tabelle.Name+'_'+Tabelle.Fields[i].Name;
                  StrFeld.field
                end;
      ftInteger:
             begin
                  IntFeld := TIntegerField.Create(Tabelle);
                  IntFeld.Name := Tabelle.Name+'_'+Tabelle.Fields[i].Name;
                end;
      ftWideString :
            begin
                  WStrFeld := TWideStringField.Create(Tabelle);
                  WStrFeld.Name := Tabelle.Name+'_'+Tabelle.Fields[i].Name;
                end;
      ftSmallint:
            begin
                  SmaIntFeld := TSmallintField.Create(Tabelle);
                  SmaIntFeld.Name := Tabelle.Name+'_'+Tabelle.Fields[i].Name;
                end;
      // Hier hab ich jetzt welche rausgelassen, damit es nicht so lang wird
    end;
  end;
  while not GridFelder.Eof do
  begin
    FeldName := GridFelder.FieldByName('FELD').AsString;
    case Tabelle.FieldByName(FeldName).DataType of
      ftInteger:
             begin
                  // Sichtbarkeit (Visible) ändern
                  if GridFelder.FieldByName('Visible').AsInteger = 1 then
                    TIntegerField(Tabelle.Name+'_'+FeldName).Visible := True
                  else
                    TIntegerField(Tabelle.Name+'_'+FeldName).Visible := False;
                  // Schreibgeschützt (ReadOnly) ändern
                  if GridFelder.FieldByName('NURLESEN').AsInteger = 1 then
                    TIntegerField(Tabelle.Name+'_'+FeldName).ReadOnly := True
                  else
                    TIntegerField(Tabelle.Name+'_'+FeldName).ReadOnly := False;
                end;

    end;
    GridFelder.Next;
  end;
end;

woki 12. Dez 2003 17:05

Re: TInteger-/TStringField zur Laufzeit erzeugen
 
Hi,


ein kleiner Hinweis:
wenn in der IDE mit dem Feldeditor keine persistenten Felder erzeugt werden, werden die zur Laufzeit dynamisch automatisch beim Offnen des Dataset, (TTAble, TQuery etc) erstellt.
Eigentlich muß man da von Hand nichts machen.


Grüsse
Woki

Nalincah 15. Dez 2003 14:38

Re: TInteger-/TStringField zur Laufzeit erzeugen
 
Zitat:

Zitat von woki
Hi,


ein kleiner Hinweis:
wenn in der IDE mit dem Feldeditor keine persistenten Felder erzeugt werden, werden die zur Laufzeit dynamisch automatisch beim Offnen des Dataset, (TTAble, TQuery etc) erstellt.
Eigentlich muß man da von Hand nichts machen.


Grüsse
Woki

Jo, Danke. Hat mir weiter geholfen.

Leider hab ich noch ein Problem mit den Maske:

Delphi-Quellcode:
if (Tabelle.FieldByName(FeldName).DataType = ftInteger) or
  (Tabelle.FieldByName(FeldName).DataType = ftSmallint) or
  (Tabelle.FieldByName(FeldName).DataType = ftLargeInt) or
  (Tabelle.FieldByName(FeldName).DataType = ftBCD) or
  (Tabelle.FieldByName(FeldName).DataType = ftWord) or
  (Tabelle.FieldByName(FeldName).DataType = ftFloat) then
begin
  // Maske auf das Feld legen (Zum formatieren numerischer Felder)
  if GridFelder.FieldByName('FORMATIERUNG').AsString <> '' then
    TNumericField(Tabelle.FieldByName(FeldName)).EditFormat := GridFelder.FieldByName('FORMATIERUNG').AsString;
end;
Leider wird nichts formatiert

Der soll bei allen numerischen Feldern gucken ob in der Tabelle "Gridfelder" im Feld "FORMATIERUNG" ne Maske drin steht (0.00#.##) und wenn ja, diese Maske auf das Feld anwenden. Aber leider steht da nur z.b. "304" anstatt "304.00".


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