Einzelnen Beitrag anzeigen

Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

RTTI-Verständnisfrage

  Alt 11. Aug 2015, 14:08
Delphi-Version: 5
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat