![]() |
Delphi-Version: 5
RTTI-Verständnisfrage
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 ![]() 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:
Der entsprechende Evenhandler imCssFrame:
procedure TCssAttriTLBXFrame.CmbxValueForegroundColorCloseUp(Sender: TObject);
begin FCssActiveAttribut := TCssAttributsClass(CmbxAttributes.Items.Objects[CmbxAttributes.ItemIndex]); FCssAttributes.ForeGround := CmbxValueForegroundColor.Selected; if Assigned(FCssAttributsEvent) then FCssAttributsEvent(FCssActiveAttribut); end;
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
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.
LType := LContext.GetType(TSynCssSyn)
Damit wollte ich mir zugang zu dieser Klasseninstanz verschaffen:
Delphi-Quellcode:
und
LAttribut: TRttiInstanceType;
Delphi-Quellcode:
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...
LAttribut.GetField()
Kann ich mit meiner eigenen Variable so wie gedacht, auf ein Feld vom Typ TSynHighlighterAttributes zugreifen? Irritiert hat mich uunter anderem ![]() Gruss Delbor |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 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