Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Sichtbarkeit von Tabellenfeldern (https://www.delphipraxis.net/15645-sichtbarkeit-von-tabellenfeldern.html)

barnti 2. Feb 2004 07:50


Sichtbarkeit von Tabellenfeldern
 
Hallo,

Ich habe die Sichtbarkeit aller Felder aller Tabellen in einer weiteren sog. Konfigurationstabelle abgelegt. Soll jetzt der Inhalt einer Tabelle in einem DBGrid angezeigt werden, so lade ich erst alle Daten der betreffenden Tabelle über eine Query in ein Dataset:

Delphi-Quellcode:
Query.sql.add('SELECT * FROM Tabelle');
Anschließend lese ich aus der Konfigurationstabelle das Attribut für die Sichtbarkeit der Felder dieser Tabelle:

Delphi-Quellcode:
...

for i:=0 to Datasource.DataSet.FieldCount-1 do
  begin
    Datasource.DataSet.Fields[i].Visible:= visability[i+1]='1';
    Datasource.DataSet.Next;
  end;
Das Attribut "visability" ist ein String der Form: '001010011011'. Die Sichtbarkeit wird jedem Feld im Dataset über die Schleife zugeordnet. So weit klappt das auch.

Will ich jetzt ebenfalls zur Laufzeit das Grid mit der Datasource verbinden, mache ich das folgende:

Delphi-Quellcode:
...

 with Grid do
  begin
    for ColCount:=0 to DataSource.DataSet.FieldCount-1 do
      Fields[ColCount].Visible:= DataSource.DataSet.Fields[ColCount].Visible;
        end;
Leider sind immer alle Felder sichtbar!? Wo ist mein Fehler?

Danke und Gruß,

Barnti

barnti 2. Feb 2004 08:09

Re: Sichtbarkeit von Tabellenfeldern
 
Ich habe dazu noch folgendes:

Zitat:


...

with Grid do
begin
for ColCount:=0 to DataSource.DataSet.FieldCount-1 do
Fields[ColCount].Visible:= DataSource.DataSet.Fields[ColCount].Visible;
end;

Wenn ich mir DataSource.DataSet.Fields[ColCount].Visible ausgeben lasse sind alle Felder sichtbar. Das Problem ist also, dass die vorherige Zuweisung des Visible-Atributes nicht dauerhaft gespeichert bleibt. Wie kann ich das ändern? Oder liegt der Fehler an einer anderen Stelle?

Danke und Gruß,

Barnti

barnti 3. Feb 2004 07:00

Re: Sichtbarkeit von Tabellenfeldern
 
Hi,

bisher leider noch keine Antwort :( . Daher dieser 'Nachhaker':

Hat die Darstellung von Feldern im Dataset und schließlich im Grid etwas mit persistenten Feldern zu tun? Heißt das, ich muss die Felder zur Laufzeit hinzufügen und nicht automatisch alle Felder übernehmen? Ich habe keine Erfahrung mit diesem Thema.

Gruß,

Barnti

jlanger 3. Feb 2004 15:45

Re: Sichtbarkeit von Tabellenfeldern
 
Zitat:

Zitat von barnti
Hallo,

Will ich jetzt ebenfalls zur Laufzeit das Grid mit der Datasource verbinden, mache ich das folgende:

Delphi-Quellcode:
...

 with Grid do
  begin
    for ColCount:=0 to DataSource.DataSet.FieldCount-1 do
      Fields[ColCount].Visible:= DataSource.DataSet.Fields[ColCount].Visible;
        end;
Leider sind immer alle Felder sichtbar!? Wo ist mein Fehler?

Danke und Gruß,

Barnti

Mache doch einfach, was du geschrieben hast: DAS GRID ZUR LAUFZEIT MIT DER DATASOURCE (neu) VERBINDEN, sonst nichts.

Also einfach

Delphi-Quellcode:
   Grid.DataSource:=nil;
   Grid.DataSource:=DataSource;
Das wars schon. oder hast du vorher dem Grid Felder zugeordnet?

barnti 3. Feb 2004 20:08

Re: Sichtbarkeit von Tabellenfeldern
 
Hi,

ich habe mittlerweile, nach langem Suchen, die Antwort gefunden. Will man die Eigenschaften eines Feldes nutzen, so muss man persistente Felder für ein Dataset erzeugen.

Nutzt man die Felder dynamisch, soll heißen man öffnet einfach die Query, so werden alle Felder automatisch erzeugt. Damit bleiben aber viele Eigenschaften nicht nutzbar.

Fügt man die Felder als persistent hinzu kann man Eigenschaften, wie 'readonly', 'visible' und 'CustomConstraint' nutzen und diese einfach an andere Elemente weitergeben.

schnipp
Delphi-Quellcode:
procedure TDM_Database.CreatePersistentFields(Datasource: TDatasource);
var i: Integer;
begin
  Datasource.DataSet.Open;
  for i := 0 to Datasource.DataSet.FieldDefs.Count -1 do
  begin
      Datasource.DataSet.Close;
      Datasource.DataSet.FieldDefs.Items[i].CreateField(self);
    end;
end;                   // Gefunden in DP-Suche: Persistente Felder
schnapp

Dann funktioniert auch Dein Vorschlag problemlos: einfach DBGrid mit Datasource verbinden. Die Eigenschaften der Felder sind dieselben. Damit können die Eigenschaften der Felder im DBGrid benutzt werden.

Danke für Deine Mühe,

Gruß,

Barnti


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