Hi zusammen
Hier hatte ich als Antwort auf meine da gestellte Frage ein Beispiel bei Embarcadero gefunden, probeweise umgesetzt und das Resultat da als Jpeg angehängt.
Inzwischen hänge ich allerdings wieder. Soweit ich begriffen habe, erfolgt in dem verlinktem Beitrag der Zugriff auf die Klasse selbst, und nicht auf eine Instanz davon.
Dann habe ich
das gefunden, womit nun, wenn ich nicht alles gründlich missverstanden habe, der Zugriff auf Klasseninstanzen möglich ist.
Der (geplante) Ablauf in meinem Programm:
Ein Frame enthält u.a. 2 TColorboxes, die im UnCloseUp-Event selbst einen eigenen Event abfeuern:
Delphi-Quellcode:
procedure TCssAttriTLBXFrame.CmbxValueForegroundColorCloseUp(Sender: TObject);
begin
FCssActiveAttribut := TCssAttributsClass(CmbxAttributes.Items.Objects[CmbxAttributes.ItemIndex]);
FCssAttributes.ForeGround := CmbxValueForegroundColor.Selected;
if Assigned(FCssAttributsEvent) then
FCssAttributsEvent(FCssActiveAttribut);
end;
Der entsprechende Evenhandler imCssFrame:
Delphi-Quellcode:
procedure TCSSFrame.DoCSSAttributActualisation(const AttriClass: TCSSAttributsClass);
var
LContext: TRttiContext; LType: TRttiType; LProperty: TRttiProperty;
LMethod: TRttiMethod; LField: TRttiField; XPos, i,j: integer;
LClass, LAttribut: TRttiInstanceType; AtrriStr, Helpstr :string;
begin
LContext := TRttiContext.Create;
try
LType := LContext.GetType(TSynCssSyn);
LClass := LContext.GetType(TSynCssSyn) as TRttiInstanceType;
LAttribut := LContext.GetType(LClass) as TRttiInstanceType;
// LAttributs: LField.GetAttributes(TCustomAttributs);
SynEdit1.lines.Add(LType.ToString);
SynEdit1.lines.Add(LClass.ToString);
SynEdit1.lines.Add ('*************************');
for LField in LClass.GetFields do
begin
if ContainsText(LField.ToString, 'TSynHighlighterAttributes') then
begin
XPos := Pos(':',LField.ToString);
if XPos<> 0 then
begin
AtrriStr := AnsiLowerCase(Copy(LField.ToString,1,XPos-1));
for i := 0 to AttriClass.InstanzList.Count-1 do
begin
Helpstr := AnsiLowerCase(AttriClass.InstanzList.ValueFromIndex[i]);
SynEdit1.lines.Add ('-------------');
SynEdit1.lines.Add ('AtrriStr := '+AtrriStr);
SynEdit1.lines.Add ('Helpstr := '+Helpstr);
if HelpStr = AtrriStr then
begin
SynEdit1.lines.Add ('LField.Name := '+ LField.Name);
SynEdit1.lines.Add ('LField.FieldType.ClassName := '+ LField.FieldType.ClassName);
SynEdit1.lines.Add ('LField.ClassName := '+ LField.ClassName);
// LAttribut.GetField() //<====
SynEdit1.lines.Add (LField.FieldType.ClassType.ClassName);
SynEdit1.lines.Add ('-------------');
Break;
end;
end;
SynEdit1.lines.Add (AtrriStr);
end;
end;
end;
SynEdit1.lines.Add ('DoCSSAttributActualisation');
finally
LContext.Free;
end;
end;
Noch bin ich daran, auszutesten, was ich da wirklich mache - erkennbar an den vielen Ausgaben im Synedit. Der Zugriff erfolgt auf den Highligther, der diesem Synedit zugeordnet ist:
LType := LContext.GetType(TSynCssSyn)
Mein Problem ist: die für mich relevanten Propertys von TSynCssSyn simd ihrerseits wieder Instanzen der Klasse TSynHighlighterAttributes. Und deren Felder brauche ich nun (per
RTTI), um ihnen neue Werte zuweisen zu können.
Damit wollte ich mir zugang zu dieser Klasseninstanz verschaffen:
LAttribut: TRttiInstanceType;
und
LAttribut.GetField()
Ich hab mich in all den Beiträgen hier zu
RTTI gründlich umgesehen, um zu sehen, wie andere das machen. Allerdings offensichtlich zu gründlich, so dass mein Kopf inzwischen 'fröhlich vor sich hin' raucht...
Kann ich mit meiner eigenen Variable so wie gedacht, auf ein Feld vom Typ TSynHighlighterAttributes zugreifen?
Irritiert hat mich uunter anderem
das hier, wobei ich allerdings nicht den Vorfahren der (Property-)Klasse ermitteln, sondern auf deren Felder zugreifen will und ihnen die neuen Werte aus meiner übergebenen Klasse zuweisen will.
Gruss
Delbor