RAD Studio 10.1 Berlin: eigene Schlüsselwörter für Syntax-Hilighting
-
Hallo,
ich habe einige eigene cast Funktionen, die umständliche cast-Kaskaden vereinfachen. Die würde ich im Quelltext gern hervorheben, damit man sie sofort als casts erkennt. Gibt es im Studio eine Möglichkeit, eigene Schlüsselwörter für das Syntax-Hilighting zu definieren?
-
Vlt. hilft dir das weiter:
http://users.telenet.be/ws36637/delphisyntax.html
-
Danke Burkhi, ich habe mir den Link mal angeguckt und erste Schritt gemacht. Leider ohne Erfolg, und der Compiler will mir auch nicht sagen, was er nicht mag. In einem Spielprojekt möchte ich erst ein Mal nur testen, ob sich der Wizard in der IDE registrieren lässt, tun soll er vorerst nichts. Leider lässt sich das Programm nicht übersetzen, der Compiler meldet lapidar
Compiler schrieb:
C++ Fehler HighlightWizard.cpp(97): E2352 Instanz der abstrakten Klasse 'CustomHighlighter' kann nicht erzeugt werden
Das ist alles. Kein Name einer nicht-implementierten Methode, nix.
Komischerweise muss ich auch alle in
NotifierObject
implementierten Methoden in der KlasseCustomHighlighter
perusing
bekannt machen, sonst meldet der Compiler, dassBeforeSave
,AfterSave
,Modified
undDestroyed
nicht implementiert seien. Merkwürdig, daCustomHighlighter
vonNotifierObject
public
erbt und inNotifierObject
alle Methoden implemntiert sind. Bestimmt wieder so eine Delphi Eigenart...Und nun zur Frage:
Was mache ich falsch? Warum kann ich vonCustomHighlighter
kein Instanz erzeugen und was muss ich tun, damit´s geht? Im Moment teste ich das noch unter dem Codegear RAD Studio 2007..h Datei
#ifndef HighlightWizardH #define HighlightWizardH #include <Windows.h> #include <SysUtils.hpp> #include <ToolsAPI.hpp> #include <Dialogs.hpp> #include <string> class NotifierObject : public IOTANotifier { LONG RefCount_; public: __fastcall NotifierObject(); __fastcall virtual ~NotifierObject(); void __fastcall BeforeSave(); void __fastcall AfterSave(); void __fastcall Destroyed(); void __fastcall Modified(); protected: HRESULT __stdcall QueryInterface( const GUID& iid, void** obj ); ULONG __stdcall AddRef(); ULONG __stdcall Release(); }; class CustomHighlighter : public virtual NotifierObject, public virtual IOTAWizard, public virtual IOTAHighlighter { public: __fastcall CustomHighlighter(); using NotifierObject::AfterSave; using NotifierObject::BeforeSave; using NotifierObject::Modified; using NotifierObject::Destroyed; using NotifierObject::QueryInterface; using NotifierObject::AddRef; using NotifierObject::Release; // IOTAWizard Interface void __fastcall Execute(); // IOTAHighlighter Interface AnsiString __fastcall GetIDString(); AnsiString __fastcall GetName(); TWizardState __fastcall GetState(); void __fastcall Tokenize( unsigned char StartClass, char* LineBuf, unsigned short LineBufLen, unsigned char* HighlightCodes ); unsigned char __fastcall TokenizeLineClass( unsigned char StartClass, char * LineBuf, unsigned short LineBufLen ); }; void __fastcall Register(); #endif
.cpp Datei:
#pragma hdrstop #include "HighlightWizard.h" __fastcall NotifierObject::NotifierObject() : RefCount_( 0 ) { } __fastcall NotifierObject::~NotifierObject() { } void __fastcall NotifierObject::AfterSave() { } void __fastcall NotifierObject::BeforeSave() { } void __fastcall NotifierObject::Destroyed() { } void __fastcall NotifierObject::Modified() { } HRESULT __stdcall NotifierObject::QueryInterface( const GUID& iid, void** obj ) { if( iid == __uuidof( IInterface) ) { *obj = static_cast<IInterface*>( this ); static_cast<IInterface*>( *obj )->AddRef(); return S_OK; } else if( iid == __uuidof(IOTANotifier) ) { *obj = static_cast<IOTANotifier*>( this ); static_cast<IOTANotifier*>( *obj )->AddRef(); return S_OK; } return E_NOINTERFACE; } ULONG __stdcall NotifierObject::AddRef() { return ::InterlockedIncrement( &RefCount_ ); } ULONG __stdcall NotifierObject::Release() { ULONG Result = ::InterlockedDecrement( &RefCount_ ); if( RefCount_ == 0 ) delete this; return Result; } __fastcall CustomHighlighter::CustomHighlighter() { } void __fastcall CustomHighlighter::Execute() { } AnsiString __fastcall CustomHighlighter::GetIDString() { return "ocs.CustomHighlightWizard"; } AnsiString __fastcall CustomHighlighter::GetName() { return "OCS Custom Highlight Wizard"; } TWizardState __fastcall CustomHighlighter::GetState() { TWizardState State; State << wsEnabled; return State; } void __fastcall CustomHighlighter::Tokenize( unsigned char StartClass, char* LineBuf, unsigned short LineBufLen, unsigned char* HighlightCodes ) { } unsigned char __fastcall CustomHighlighter::TokenizeLineClass( unsigned char StartClass, char * LineBuf, unsigned short LineBufLen ) { return 0; } void __fastcall Register() { RegisterPackageWizard( new CustomHighlighter() ); }
-
Mach dir doch das Leben leichter und schreibe den Wizard in Delphi. C++ macht es hier nur komplizierter.
DocShoe schrieb:
Leider lässt sich das Programm nicht übersetzen, der Compiler meldet lapidar
Compiler schrieb:
C++ Fehler HighlightWizard.cpp(97): E2352 Instanz der abstrakten Klasse 'CustomHighlighter' kann nicht erzeugt werden
Das ist alles. Kein Name einer nicht-implementierten Methode, nix.
Hast du in den Projektoptionen die Option "Erweiterte Fehlerinfos" aktiviert? Dann sollte der Compiler mehr Details ausspucken.
-
Hallo audacia,
ja, Erweiterte Fehlerinformationen sind aktiviert. Ich kann kein Delphi, ich kann rudimentär erkennen, was Delphi Code macht, aber schreiben kann ich´s nicht.
-
DocShoe schrieb:
... Ich kann kein Delphi, ich kann rudimentär erkennen, was Delphi Code macht, aber schreiben kann ich´s nicht.
Vlt. wäre das ja jetzt ein Anreiz für dich, sich noch Delphi Kenntnisse anzueignen.