TYPE Casting über Stringfeld?????

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

TYPE Casting über Stringfeld?????

Beitrag von Lorca »

Hallo zusammen :),

ist es möglich, ein TYPE-Casting aus einem Stringfeld zu realisieren?
Also z.B. TYPE of (lv_String) oder TYPE of (ClassName) ??

TYPE OF (ClassName).DataSource := AValue;

Hintergrund:
Für die DB Controls gibt es keine einheitliche Parentklasse, um z.B. die DataSource abzugreifen.
Vielmehr wird die DataSource ja über FDataLink Verwaltet (was auch völlig OK ist).
Wenn ich nun ein TDBControl (TDBEdit) und eine (TDBGrid) in eine TList speichere, kann ich im Loop (FOR i := 0 TO ....) nicht
die DataSource der jeweiligen Komponente abgreifen.
Hier müsste dann ein CASE Block hin. Etwa so, wie im u.a. Beispiel. Das halte ich jedoch für SUB-Optimal. Hier währe ein TYPE Cast über ClassName Sinnvoll.

VAR lo_List : TList;
CASE lo_List.Items[ lv_i ].ClassName OF
TDBEdit : TDBEdit(lo_List.Items[ lv_i ]).DataSource := AValue
TDBGrid : TDBGrid(lo_List.Items[ lv_i ]).DataSource := NIL;
END;

Aber meine Versuche, einen TYPE-CAST mittels "TYPE OF (ClassName, oder ähnliche Konstrukte)", führen alle ins Nirvana (schade).
Anmerkung:
Im alten Delphi war es möglich, das Property "DataSource.Enabled" zu setzen. Dies hat jedoch in den ZEOs Komponenten keinen Einfluss.

Hat jemand von euch eine Idee, für einen Stringbasierten TYPE-Cast? :)


Viele Grüße
Lorca

wp_xyz
Beiträge: 5191
Registriert: Fr 8. Apr 2011, 09:01

Re: TYPE Casting über Stringfeld?????

Beitrag von wp_xyz »

Es gibt in Unit TypInfo die Funktion IsPublishedProp(AClass: TClass; const PropName: string): Boolean. Damit kannst du abfragen, ob eine Klasse die Property "DataSource" hat:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to ControlCount-1 do
    if IsPublishedProp((Controls[i]).ClassType, 'DataSource') then
      Memo1.Lines.Add(Controls[i].Name);
end; 
https://lazarus.lazarus.freepascal.nark ... y-property

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TYPE Casting über Stringfeld?????

Beitrag von Socke »

Wenn du den ClassName abfragst, musst du auch mit einem String vergleichen:

Code: Alles auswählen

VAR lo_List : TList;
CASE lo_List.Items[ lv_i ].ClassName OF
'TDBEdit' : TDBEdit(lo_List.Items[ lv_i ]).DataSource := AValue
'TDBGrid' : TDBGrid(lo_List.Items[ lv_i ]).DataSource := NIL;
END;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: TYPE Casting über Stringfeld?????

Beitrag von Lorca »

Hallo zusammen, :)

danke schön für eure Antworten. Leider bringen mir diese Antworten nicht das, was ich mir vorgestellt habe, schade.
Sollte mir dennoch eine Möglichkeit einfallen werde ich diese hier Posten.

Schönen Dank nochmals für eure Mühen und frohe Ostern

Gruß
Lorca :)

charlytango
Beiträge: 1087
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TYPE Casting über Stringfeld?????

Beitrag von charlytango »

Lorca hat geschrieben: Mi 5. Apr 2023, 13:11 Aber meine Versuche, einen TYPE-CAST mittels "TYPE OF (ClassName, oder ähnliche Konstrukte)", führen alle ins Nirvana (schade).
Die Schreibweise deines Code-Teils zusammen mit der obigen Aussage und dass der Code von Socke nicht geholfen hat lässt mich vermuten dass da ein Missverständnis vorliegt.

Kann es sein dass du nicht den Namen eines Objektes sondern den Typ des Objektes differentieren willst?

also irgend etwas wie:

Code: Alles auswählen

if  lo_List.Items[ lv_i ] is TDBEdit  then
  TDBEdit(lo_List.Items[ lv_i ]).DataSource := AValue
else if lo_List.Items[ lv_i ] is TDBGrid 
    then TDBGrid(lo_List.Items[ lv_i ]).DataSource := NIL
else
 showmessage('object unknown');
Lorca hat geschrieben: Mi 5. Apr 2023, 13:11 Im alten Delphi war es möglich, das Property "DataSource.Enabled" zu setzen. Dies hat jedoch in den ZEOs Komponenten keinen Einfluss.
Meines Wissens hat ZEOS nichts mit dem Abschalten des Datasource zu tun.
TDatasource.Enabled schaltet bloß die Anzeige der Daten ab.

Antworten