Delphi RTTI osztály property kezdőértéke
2022-05-26T15:43:34+02:00
2022-05-27T14:52:06+02:00
2022-06-29T08:07:39+02:00
csanesz
Szaisztok!

Van egy osztályom:

TAlap = class(TObject) constructor Create(); end; TOsztaly = class(TAlap) private FRowId: TIntegerField; FCode: TWideStringField; FName: TWideStringField; public property RowId: TIntegerField read FRowId write FRowId; property Code: TWideStringField read FCode write FCode; property Name: TWideStringField read FName write FName; end;
A programban több osztáyl is lenne. Ezen osztályok szülője mindig a TAlap lenne.
A TAlap konstuktorában adnék kezdőértéket az osztály propertyjeinek.

A programban így hívom meg.

var O: TOsztaly; begin O:= TOsztaly.Create(); O.Free; end;


A konstruktoran így néz ki.

constructor TAlap.Create(); var lType : TRttiType; lContext : TRttiContext; lField: TRttiField; lProperty, pProp : TRttiProperty; sl: TStringList; v: TValue; begin SL := TStringList.create; lContext := TRttiContext.Create(); LType := lContext.GetType(Self.ClassType); if assigned(LType) then begin for LProperty in LType.GetProperties do begin if (lProperty.Name = 'Name') then begin pProp := lType.GetProperty(lProperty.Name); if assigned(pProp) then pProp.SetValue(Self,TValue.From<string>('Pista')); end; SL.Add(lProperty.Name+' - '+lProperty.GetValue(Self).ToString); end; end; ShowMEssage(sl.Text); sl.Free; end;
Az elgondolás szerintem jól működik, mert amikor elindul a program, akkor látom a listában a TOsztaly propertyjeit.
A probléma, a pProp.SetValue parancsnál kezdődik, mivel 'Invalid class typecast' hibaüzenetet kapok.
Az lProperty.Name jót ad vissza 'Name'. A meglepetés akkor ért, amikor a megnéztem mi a property tipusa.
A pProp.PropertyType.TypeKind => tkClass értéked ad vissza a Name propertyre? Nem tkString vagy tkWString-et kellene visszaadnia?
Mit ronthatok el? A getValue elvileg mindenhol (empty)-t ad vissza, ez logikusnak tűnik, mivel semminek nincs kezdőértéke.
Mutasd a teljes hozzászólást!
Szerintem jól működik, mivel így lett deklarálva:

property Name: TWideStringField read FName write FName;

Ez pedig nem (Wide)String, hanem egy sima mezőosztály, azaz a tkClass teljesen okés, legalábbis számomra. :)

És emiatt nem is lehet értékül adni a TWideStringField-nek a "Pista" stringet.
Mutasd a teljes hozzászólást!

abcd