AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

RTTI-Verständnisfrage

Ein Thema von Delbor · begonnen am 11. Aug 2015
Antwort Antwort
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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz