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