Announcement

Collapse
No announcement yet.

zentrale Ereignisbehandlung

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

  • zentrale Ereignisbehandlung

    Hallo,

    ich möchte innerhalb eines Form zentral auf Ereignisse (z.B. OnExit) der untergeordneten Komponenten reagieren ohne jeder einzelnen Komponente eine Routine für OnExit zuzuweisen.

    Wie kann man das elegant lösen?

    Tschüß

    Torsten

  • #2
    <pre>

    <code><font size=2 face="Courier New"><b>unit </b>Unit3;
    <br>
    <b>interface
    <br>
    uses
    </b>Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls;
    <br>
    <b>type
    </b>TForm1 = <b>class</b>(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    <b>procedure </b>Button1Click(Sender: TObject);
    <b>private
    procedure </b>DoExit(Sender: TObject);
    <b>public
    </b><font color="#008080"><i>{ Public-Deklarationen }
    </i></font><b>end</b>;
    <br>
    <b>var
    </b>Form1: TForm1;
    <br>
    <b>implementation
    <br>
    </b><font color="#008080"><i>{$R *.DFM}
    <br>
    </i></font><b>uses </b>TypInfo;
    <br>
    <b>procedure </b>SetProperties(Component: TComponent; <b>const </b>DoExit: TMethod);
    <b>var
    </b>I: Integer;
    P: PPropInfo;
    <b>begin
    </b><font color="#008080"><i>// Beispiel f&uuml;r Torsten
    </i></font>P := GetPropInfo(Component, <font color="#0000FF">'OnExit'</font>, [tkMethod]);
    <b>if </b>P &lt;&gt; <b>nil then </b>SetMethodProp(Component, P, DoExit);
    <br>
    <font color="#008080"><i>// Beispiel f&uuml;r Helmut
    </i></font>P := GetPropInfo(Component, <font color="#0000FF">'Caption'</font>);
    <b>if </b>P &lt;&gt; <b>nil then </b>SetStrProp(Component, P, <font color="#0000FF">'Test'</font>);
    <br>
    <b>for </b>I := <font color="#0000FF">0 </font><b>to </b>Component.ComponentCount -<font color="#0000FF">1 </font><b>do
    </b>SetProperties(Component.Components[I], DoExit);
    <b>end</b>;
    <br>
    <b>procedure </b>TForm1.Button1Click(Sender: TObject);
    <b>var
    </b>E: TMethod;
    <b>begin
    </b>TNotifyEvent(E) := DoExit;
    Setproperties(Self, E);
    <b>end</b>;
    <br>
    <b>procedure </b>TForm1.DoExit(Sender: TObject);
    <b>begin
    </b>MessageBox(Handle, <font color="#0000FF">'OnExit'</font>, <b>nil</b>, <font color="#0000FF">0</font>);
    <b>end</b>;
    <br>
    <b>end</b>.
    </font>
    </code></pre&gt

    Comment


    • #3
      Hallo Hagen,

      die Idee einfach zur Laufzeit allen Komponenten eine OnExit-Methode "unterzujubeln" hatte ich für mich nur als Notlösung betrachtet. So wie es aussieht, ist es aber der einfachste Weg.

      Danke Hagen

      Tschüß

      Torste

      Comment


      • #4
        Ja, hilfreich wäre ein kleiner Editor zur Designzeit, der einfach alle Komponenten mit gleicher gesuchter Eigenschaft/Event selektiert. Dann braucht man nur bei einer Komponente das OnExit() setzen und setzt autom. alle anderen auf das gleiche Event. Damit spart man sich den Code im Source.

        Gruß Hage

        Comment


        • #5
          Hi,
          <br>
          <br>@Hagen
          <br>Funktioniert das nicht schon? (in Delphi 5)
          <br>-für eine Komponente die Eigenschaft erstellen; jetzt steht im <br>Property Editor bei der Eigenschaft Onexit: TestCompOnExit
          <br>-diese Zeile/diesen Wert im Property Editor markieren und in die Zwischenablage legen
          <br>- X andere Komponenten markieren (mittels shift) und dann in den <br>Property Editor (zu Onexit) wechseln und "TestCompOnExit" einfügen
          <br>
          <br>nun sollten alle Komponenten die gleiche Ereignisproc besitzen.
          <br>
          <br>mfg
          <br>P

          Comment


          • #6
            Moin Zusammen,<br>
            <br>
            wenn ich nicht irre verwendet Hagen ja D3, und ob das da schon einfacher ging entzieht sich meiner Kenntnis. Sieht allerdings nicht so aus.<br>
            <br>
            @Patrick<br>
            Das geht noch einfacher:<br>
            Mit Shift alle Komponenten markieren, die das gleiche, z.B. OnExit, bekommen sollen.<br>
            In den Objektinspektor wechseln, und das Ereignis Doppelklicken.<br>
            Schon ist allen markierten Komponenten die gleiche Routine zugeordnet.<br>
            <br>
            Ciao<br>
            Chri

            Comment


            • #7
              Ich meinte das ein bißchen anders. Anstatt manuell ALLE Komponenten auszuwählen so daß man dann denen das gleiche Ereigniss setzen kann, meinte ich einen Menubefehl wie "selektiere alle Komponenten vom Typ X oder alle Komponeten die ein Event mit namen X vom Typ Y besitzen". D.h. anstatt nun das OnExit() ALLER möglichen Komponenten manuell zu selektieren sollte dieser Menubefehl dies autom. machen.<br>
              Der Objectinspector blendet nur die Eigenschaften einer Komponentenselektion ein die auch ALLE selektierten Komponenten gemeinsam haben.<br>So wie das sollte es möglich sein einfach alle Komponenten mit gemeinsamer gesuchter Eigenschaft zu selektieren.<br>
              Meines Erachtens ist das möglich per AddOn und in keiner Delphi Version kenne ich einen solchen Befehl.<br>

              Ich verwende übrigens D3/D5/D6

              Gruß Hage

              Comment


              • #8
                Moin Hagen,<br>
                <br>
                dann sollte man allerdings sinnvollerweise eine Liste der Möglichen Komponenten erhalten, um auch gezielt einzelne aus dieser automatischen Selektion auszunehmen, denn, je nach Event will man ja eventuell nicht ALLE mit dem gleichen ausstatten.<br>
                <br>
                (na ja, zumindest verwendest Du AUCH D3, mir war nämlich so als hätt' ich's letztens gelesen ;-))<br>
                <br>
                Ciao<br>
                Chri

                Comment


                • #9
                  Hi Jungs,

                  irgendwie beisst sich die Katze bei eurer Diskussion doch in den Schwanz ;-)

                  Gruß
                  Gesin

                  Comment


                  • #10
                    Ne, der Schwanz schiebt sich in Katzes Maul :

                    Comment


                    • #11
                      miau :-

                      Comment


                      • #12
                        Ähm, ich sehe jetzt das man meinen Kommentar auch "anders" interpretieren könnte. Er IST ohne irgendwelche Hintergedanken von mir "gedacht" worden, sorry

                        Comment


                        • #13
                          Hi Hagen,

                          Uups, schlimmer Finger du ! ;-)

                          Gruß
                          Gesin

                          Comment


                          • #14
                            Moin Hagen,<br>
                            <br>
                            das ist mir erst durch Deinen Kommentar zu dem Kommentar aufgefallen )<br>
                            <br>
                            Ciao<br>
                            Chri

                            Comment

                            Working...
                            X