Announcement

Collapse
No announcement yet.

Wie erstelle ich Ereignisse

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

  • Wie erstelle ich Ereignisse

    Mit Delphi 5 möchte ich ein Control erstellen, welches in MS VC++ weiterverwendet werden soll. Methoden und Eigenschaften zu definieren sind ja nun kein Problem. Aber wie kann ich z.B. ein OnChange Ereignis auslösen, welches von einem Edit-Feld erzeugt werden soll das Teil der Komponente ist? Das Handbuch lässt sich da mal wieder sehr präzise darüber aus. Oder ist da der Abschnitt Ereignisse für Automatisierungs bereitstellen im Kapitel 47: "Automatisierungsserver erstellen" die eigentliche Lösung?? Doch auch da wird nur beschrieben wie ein Ereignis des gesamten Kontrols definiert und implementiert wird. Ich will aber ereignisse einzelner Komponenten in dem ActiveX-Control verfügbar machen.

    Oder sollte ich von den vewendeten VCL Komponenten eigene Klassen ableiten und in deren Deklarationsteil die Ereignisdekl. in den published bereich verschieben (Dann sollen angeblich alle Ereignisse, Eigenschaften und Methoden im ActiveX-Control im published teil deklariert und somit vom Container nutzbar sein??)

  • #2
    Hallo,

    wo liegt das Problem? Wenn man mit Delphi über den Wizard ein <b>ActiveX-Element</b> erstellt, richtet Delphi doch ein fertiges Gebrauchsmuster ein:<br>
    a) Typbibliothek: Ein eigenes <b>Dispinterface</b> definiert jedes veröffentlichte Event des Controls als separate Interface-Methode<br>
    b) Implementierungsunit: Jedes Event wird über eine Hilfsmethode den Interface-Methoden des Dispinterfaces zugeordnet.

    Wenn nun ein eigenes Ereignis ausgelöst werden soll (das noch nicht vom Wizard berücksichtigt wurde), muß die Zuordnung VCL-Event zu Interface-Methode von Hand nachgeholt werden (so wie das der Wizard für die Standard-Ereignisse der VCL-Elternklasse automatisch gemacht hat)

    Comment


    • #3
      Hallo Herr Kosch,

      besten Dank erstmal für Ihr promptes reagieren. Das Problem liegt natürlich bei mir, wahrscheinlich übersehe ich irgendwas. Wie die Geschichte funktionieren soll ist mir eigentlich schon klar (na ja, eigentlich nicht....sonst würde es ja funktionieren). Vielleicht können Sie mir ja doch auf die Sprünge helfen. Deshalb beschreibe ich mal mein Vorgehen im Detail.....

      Datei - Neu - ActiveX - ActiveForm

      ActiveX Name: test2

      Auf das dann erstellte Formular habe ich eine Edit und eine Button Komponente gesetzt.
      Im Editor mit der Fnktion Zur Schnittstelle hinzufügen:

      Eigenschaft/Methode, Deklaration: property Edit1Text:widestring;

      die get und set implementierung ist ja nun simpel....

      Als nächstes will ich ein Ereignis Button1Click ezeugen. D.h. die Containeranwendung
      soll informiert werden, wenn ich auf den Button klicke.

      Zur Schnittstelle hinzufügen:

      Ereignis - Itest2Event, Deklaration: procedure Button1Click;

      In der TLB wurde nun automatisch im interface von Itest2Event folgender Code erzeugt:
      Itest2Events = dispinterface
      ['{EB4F6243-8581-11D3-8A32-00105AD7563A}']
      procedure OnActivate; dispid 1;
      ....
      procedure Button1Click; dispid 17; //Klar soweit....
      end;

      und in der Klassendeklaration von OLE-Control Proxy dies:
      Ttest2 = class(TOleControl)
      private
      FOnActivate: TNotifyEvent;
      ......
      FOnButton1Click: TNotifyEvent;
      .....
      published
      property OnButton1Click: TNotifyEvent read FOnButton1Click write FOnButton1Click;

      Als nächstes deklariere ich in der Implementation-Unit im private Teil folgendes:

      procedure Button1ClickEvent(Sender:TObject);

      und implementiere die dann so:

      procedure Ttest2.Button1ClickEvent(Sender:TObject);
      begin
      if FEvents <> nil then FEvents.Button1Click;
      end;

      Wenn ich die Syntaxprüfung laufen lasse werde ich mit dem Hinweis informiert,
      dass das private Symbol Button1ClickEvent deklariert, aber nie verwendet wurde.
      Und die compilierte Componente macht zwar das Ereignis OnButton1Click im
      Objektinspektor sichtbar aber ein Ereignis wurde nie ausgelöst....

      Tja, wo könnte es hängen ???

      Mfg und besten Dank für jeden Tip

      Comment


      • #4
        Hallo,

        <i>Als nächstes deklariere ich in der Implementation-Unit im private Teil folgendes: <br>
        procedure Button1ClickEvent(Sender:TObject); <br>
        und implementiere die dann so:<br>
        procedure Ttest2.Button1ClickEvent(Sender:TObject); <br>
        begin<br>
        if FEvents <> nil then FEvents.Button1Click; <br>
        end;</i>

        Die Ereignisbehandlungsmethode wird wie bei einer normalen Anwendung über den Objektinspektor zugewiesen (Doppelklick auf die Eigenschaft <i>OnClick</i>). Die Ereignisbehandlungsmethode Button1Click darf <b>nicht</b> im <b>Private</b>-Abschnitt des TActiveForm-Nachfolgers stehen (kann also nicht so einfach von Hand nachgetragen werden, ohne auch die Verbindung in der DFM-Datei von Hand nachzutragen). Ansonsten ist die Fehlermeldung "<i>Wenn ich die Syntaxprüfung laufen lasse werde ich mit dem Hinweis informiert, dass das private Symbol Button1ClickEvent deklariert, aber nie verwendet wurde.</i>" völlig normal!

        Wenn man sich das Formular in der Text-Darstellung anzeigen lässt, muß folgendes zu sehen sein:
        <pre>
        object Test2: TTest2
        Left = 192
        Top = 107
        Width = 272
        Height = 99
        Caption = 'Test2'
        Color = clBtnFace
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = []
        OldCreateOrder = False
        PixelsPerInch = 96
        TextHeight = 13
        object Edit1: TEdit
        Left = 16
        Top = 16
        Width = 121
        Height = 21
        TabOrder = 0
        Text = 'Edit1'
        end
        object Button1: TButton
        Left = 152
        Top = 16
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 1
        OnClick = Button1Click
        end
        end
        </pre>

        Dem Objekt <i>Button1</i> wird eine Ereignisbehandlungsmethode für das <b>OnClick</b>-Ereignis zugewiesen - so daß an dieser Stelle die Verbindung zur eigenen Implementierung hergestellt wird

        Comment


        • #5
          Hallo

          besten Dank, manchmal ist man einfach zu blöd. Die Sache funktioniert nun ;

          Comment

          Working...
          X