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?





  • 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 Klasse CustomHighlighter per using bekannt machen, sonst meldet der Compiler, dass BeforeSave , AfterSave , Modified und Destroyed nicht implementiert seien. Merkwürdig, da CustomHighlighter von NotifierObject public erbt und in NotifierObject alle Methoden implemntiert sind. Bestimmt wieder so eine Delphi Eigenart...

    Und nun zur Frage:
    Was mache ich falsch? Warum kann ich von CustomHighlighter 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. 😉 😉