Hi zusammen
Vielen Dank für eure Antworten!
@Dejan Vu:
Delphi-Quellcode:
procedure TCssAttriTLBXFrame.CmbxAttributesCloseUp(Sender: TObject);
begin
FActiveAttribut := TAttributsClass(CmbxAttributes.Items.Objects[CmbxAttributes.ItemIndex]);
Label1.Caption := FActiveAttribut.ClassName; //FActiveAttribut.AttributName; CmbxAttributes.Items[CmbxAttributes.ItemIndex];
end;
Hier entspricht FActiveAttribut deiner Variablen 'Attribut' in der Prozedur CreateEvent. Als ClassName wird mir hier allerdings TAttributClass zurückgegeben. Gebe ich im Label FActiveAttribut.AttributName aus, erhalte ich allerdings den von mir an die Instanz übergebenen String. Das bedeutet aber auch: die Info über die Klasseninstanz ist in meiner Feldvariablen enthalten - das zeigt ja auch dein Code mit der Abfrage:
if Attribut=FCommentAttri then result := FCSSCommentEvent
Deshalb denke ich, die Info ist im Property 'Tipinfo' von Tpersistent-Nachfolgern enthalten. Die Frage ist (oder war) nur: wie komme ich da ran?
Zitat:
...denn wenn das 'CommentEvent' gefeuert wird, ist ja klar, das mit den CommitAttributen etwas los ist, ergo muss man das Attribut nicht übergeben.
Doch, muss ich, da die Klasse die neuen, und wenn die nicht geändert wurden, die alten Werte enthält. Die Synhighlither enthalten propertys gleichen Namens wie die von mir erstellten Instanzen, sind aber vom Tip der Klasse TSynHighlighterAttributes. So zum Beispiel für TSynCssSyn:
Delphi-Quellcode:
fCommentAttri: TSynHighlighterAttributes;
fPropertyAttri: TSynHighlighterAttributes;
fKeyAttri: TSynHighlighterAttributes;
fSpaceAttri: TSynHighlighterAttributes;
fStringAttri: TSynHighlighterAttributes;
fColorAttri: TSynHighlighterAttributes;
fNumberAttri: TSynHighlighterAttributes;
fSymbolAttri: TSynHighlighterAttributes;
fTextAttri: TSynHighlighterAttributes;
fValueAttri: TSynHighlighterAttributes;
fUndefPropertyAttri: TSynHighlighterAttributes;
fImportantPropertyAttri: TSynHighlighterAttributes;
Ein Auszug aus der
dfm:
Delphi-Quellcode:
AndAttri.Background = clRed
CommentAttri.Foreground = clOlive
CommentAttri.Style = [fsBold, fsItalic]
IdentifierAttri.Foreground = clBlue
IdentifierAttri.Style = [fsBold, fsUnderline]
KeyAttri.Foreground = clBlue
SpaceAttri.Foreground = clMoneyGreen
SpaceAttri.Style = [fsUnderline]
SymbolAttri.Foreground = clGray
TextAttri.Foreground = clRed
TextAttri.Style = [fsItalic]
UndefKeyAttri.Background = clYellow
ValueAttri.Background = clSilver
Das sind die Werte, die meine Klasse übergeben muss.
Delphi-Quellcode:
Procedure TMyForm.CallEventHandler (Event : TAttributEvent; Attribut : TAttributsClass);
Begin
if Assigned (Event) Then
Event(Self, Attribut);
end;
Das heisst: im Eventhandler, der diesen Event entgegennimmt, muss ich erstmal die übergebene Instanz identifizieren. Also eigentlich das Gegenstück zu deiner Prozedur CreateEvent schreiben und dann an passender Stelle die Zuweisung machen - pro identifizierter Instanz je einmal. Oder ich kann die 'passende Stelle' in jeweils eine eigene Prozedur auslagern. Das wären dann 9 - 12 Zuweisungsproceduren, gleichviel, wie einzelne Eventhandler nötig wären.
Einzig bei den 'Kanonieren' (die das Event abfeuern) wäre was einzusparen.
Inzwischen habe ich deinen neuen Beitrag mitbekommen, Dejan Vu.
Zitat:
'Case' (oder hier: if/else-Schlangen) sind zwar 'böse', aber in Fabrikmethoden durchaus erlaubt. Denn es ist ja nun kein Mehrwert ggü dem if/else bzw. 'case' (geht hier leider nicht), eine 1:1 Abbildung in eine Liste (oder Dictionary) zu stopfen.
Und damit sprichst du eigentlich genau das an, was mir kürzlich in den Sinn gekommen ist: meine Attributklassen befinden sich alle in einer Objectliste. Es reicht also, diese zu durchlaufen und in einer Prozedur auf die Klasseninstanz zu prüfen.
Zitat:
(Gerade fällt mir auf, dass die Basis-Klasse keinen Destruktor hat ... ts ts ts)
UUps!! - Du meinst sicher meine...
Gruss
Delbor