Einzelnen Beitrag anzeigen

Delbor

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

AW: Klasseninstanz zur Laufzeit bestimmen

  Alt 4. Aug 2015, 10:45
Hi zusammen

Die Idee aus meinem vorigen Beitrag war wirklich nicht schlecht - sie liefert eine Antwort auf die Frage, die der Threadtitel vorgibt - aber sie ist noch weniger das Gelbe vom Ei, wie das Property 'InstanzName' der Klasse TAttributsClass, da sie zu einem, wie ich meine, ziemlich seltsamen Konstrukt führt:
Delphi-Quellcode:
  TAttributsClass = Class(TPersistent)
     public
      BackGround : TColor;
      ForeGround : TColor;
      StyleBold: Boolean;
      StyleItalic : Boolean;
      StyleUnderLine : Boolean;
      StyleStrikeOff : Boolean;
      AttributName: String;
      InstanzName: String;
      Constructor Create(AOwner: TComponent);
      Destructor Destroy; override;
  end;

  TJavaScriptCommentClass = Class(TAttributsClass);
  TJavaScriptIdentifierClass = Class(TAttributsClass);
  TJavaScriptKeyClass = Class(TAttributsClass);

  TJavaScriptNonReservedKeyClass = Class(TAttributsClass);
  TJavaScriptEventClass = Class(TAttributsClass);
  TJavaScriptNumberClass = Class(TAttributsClass);
//
  TJavaScriptSpaceClass = Class(TAttributsClass);
  TJavaScriptStringClass = Class(TAttributsClass);
  TJavaScriptSymbolClass = Class(TAttributsClass);
Dabei führen die von TAttributsClass abgeleiteten Klassen keinerlei neue Member ein, weder Eigenschaften Methoden oder Ereignisse - wobei ich mir schon überlegt habe, ob die Dinger nicht selbst ein Event abfeuern könnten...
Aber ich habe etwas viel besseres gefunden..

Ein Test in einem meiner Synedit-Frames brachte das gewünschte Resultat, ersichtlich im angehängten Jpeg:

Delphi-Quellcode:
procedure TCSSFrame.SynEdit1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  LContext: TRttiContext; LType: TRttiType; LProperty: TRttiProperty;
  LMethod: TRttiMethod; LField: TRttiField;
begin
  if Self.SynEdit1.SelText <> 'then begin
    Label1.Caption := SynEdit1.SelText;
      Label1.Caption := Label1.Caption + ' SynEdit1.TabWidth := '+ IntToStr(SynEdit1.TabWidth);
    if assigned(FOnSelectText) then // Dieser Event wird gefeuert,
      FOnSelectText(Self); // wenn Text markiert wird.
  end;
  LContext := TRttiContext.Create;
    try
      LType := LContext.GetType(TSynCssSyn);
      SynEdit1.lines.Add(LType.ToString);
      for LProperty in LType.GetProperties do
      begin
        SynEdit1.lines.Add (LProperty.ToString);
      end;
    finally
    LContext.Free;
  end;
end;
Wie der Anhang zeigt, liefert mir das alle Propertys als String. Um meine neuen Einstellungen aus meinem Frame richtig zuordnen zu können, brauche ich entweder einen Kalssenbezeichner, der dem Probertynamen entspricht oder einen String, den ich mitt dem als String vorliegenden Propertynamen vergleichen kann.
Natürlich muss ich aus der sich ergebenden Liste noch den (Teil-)String filtern, den ich in TAttributsClass.Instanzname übergebe. Aber das dürfte wohl kaum ein Problem sein.
Ein weiterer Effekt: Ich brauche zur Übergabe noch genau einen Eventtyp.

Oder gibts noch eine bessere Lösung?

Gruss
Delbor
Miniaturansicht angehängter Grafiken
rtti_informations1.jpg  
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor ( 4. Aug 2015 um 10:49 Uhr) Grund: Frage hinzugefügt
  Mit Zitat antworten Zitat