Announcement

Collapse
No announcement yet.

Notify Event für DBGrid-Komponente

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Notify Event für DBGrid-Komponente

    Hi Leute,<br>
    ich brauchte die Möglichkeit die Zellkoordinaten eines DBGrid bzw, die Zeile und Spalte zu lesen. Das DBGrid kann das leider nicht, deshalb habe ich eine neue Komponente von der DBGrid-Komponente abgeleitet, bei der ich dann auf die Werte des TCustomDBGrid zugreife. Das funktioniert alles ganz prima, doch nun brauche ich auch ein MouseDownEreignis.<br>
    Das DBGrid hat dies leider auch wieder nicht. Wie kann ich meiner neuen Komponente eine Mouse-Down Ereignisbehandlungsroutine beibringen ??

  • #2
    Hi,

    wieso?? TDBGrid erbt doch aus TControl das MausDown-Ereignis. Das kannst Du dann doch überschreiben, oder wo liegt Dein Problem?

    Gruß Thorste

    Comment


    • #3
      Hi Thorsten,
      Mein Problem liegt offensichtlich im Verständnis für die Komponentenprogrammierung. Hier ist ein Auszug aus meiner Komponente. Ich kann zwar den NotifyEvent anlegen, aber ich weiß nicht wie ich die Parameter übergeben kann. Dieses Beispiel gibt einen Fehler bei der Deklaration des NotifyEvents für _MouseDown:

      class PACKAGE TExtDBGrid : public TDBGrid<BR>
      {<BR>
      private:<BR>
      TNotifyEvent _MouseDown(TObject *Sender,TMouseButton Btn, TShiftState Shift, int x, int y);<BR>
      protected:<BR>
      void __fastcall MouseDown(TMouseButton Btn, TShiftState Shift, int x, int y);<BR>
      public:<BR>
      __fastcall TExtDBGrid(TComponent* Owner);<BR>
      __published:<BR>
      __property TNotifyEvent OnMouseDown = { read=_MouseDown, write=_MouseDown };<BR>
      };<BR>

      und hier die überschriebene Routine für OnMouseDown:<BR>
      void __fastcall TExtDBGrid::MouseDown(TMouseButton Btn, TShiftState Shift, int x, int y)<BR>
      {<BR>
      TDBGrid::MouseDown(Btn,Shift,x,y);<BR>
      if (_MouseDown != NULL)<BR>
      _MouseDown(this,Btn,Shift,x,y);<BR>
      }<BR>

      Wo liegt mein Fehler

      Comment


      • #4
        Kannst du mir mal dein neuen komponenten mailen?

        [email protected]

        Comment


        • #5
          Du definierst die Methode OnMouseDown wie eine Vaiable:
          <pre>
          private:
          TNotifyEvent FMouseDown;
          public:
          __property TNotifyEvent OnMouseDown = { read=FMouseDown, write=FMouseDown };
          </pre>
          Aber das TDBGrid stellt doch das Event zur Verfügung. Es sollte also in Deiner Klasse auch verfügbar sein. Oder möchtest Du an dem Event erst was bearbeiten und dann weiterleiten. Dann könnte es so aussehen:
          <pre>
          private:
          TNotifyEvent FMyMouseDown;

          __published:
          __property TNotifyEvent OnMyMouseDown = { read=FMyMouseDown, write=FMyMouseDown };

          irgendwo im cpp:
          ...
          TDBGrid::OnMouseDown = MyMouseDown;
          ...
          void __fastcall X::MyMouseDown(TMouseButton Btn, TShiftState Shift, int x, int y)
          {
          // tu irgendwas
          if(FMyMouseDown != NULL){
          FMyMousDown(...); // Ereignis an Anwender weiterleiten
          }

          }
          <pre>

          Alles geerade ausgedacht und nicht getestet, aber vielleicht reicht es als Denkanstoß.

          Thorste

          Comment


          • #6
            Hi Thorsten,
            ich mache den ganzen Kram nur, weil die TDBGrid-Komponente zwar die Ereignisse für KeyDown,-Press und Up, aber nicht für die Mouse Ereignisse zur Verfügung stellt. Deshalb geht der 2te Vorschlag von dir nicht.

            So wie du es zuerst beschrieben hast, hatte ich es vorher, allerdings hatte die Ereignisbehandlungsroutine als Parameter nur (TObject *Sender).
            Aus diesem Grunde hatte ich die Parameter bei TNotityEvent angegeben, in der Hoffnung, daß dieses Deklaration dann Wirkung zeigt. Leider gehts so nicht.
            Hast du noch ne andere Idee? Ich kann dir die Komponente ja einfach mal zumailen, wenn du mir deine Adresse gibst.

            Danke - Pete

            Comment


            • #7
              Okay, und hier kommt die Lösung:

              Nach diversen Denkanstößen und weiterem Probieren habe ich festgestellt, daß der Typ TNotifyEvent für Mausereignisse natürlich völlig verkehrt ist. Hier muß man TMouseEvent benutzen. Den Code, den ich mal oben geliefert habe braucht man also nur in diese Richtung abzuändern und dann geht's.
              Wenn man den Builder 5 hat, braucht man das alles natürlich gar nicht: da gibts die Mausevents dann von Haus aus.

              Vielen Dank an alle Helfer - Pete

              Comment

              Working...
              X