Einzelnen Beitrag anzeigen

Delbor

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

AW: Klasseninstanz zur Laufzeit bestimmen

  Alt 3. Aug 2015, 20:24
Hi zusammen

Wie man nur so blind sein kann!! Nochmal zur Erinnerung die CreateAufrufe und die Createprozedur selbst:
Delphi-Quellcode:
constructor TJavaScriptAttriTLBXFrame.Create(AOwner: TComponent);
begin
  inherited;
  FJavaScriptAttributsList := TDataObjectList<TAttributsClass>.Create();
  FJavaScriptAttributsList.OwnsObjects := True;

  CreateAttribute(FCommentAttri, 'Kommentare', 'FCommentAttri'); // fCommentAttri: TSynHighlighterAttributes;
  CreateAttribute(FIdentifierAttri, 'Bezeichner', 'FIdentifierAttri'); // fPropertyAttri: TSynHighlighterAttributes;
  CreateAttribute(FKeyAttri, 'Schlüsselworte', 'FKeyAttri'); // fKeyAttri: TSynHighlighterAttributes;

  CreateAttribute(FNonReservedKeyAttri, 'Nicht reservierte Schlüssel', 'FNonReservedKeyAttri'); // fSpaceAttri: TSynHighlighterAttributes;
  CreateAttribute(FEventAttri, 'Ereignisse', 'FEventAttri'); // fStringAttri: TSynHighlighterAttributes;
  CreateAttribute(FNumberAttri, 'Zahlen', 'FNumberAttri'); // fNumberAttri: TSynHighlighterAttributes;


  CreateAttribute(FSpaceAttri, 'Leerzeichen', 'FSpaceAttri'); // fColorAttri: TSynHighlighterAttributes;
  CreateAttribute(FStringAttri, 'Strings', 'FStringAttri'); // fTextAttri: TSynHighlighterAttributes;
  CreateAttribute(FSymbolAttri, 'Symbole', 'FSymbolAttri'); // fSymbolAttri: TSynHighlighterAttributes;
end;

destructor TJavaScriptAttriTLBXFrame.Destroy;
begin
   FJavaScriptAttributsList.Free;
  inherited;
end;

procedure TJavaScriptAttriTLBXFrame.CreateAttribute(var AAttrib: TAttributsClass; const AName: string; AInstanz : String);
begin
  AAttrib:= TAttributsClass.Create(Self);
  AAttrib.AttributName := AName;
  AAttrib.InstanzName := AInstanz;
  FJavaScriptAttributsList.Add(AAttrib);
  CmbxAttributes.Items.AddObject(AName,TObject(AAttrib));
  Application.ProcessMessages;
end;
Damit wird bei jedem Aufruf eine Instanz der Klasse TAttributsClass erzeugt und nicht eine Klasseninstanz FCommentAttri - somit kann ich auch nicht auf eine Instanz FCommentAttri zugreifen. Einfach, nicht?

Um die richtigen Instanzen zu erzeugen, müsste ich wohl eher so etwas macen:
Delphi-Quellcode:
procedure TJavaScriptAttriTLBXFrame.CreateAttribute(var AAttrib: TAttributsClass; const AName: string; AInstanz : String);
begin
  AAttrib:= AAttrib.Create(Self);
  AAttrib.AttributName := AName;
  AAttrib.InstanzName := AInstanz;
  FJavaScriptAttributsList.Add(AAttrib);
  CmbxAttributes.Items.AddObject(AName,TObject(AAttrib));
  Application.ProcessMessages;
end;
Wobei dies auch nicht ganz stimmt: Der rechte Teil muss ein Klassenbezeichner sein - der muss aber zum Instanzbezeichner passen. Das property Instanzname ist auch nicht das gelbe vom Ei...
Das heisst nichts anderes, als dass es einige von TAttributsClass abgeleitete Klassen geben wird, wie zum Beispiel TCommentAttri. Die Erzeugung ist dann:
FCommentAttri:= TCommentAttri.Create Damit habe ich ohne Verrenkungen zugriff auf die richtige Instanz.

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