Canvas für eigene Komponente



  • Hi,
    ich habe nur die Frage, wie ich für meine eigene Komponenten ein TCanvas-Property erstelle?

    Danke

    Alexander Sulfrian



  • TCanvas ist eine Kapselung der Operationen eines Gerätekontextes.

    HDC hdc= GetDC(Handle);
    //... zeichne was
    ReleaseDC(Handle,hdc);
    

    mit Canvas ist das ähnlich. Man braucht ebenfalls ein Fensterhandle:

    TCanvas Canvas=new TCanvas;
     Canvas->Handle= GetDeviceContext(Handle); // dieses natürlich nicht im Konstruktor, da es dort noch kein Handel gibt. 
                                               // Sowas macht man in der Create- oder Loaded- Methode.
     //.... zeichen was
      delete Canvas;
    

    oder

    TCanvas Canvas=new TCanvas;
     Canvas->Handle= GetDC(Handle); // dieses natürlich nicht im Konstruktor, da es dort noch kein Handel gibt. 
                                               // Sowas macht man in der Create- oder Loaded- Methode.
     //.... zeichen was
     ReleaseDC(Handle,Canvas->Handle);// dann muss man den Gerätekontext wieder freigeben.
     delete Canvas;
    


  • das machst du ganz genauso wie für jede andere eigenschaft einer komponente

    // header
    private:
      TCanvas *FCanvas;
    
    // konstruktor
    FCanvas = new TCanvas();
    
    // destruktor
    delete FCanvas;
    

    in der zeichenfunktion musst du dann dem canvas das handle des device-contexts zuweisen...

    // beispiel: message CN_DRAWITEM abgefangen
    if (Message.Msg == CN_DRAWITEM)
    {
      FCanvas->Handle = ((LPDRAWITEMSTRUCT) Message.LParam)->hDC;
    
      // was machen
    
      FCanvas->Handle = 0;
    }
    


  • joh,

    und in der Häda:

    public:
      __property TCanvas * Canvas={read=FCanvas,write=FCanvas}; // nicht published
    


  • Hi,
    gut! Nun hab ich nur das Problem, dass meine Komponente kein Handle hat!

    Ich beschreibe mal kurz:

    - Kompo ist abgeleitet von TImage
    - will Canvas von TImage nicht verwenden, weil es das Canvas von TBitmap ist und ich die Picture Eigenschaft überschrieben habe!
    - optimal wäre es eigentlich, wenn ich das Canvas von TGraphicControl verwenden könnte!

    Wie kann och mein Prob. lösen?

    MFG

    Alexander Sulfrian



  • Hat keiner einen Tip?



  • Hi,

    optimal wäre es eigentlich, wenn ich das Canvas von TGraphicControl verwenden könnte!

    ich frag mich, warum du es nicht machst. Wäre eh besser..



  • Gut! Jetzt besteht nur noch das Realizierungsproblem:

    property TGraphicControl::Canvas;
    

    geht leider nicht!

    MFG

    Alexander Sulfrian



  • Alexander Sulfrian schrieb:

    Gut! Jetzt besteht nur noch das Realizierungsproblem:

    property TGraphicControl::Canvas;
    

    geht leider nicht!

    MFG

    Alexander Sulfrian

    Das ist eine super Fehlerbeschreibung. Kannst du das bitte nochmal ein bißchen weniger ausführlich beschreiben? Das sind mir echt zu viele Informationen.

    P.S.: Im Code hast du nicht zufällig wie oben "__" vor "property" vergessen?



  • Hi,
    ups! Ich meinte naturlich:

    __property TGraphicControl::Canvas;
    

    Fehlermeldung:

    E2089 Bezeichner ‘Canvas’ darf keinen Typqualifizierer besitzen

    Danke

    Alexander Sulfrian



  • Alexander Sulfrian schrieb:

    Hi,
    ups! Ich meinte naturlich:

    __property TGraphicControl::Canvas;
    

    Fehlermeldung:

    E2089 Bezeichner ‘Canvas’ darf keinen Typqualifizierer besitzen

    Danke

    Alexander Sulfrian

    Dann mach den Typqualifizierer (sprich: "TGraphicControl::") eben wech! Aber wozu wilst du überhaupt eine neue Property definieren, wenn TGraphicControl schon ein Canvas hat? 😕



  • WebFritzi schrieb:

    Aber wozu wilst du überhaupt eine neue Property definieren, wenn TGraphicControl schon ein Canvas hat? 😕

    Hi,
    ich zitiere mich mal selber, deshalb:

    Alexander Sulfrian schrieb:

    - Kompo ist abgeleitet von TImage
    - will Canvas von TImage nicht verwenden, weil es das Canvas von TBitmap ist und ich die Picture Eigenschaft überschrieben habe!
    - optimal wäre es eigentlich, wenn ich das Canvas von TGraphicControl verwenden könnte!

    Also meine Komponente ist von TImage abgeleitet (welches von TGraphicControl abgeleitet ist) und ich will das Canvas Property von TGraphicControl wiederholen! Das Canvas von TImage ist sch...eibenkleister!

    Danke

    MFG

    Alexander Sulfrian



  • Alexander Sulfrian schrieb:

    ich will das Canvas Property von TGraphicControl wiederholen! Das Canvas von TImage ist sch...eibenkleister!

    Ich würde mal behaupten, dass das dasselbe ist. Wieso willst du überhaupt von TImage ableiten anstatt von TGraphicControl? Sag doch einfach mal, was du machen willst.



  • Hi,
    das Canvas von Timage ist das Canvas von dessen TPicture-TBitmap und das von TGraphicControl ist ein unabhängiges!

    Also ich hatte ja erst meine Komponente von TGarphicControl abgeleitet! ABER ich brauce diesen ComponentEditor der bei TImage implementiert ist! Da ich nicht herausfindenkonnte wie ich diesen ComponentEditor bei meiner Komponente sonst implementieren soll, habe ich nun die Komponente von TImage abgeleitet! Da habe ich jetzt aber das Canvas Problem!

    Danke

    Alexander Sulfrian



  • Alexander Sulfrian schrieb:

    ABER ich brauce diesen ComponentEditor der bei TImage implementiert ist!

    Hä? Was bitte?



  • Na ich möchte, dass wenn man zur Designzeit doppelt auf die Kompo kickt, der Bildeditor aufgeht, wie eben bei TImage!



  • Alexander Sulfrian schrieb:

    Na ich möchte, dass wenn man zur Designzeit doppelt auf die Kompo kickt, der Bildeditor aufgeht, wie eben bei TImage!

    Sag das doch gleich! Schau dir dazu mal meine Komponente TLinkLabel an (auf meiner Homepage zu haben). Da hab ich auch eine Eigenschaft mit einer Ellipse ("...") im Objektinspektor (Eigenschaft "FileName"). Ich hab grad mal mit Spy++ geschaut, welche Klasse dieser Bildeditor darstellt. Es ist TPictureEditorDlg.



  • Hi,
    wenn ich jatzt aber in der Register Methode folgendes versuche:

    RegisterComponentEditor(classes[1], __classid(TPictureEditorDlg));
    

    Bekommer ich folgende Fehlermeldungen:

    E2303 Typname erwartet
    E2121 ) fehlt beim Funktionsaufruf

    Was muß ich noch einbinden?

    Danke

    Alexander Sulfrian

    PS: Hab BCB 4 Pro!



  • Hi,

    TPictureEditorDlg wird automatisch erzeugt. Die Editorclasses für TPicture (sihe anderen Thread, wo du die Datei gesucht hast) erstellt diese dieses Formular.

    google mal nach "TPropertyEditor paDialog"

    dort findet man Beispiele, wie man sowas selber machen kann.



  • Hi,
    so wie ich dich verstanden habe muss ich den ComponentEditor für meine Kompo selber proggen? Das ist doch dann aber gegen das Prinzip der OOP, oder? Der Code steht doch schon irgendwo und ich will ihn wiederverwenden!

    MFG

    Alexander Sulfrian


Anmelden zum Antworten