Einzelnen Beitrag anzeigen

Delbor

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

AW: Klasseninstanz zur Laufzeit bestimmen

  Alt 2. Aug 2015, 14:39
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
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