Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Über String auf Komponente zugreife (https://www.delphipraxis.net/188061-ueber-string-auf-komponente-zugreife.html)

Sugar 27. Jan 2016 15:48

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

Mavarik 27. Jan 2016 16:06

AW: Über String auf Komponente zugreife
 
Wie befüllst Du den das Grid?

Sugar 27. Jan 2016 16:20

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..

Jumpy 27. Jan 2016 16:24

AW: Über String auf Komponente zugreife
 
Hat das Grid auch eine Datasource und diese eine Dattenquelle?
Da schon mal geschaut?

Sir Rufo 27. Jan 2016 16:27

AW: Über String auf Komponente zugreife
 
Im Prinzip benötigst du für jede Spalte so eine Instanz
Delphi-Quellcode:
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;
Damit kannst du jetzt eine Checkbox entsprechend befüllen (Caption, Checked).

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;

nahpets 27. Jan 2016 16:28

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;

Dejan Vu 28. Jan 2016 07:07

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:
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;
Du sprichst von 'Komponentennamen', aber ich denke, Du meinst Feld/Spaltenname der Tabelle, oder?

bcvs 28. Jan 2016 10:28

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;

Sir Rufo 28. Jan 2016 11:20

AW: Über String auf Komponente zugreife
 
Zitat:

Zitat von bcvs (Beitrag 1328598)
Hast du es schon mal über das entsprechende Feld der Datenquelle versucht:

Delphi-Quellcode:
DBGrid.DataSource.DataSet.FieldByName(Fieldname).Visible :=false;

Das ist nicht immer das, was man will.

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:
Visible
auf
Delphi-Quellcode:
false
. Dafür werden jetzt auch keine Spalten im Grid erzeugt.

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 -> Delphi-Referenz durchsuchenVcl.DbGrids.TColumn.

Sugar 28. Jan 2016 14:51

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 22:30 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