![]() |
Delphi-Version: 7
Über String auf Komponente zugreife
Hallo Forum,
ich habe zwar einige Threads zu meinem Thema gefunden, aber keinen konnte ich nutzen wie ich es benötige bzw. mir gedacht habe. Zum Problem: Ich habe ein Datengrid und möche dem Benutzer überlassen welche Felder er einblendet. Dazu habe ich eine einfache Tabellenansich gebaut, in der er ein boolsches Feld über eine Checkbox verändert. In dem Datensatz steht (im Prinzip) nur der Name der COLUMN und eben der boolsche Wert VISIBLE. Ich versuche seit einiger Zeit krampfhaft den String aus dem Feld COLUMN irgendwie so zu umzusetzen, dann ich mit in Etwas so agieren kann: TblColumn.visible = bla bla. Auch meine Versuche mit FindComponent waren nicht erfolgreich. Hat jemand eine Idee wie ich über den Componentennamen in der Tabelle Zugriff auf die Komponente erhalten kann? Vielen Dank für Tipps und Codeschnipsel LG Heiko |
AW: Über String auf Komponente zugreife
Wie befüllst Du den das Grid?
|
AW: Über String auf Komponente zugreife
Es ist ein DBGrid und ich zeige Daten aus einer Tabelle ein. Aber das, denke ich, ist nicht das Problem. Ich habe den Komponentenname als String den ich "nur" irgendwie so umwandeln muss, dass ich sagen kann: Komponentenname.visible:= false..
|
AW: Über String auf Komponente zugreife
Hat das Grid auch eine Datasource und diese eine Dattenquelle?
Da schon mal geschaut? |
AW: Über String auf Komponente zugreife
Im Prinzip benötigst du für jede Spalte so eine Instanz
Delphi-Quellcode:
Damit kannst du jetzt eine Checkbox entsprechend befüllen (Caption, Checked).
TCheckerVM = class abstract
protected function GetCaption : string; virtual; abstract; function GetChecked : Boolean; virtual; abstract; procedure SetChecked( const Value: Boolean ); virtual; abstract; public property Caption: string read GetCaption; property Checked: Boolean read GetChecked write SetChecked; end; Um das jetzt konkret für eine DBGrid-Spalte zu haben, bauen wir uns
Delphi-Quellcode:
TDbGridColumnVisibleCheckerVM = class( TCheckerVM )
private FColumn: TColumn; protected function GetCaption : string; override; function GetChecked : Boolean; override; procedure SetChecked( const Value: Boolean ); override; public constructor Create( Column: TColumn ); end; constructor TDbGridColumnVisibleCheckerVM.Create( Column: TColumn ); begin inherited Create; FColumn := Column; end; function TDbGridColumnVisibleCheckerVM.GetCaption : string; begin Result := FColumn.Title.Caption; end; function TDbGridColumnVisibleCheckerVM.GetChecked: Boolean; begin Result := FColumn.Visible; end; procedure TDbGridColumnVisibleCheckerVM.SetChecked( const Value: Boolean ); begin FColumn.Visible := Value; end; |
AW: Über String auf Komponente zugreife
Meinst Du sowas?
Delphi-Quellcode:
var
myKomp : TComponent; begin myKomp := Application.FindComponent(tab1.FieldByName('Komponentenname').AsString); if Assigned(myKomp) and (myKomp is TWinControl) then begin TWinControl(myKomp).Visible := tab1.FieldByName('Visible').AsBoolean; end; end; |
AW: Über String auf Komponente zugreife
Ein TDBGrid funktioniert ganz ohne Deklaration der Spalten, aber man kann die anzuzeigenden Spalten explizit definieren (Doppelklick, oder Click auf 'Columns' Eigenschaft): Das Resultat sind einzelne Spaltenkomponenten, die aber auch in der Columnseigenschaft aufgelistet sind. Über diese Eigenschaft iteriert man und schaltet die Sichtbarkeit nach Gusto.
Delphi-Quellcode:
Du sprichst von 'Komponentennamen', aber ich denke, Du meinst Feld/Spaltenname der Tabelle, oder?
Procedure TMyForm.SetColumnVisibility(dBGrid : TDBGrid; columnName : String; visible : Boolean);
Var i : Integer; Begin for i:=0 to dbGrid.Columns.Count-1 do if dbGrid.Columns[i].FieldName=columnName then begin dbGrid.Columns[i].Visible := visible; Exit; end; Raise Exception.CreateFmt('Grid enthält keine Spalte mit Namen: %s',columnName); End; |
AW: Über String auf Komponente zugreife
Hast du es schon mal über das entsprechende Feld der Datenquelle versucht:
Delphi-Quellcode:
DBGrid.DataSource.DataSet.FieldByName(Fieldname).Visible :=false;
|
AW: Über String auf Komponente zugreife
Zitat:
Setzt man das beim Feld selber, dann wird die Spalte erzeugt oder wieder entfernt. In der Regel geht man ja her und setzt bei den Feldern mit ID-Werten das
Delphi-Quellcode:
auf
Visible
Delphi-Quellcode:
. Dafür werden jetzt auch keine Spalten im Grid erzeugt.
false
Wenn ich dem Benutzer jetzt anbieten möchte Spalten ein- oder auszublenden, dann will ich aber nicht, dass er diese ID-Werte wieder einblenden kann. Und das schaltet man bei der Spalte selber ein. Im Übrigen ist die Spalte in einem DBGrid keine Komponente -> ![]() |
AW: Über String auf Komponente zugreife
Vielen DAnk für die Tipps,
die Herangehensweise von Dejan Vu hat mich zur Lösung gebracht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 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