Announcement

Collapse
No announcement yet.

Aufruf einer Procedure

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

  • Aufruf einer Procedure

    ich möchte ein Procedure aufrufen, die in 3 Forms mit dem selben Namen aber unterschiedlichen Inhalten vorkommt.
    Erst zur Laufzeit wird entschieden, welche Procedure ausgewählt wird.

    var f : TForm;
    begin
    s:= (sender as TToolbutton).caption;
    F:= Tform(Application.Findcomponent(s));
    F.Pro1 <-- das geht leider nicht, da Delphi die Procedure nicht kennt!

    Was kann ich tun ???

  • #2
    Es fehlt noch eine typumwandlung

    <pre>
    var f : TForm;
    begin
    s:= (sender as TToolbutton).caption;
    F:= Tform(Application.Findcomponent(s));
    (F AS TMyFormClass).Pro1; // Jetzt sollte es gehen. Statt TMyFormClass den
    // Klassennamen der Fensters eintragen
    // (entspricht Property Name + vorangestelltes 'T'.
    ..
    end

    Comment


    • #3
      Hallo,
      so sollte der Aufruf Deiner Procedure auch funktionieren.

      type
      TForm1 = class(TForm)
      Button1: TButton;
      procedure Button1Click(Sender: TObject);
      private
      { Private-Deklarationen }
      public
      { Public-Deklarationen }
      end;
      TMyProc = Procedure (ASampleText : String) of object;
      TMyFirstClass = Class (TObject)
      End;
      TMySecondClass = Class (TMyFirstClass)
      published
      Procedure DoSomething (ASampleText : String);
      End;
      var
      Form1: TForm1;
      implementation
      {$R *.DFM}

      Procedure TMySecondClass.DoSomething (ASampleText : String);
      begin
      ShowMessage (ASampleText);
      end;

      procedure TForm1.Button1Click(Sender: TObject);
      Var myFirstClass : TMyFirstClass;
      myProc : TMyProc;
      begin
      myFirstClass := TMySecondClass.Create;
      @myProc := myFirstClass.MethodAddress ('DoSomething');
      If @myProc <> Nil then
      myProc ('Erfolgreich aufgerufen.');
      myFirstClass.Free;
      end;

      end.

      TMyFirstClass entspricht in Deinem Fall TForm.
      TMySecondClass entspr. der Form mit der aufzurufenden Procedure.
      Die Parameter der Procedure musst Du auch bei TMyProc=... angeben

      Comment


      • #4
        Hallo,
        so sollte der Aufruf Deiner Procedure auch funktionieren.
        <br>
        type <br>
        TForm1 = class(TForm) <br>
        Button1: TButton; <br>
        procedure Button1Click(Sender: TObject); <br>
        private <br>
        { Private-Deklarationen } <br>
        public <br>
        { Public-Deklarationen } <br>
        end; <br>
        TMyProc = Procedure (ASampleText : String) of object; <br>
        TMyFirstClass = Class (TObject) <br>
        End; <br>
        TMySecondClass = Class (TMyFirstClass) <br>
        published <br>
        Procedure DoSomething (ASampleText : String); <br>
        End; <br>
        var <br>
        Form1: TForm1; <br>
        implementation <br>
        {$R *.DFM} <br>
        <br>
        Procedure TMySecondClass.DoSomething (ASampleText : String); <br>
        begin <br>
        ShowMessage (ASampleText); <br>
        end; <br>
        <br>
        procedure TForm1.Button1Click(Sender: TObject); <br>
        Var myFirstClass : TMyFirstClass; <br>
        myProc : TMyProc; <br>
        begin <br>
        myFirstClass := TMySecondClass.Create; <br>
        @myProc := myFirstClass.MethodAddress ('DoSomething'); <br>
        If @myProc <> Nil then <br>
        myProc ('Erfolgreich aufgerufen.'); <br>
        myFirstClass.Free; <br>
        end; <br>
        end. <br>
        <br>
        TMyFirstClass entspricht in Deinem Fall TForm. <br>
        TMySecondClass entspr. der Form mit der aufzurufenden Procedure. <br>
        Die Parameter der Procedure musst Du auch bei TMyProc=... angeben. <br&gt

        Comment


        • #5
          <HTML>
          <HEAD>
          <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
          <META NAME="Generator" CONTENT="Microsoft Word 97">
          <TITLE>Antwort</TITLE>
          </HEAD>
          <BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#ffffff">

          <B><FONT FACE="Tahoma"><P>Hallo, <BR>
          so sollte der Aufruf Deiner Procedure auch funktionieren.</B></FONT> </P>
          <P><HR></P>
          <FONT FACE="Courier" SIZE=2><BLOCKQUOTE>type <BR>
          &nbsp; TForm1 = class(TForm) <BR>
          &nbsp;&nbsp;&nbsp; Button1: TButton;<BR>
          &nbsp;&nbsp;&nbsp; procedure Button1Click(Sender: TObject); <BR>
          &nbsp;&nbsp;&nbsp; private <BR>
          &nbsp;&nbsp;&nbsp; { Private-Deklarationen } <BR>
          &nbsp;&nbsp;&nbsp; public <BR>
          &nbsp;&nbsp;&nbsp; { Public-Deklarationen } <BR>
          &nbsp; end; <BR>
          <BR>
          &nbsp; TMyProc = Procedure (ASampleText : String) of object; <BR>
          &nbsp; TMyFirstClass = Class (TObject) <BR>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p; End; <BR>
          <BR>
          &nbsp; TMySecondClass = Class (TMyFirstClass) <BR>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp; published <BR>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp; Procedure DoSomething (ASampleText : String); <BR>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp; End; <BR>
          <BR>
          var <BR>
          &nbsp; Form1: TForm1; <BR>
          implementation <BR>
          {$R *.DFM} <BR>
          <BR>
          Procedure TMySecondClass.DoSomething (ASampleText : String); <BR>
          begin <BR>
          &nbsp; ShowMessage (ASampleText); <BR>
          end; <BR>
          <BR>
          procedure TForm1.Button1Click(Sender: TObject); <BR>
          &nbsp; Var myFirstClass : TMyFirstClass; <BR>
          &nbsp; myProc : TMyProc; <BR>
          begin <BR>
          &nbsp; myFirstClass := TMySecondClass.Create; <BR>
          &nbsp; @myProc := myFirstClass.MethodAddress ('DoSomething'); <BR>
          &nbsp; If @myProc &lt;&gt; Nil then <BR>
          &nbsp;&nbsp;&nbsp;&nbsp; myProc ('Erfolgreich aufgerufen.'); <BR>
          &nbsp; myFirstClass.Free; <BR>
          end; <BR>
          <BR>
          end. </BLOCKQUOTE>
          </FONT><P><HR></P>
          <B><FONT FACE="Tahoma"><P>TMyFirstClass entspricht in Deinem Fall TForm. <BR>
          TMySecondClass entspr. der Form mit der aufzurufenden Procedure. <BR>
          Die Parameter der Procedure musst Du auch bei TMyProc=... angeben.</B></FONT><FONT FACE="Tahoma" SIZE=2> </P></FONT></BODY>
          </HTML&gt

          Comment

          Working...
          X