Announcement

Collapse
No announcement yet.

Klassenereignisse

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

  • Klassenereignisse

    Ich habe eine Klasse von CustomControl abgeleitet. Das Click_Ereignis
    wurde veröffentlicht.

    In der MainForm wird die Klasse über die uses Klausel eingebunden.
    Da dort die Klasse zur Laufzeit erzeugt wird komm ich nicht an das Click_ereignis ran.

    was mache ich falsch.

    raik

  • #2
    Hallo,<br>da Du die Komponente zur Laufzeit erzeugst, mußt Du auf die visuelle Entwicklung verzichten und alles von Hand erledigen.
    <br>private<br>
    procedure KompOnClick(sender : TObject);<br>...<br>
    MyKomp.OnClick:=KompOnClick;<br>Jens Schuman

    Comment


    • #3
      HAllo Jens;

      alles richtig, Ich habe versucht in der neuen Klasse Haltepunkte zu setzen, um zu sehen ob das Click-Ereignis überhaupt angespochen wird.Fehlanzeige!!!
      Folgender Maßen bin ich vorgegangen.

      private
      procedure Click;override;

      procedure Meine_Kompo.click;
      Begin
      Inherited Click;
      if assigned(onclick) then Onclick(self)
      end;

      Keine Spur von reaktion.

      hilfe rai

      Comment


      • #4
        Hallo Raik,<br>so sollte es aussehen.<br>
        <pre><font size="1" face="Verdana">
        unit Unit1;

        interface

        uses
        Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

        type
        TMyComp = class(TGraphicControl)
        private
        protected
        procedure Click; override;
        public
        end;

        TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        private
        FComp : TMyComp;
        { Private-Deklarationen }
        procedure MyOnClick(Sender : TObject);
        public
        { Public-Deklarationen }
        end;

        var
        Form1: TForm1;

        implementation

        {$R *.DFM}

        { TMyComp }

        procedure TMyComp.Click;
        begin
        inherited Click;
        end;

        procedure TForm1.MyOnClick(Sender: TObject);
        begin
        ShowMessage('Clicked');
        end;

        procedure TForm1.FormCreate(Sender: TObject);
        begin
        FComp:=TMyComp.Create(Self);
        FComp.Parent:=Self;
        FComp.SetBounds(10,10,200,200);
        FComp.OnClick:=MyOnClick;
        end;

        end.
        </font></pre>
        <br>Jens Schuman

        Comment


        • #5
          Hallo Jens,
          erstmal Dank für Deine Mühe, das ist sicher das es funktioniert. Das
          Ereignis ist bloss in einer eigenen Klasse, die ich über die uses
          in meine Unit1 eingebunden habe, da habe ich die Probleme.

          Ich werde es die Woche noch mal versuchen.

          mfg rai

          Comment


          • #6
            Hallo Raik,<br>was bedeutet, "Das Ereignis ist bloss in einer eigenen Klasse, die ich über die uses in meine Unit1 eingebunden habe"<br>Jens Schuman

            Comment


            • #7
              Hallo Jens,
              Ich versuche eine Klasse zu entwickeln, welche ich fuer ein Programm brauche, und von der ich weitere Klasse ableiten will!!!

              Dieses programm, bindet nun die Klasse ueber deren Unit in die uses Klausel ein. wenn ich die Klasse in meiner MainForm habe wird das Ereignis auch ausgeloest. ich will aber die Klasse nicht in die in Hauptunit einbinden, da sie sehr komplex werden koennte

              mit freundlichen Gruessen aus Eindhoven
              rai

              Comment


              • #8
                Hallo Raik,<br>dann erstellte doch die Klasse in einer eigenen unit. Diese unit bindest Du dann in die Hauptunit mit ein.<br>Jens Schuman

                Comment


                • #9
                  hallo jens,
                  genau das ist das Problem, ich habe eine eigene unit für die Klasse erstellt, und diese in der Mainform unter uses eingebunden. ich kann dort diese Klasse erzeugen, bearbeiten und löschen. Auch im Hint wird
                  wird alles angezeigt, nur ich kann beim Klick auf das Control nichts
                  machen.

                  mfg rai

                  Comment


                  • #10
                    Hallo Raik,
                    wenn das so ist, gehe ich mal davon aus, dass Deine Klasse ein Nachfahre
                    von TGraphicControl o. TWinControl ist. Sonst könntest Du sie ja nicht anklicken.
                    Da Du die unit manuell einbindest, gehe ich davon aus, dass Du eine Instanz dieser Klasse
                    zur Laufzeit erzeugst. Wahrscheinlich im OnCreate Event des Mainforms. Wenn Du die
                    Deine Klasse in der Komponentenpallte installiert hättest, könntest Du sie ja über den
                    Objektinspektor konfigurieren. Das bedeutet, dass Du die Eventhandler zur Laufzeit zuweisen mußt.
                    Z.B.

                    <pre><font size="1" face="Verdana">
                    uses ..., yourcomp.pas ... ;
                    TForm1 = class(TForm)
                    ...
                    private
                    procedure YourCompOnClick(Sender : TObject);
                    ...

                    procedure TForm1.FormCreate(Sender: TObject);
                    begin
                    YourComp:=TYourComp.Create(Self);
                    YourComp.Parent:=Self;
                    YourComp.OnClick:=YourCompOnClick; // Zuweisung des Eventhandlers
                    end;</font></pre>
                    Wenn das immer noch nicht Dein Problem löst, dann mußt den entsprechenden Source posten.<br>
                    Jens Schuman

                    Comment


                    • #11
                      Hallo jens , hier nun der Code, ich habe alles versucht,vielleicht findest Du den Fehler

                      mfg raik
                      <pre>
                      unit test;

                      interface

                      uses
                      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
                      StdCtrls, Buttons, ExtCtrls, melder, ToolWin, ComCtrls, Menus;

                      type
                      TForm1 = class(TForm)
                      Image1: TImage;
                      Edit1: TEdit;
                      Edit2: TEdit;
                      Edit3: TEdit;
                      ToolBar1: TToolBar;
                      SpeedButton1: TSpeedButton;
                      SpeedButton2: TSpeedButton;
                      SpeedButton3: TSpeedButton;
                      SpeedButton4: TSpeedButton;
                      MainMenu1: TMainMenu;
                      Datei1: TMenuItem;
                      B_Button: TSpeedButton;
                      H_Button: TSpeedButton;
                      L_Button: TSpeedButton;
                      S_Button: TSpeedButton;
                      Schliessen1: TMenuItem;
                      Button1: TButton;

                      procedure Image1DragOver(Sender, Source: TObject; X, Y: Integer;
                      State: TDragState; var Accept: Boolean);
                      procedure Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
                      procedure B_ButtonClick(Sender: TObject);
                      procedure Schliessen1Click(Sender: TObject);
                      procedure SpeedButton4Click(Sender: TObject);
                      procedure Image1EndDrag(Sender, Target: TObject; X, Y: Integer);
                      procedure H_ButtonClick(Sender: TObject);
                      procedure melderonclick(Sender: TObject); //eventhandler

                      private
                      { Private-Deklarationen }
                      FComp:TMelder;

                      public
                      { Public-Deklarationen }

                      end;

                      var
                      Form1: TForm1;
                      //mbrand:TMelder;
                      hBrand:THandmelder;

                      implementation

                      {$R *.DFM}
                      {TMelder}

                      procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer;
                      State: TDragState; var Accept: Boolean);
                      var P:TPoint;
                      begin
                      Accept := Source is TMelder;
                      GetCursorPos(p);
                      (Source as TMelder).left:= p.x + left;
                      (source as TMelder).top := p.y + top -20 ;
                      Image1.DragMode:=dmmanual;

                      end;

                      procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer);

                      begin
                      If (Source is TMelder )and (Sender is TImage) then
                      with (Source as TMelder) do begin
                      Cursor:= crhandpoint;
                      brush.color:=Fcolor[1];
                      ort :=InputBox('Raumfestlegung','In welchem Raum soll der Melder '+ name+' installiert werden?','');
                      Hint:='Melder : '+ Inttostr(1)+' - ' + inttostr(Meldernummer) +#13+
                      'Standort: '+ Ort +#13+
                      'Zustand : '+ Zustand[1];
                      end;
                      SetFocus;
                      If (Source as TMelder).focused = True then
                      canvas.Brush.Color:=clyellow;
                      end;

                      procedure TForm1.B_ButtonClick(Sender: TObject);
                      Var i:integer;

                      const
                      index:integer = 1;
                      begin
                      FComp:=TMelder.Create(self);
                      FComp.Parent:=self;
                      FComp.onclick:=Melderonclick;
                      FComp.setBounds(Image1.left,Image1.top,8,13);

                      I:=FComp.MelderNummer;
                      FComp.name:='M_'+Inttostr(i);
                      FComp.zustand[index];

                      end;

                      procedure TForm1.Schliessen1Click(Sender: TObject);
                      begin
                      Application.terminate;
                      end;

                      procedure TForm1.Image1EndDrag(Sender, Target: TObject; X, Y: Integer);
                      begin
                      with Image1 do begin
                      DragMode:=dmmanual;
                      DragCursor:= crNo;
                      end;
                      (sender as Tmelder).setfocus;

                      end;

                      </pre&gt

                      Comment


                      • #12
                        Geht nicht alles drauf werde dir den code mailen, wäre nett, wenn du Ihn dir mal anschauen könntest.
                        nur das Click-ereignis. es sind nämlich noch einige Böcke drin .rai

                        Comment

                        Working...
                        X