Announcement

Collapse
No announcement yet.

Ereignisse von zur Laufzeit erzeugten Komponenten

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

  • Ereignisse von zur Laufzeit erzeugten Komponenten

    Hallo Leute,

    wenn ich zur Laufzeit eine Komponente (z.B. Panel) erzeuge, kann ich mit dem Eintrag OnClick auch ein Ereigniss ansteuern. Mein Problem nun ist, das ich dieses Ereigniss auch deklarieren muss. Wenn ich aber zur Laufzeit Komponenten erzeuge, so weis ich nicht unbedingt wieviele OnClick Ereignisse ich deklarieren muss ???

  • #2
    Hallo, nur eines.<BR>
    privat<BR>
    MeineProcedure(Sender : TObject);<BR>

    NeueKomponente.OnClick := MeineProcedure;<BR>

    MeineProcedure(Sender : TObject);<BR>
    begin<BR>
    ...<BR>
    END;<BR>
    Gruß<BR>
    Matthia

    Comment


    • #3
      Wenn ich einen Ereignishandler für eine nichtvisuell erzeugte Komponente brauche, mache ich das oft so:<ul>
      <li>Ich erzeuge mir fix ein Dummy-Projekt,
      <li>klatsche dort eine Instanz der relevanten Komponentenklasse auf die Form1,
      <li>doppelklicke im Objektinspektor auf das interessierende Ereignis,
      <li>kopiere den Methodenkopf (den aus der Klassendeklaration, d.h. ohne "TForm1." vornedran) in die Zwischenablage,
      <li>öffne wieder das Projekt, an dem ich eigentlich arbeite,
      <li>füge den gemerkten Methodenkopf in die private-Sektion meiner Formklasse ein,
      <li>und drücke Strg-Shift-C.
      </ul>
      Das geht schneller, als es sich jetzt so liest ;-) Und im Vergleich zur händischen Lösung sparst du dir die Suche nach der richtigen Signatur in der Hilfe und das danach folgende Umformatieren der Methoden<b>typ</b>deklaration in eine Methodendeklaration
      <br>Nach dieser Prozedur darfst du nicht vergessen, im Konstruktor oder OnCreate der Form eine Zeile a la<pre>
      FKompo.OnClick := Kompo1Click;
      </pre>
      einzufügen.
      <br>Ciao, Uli

      Comment


      • #4
        Habe die Sache jetzt so angegangen:

        Bei der nicht visuellen Komponente das Ereigniss on Click eingefügt.

        OnClick := Panel1Click;

        In der Procedure Panel1Click werte ich dann die Variable Sender.Name aus und arbeite mit der Function FindComponent weiter :-

        Comment


        • #5
          <i>In der Procedure Panel1Click werte ich dann die Variable Sender.Name aus und arbeite mit der Function FindComponent weiter :-)</i><br>
          Da kannst du auch gleich mit TComponent(Sender) arbeiten. Wenn du auf Nummer sicher gehen willst, prüfe vorher noch den Typ ab:<pre>
          if Sender is TComponent then
          begin
          TComponent(Sender).Tag := 666;
          //...
          end;
          </pre>
          Ciao, Uli

          Comment


          • #6
            Gute Idee :-)) Danke

            Comment


            • #7
              Funktioniert aber nicht mit

              TComponent(Sender).color := clWhite;

              oder ?

              Comment


              • #8
                Ich hab jetzt nicht nachgeschaut, aber die Property Color wird wahrscheinlich erst bei spezialisierteren Kompos veröffentlicht.
                Da musst eben auf diese Casten, also z.B. (ungetestet)<pre>
                if Sender is TPanel then
                begin
                TPanel(Sender).Color := clWhite;
                //...
                end;
                </pre>
                Ohne Cast ginge das aber auch bei der FindComponent-Methode nicht ab.
                <br>Ciao, Uli

                Comment


                • #9
                  Kann zwar jetzt mit dem Begriff Cast nichts anfangen, denke aber Du meinst folgendes

                  with FindComponent(Bezeichner) as TPanel do begin
                  color := clWhite;
                  end

                  Comment


                  • #10
                    Ja, ein Cast ist eine Typwandlung. Die Syntax ist entweder<ul>
                    <li>TPanel(Sender) oder
                    <li>Sender as TPanel
                    </ul>
                    Die erste Variante ist ne Winzigkeit schneller als die zweite,
                    welche dafür sicherer ist - sie hat nämlich die Typprüfung, die ich in obigen Beispielen explizit mit "is" gemacht habe, gleich mit eingebaut. Ich finde allerdings die Variante mit "is" und ungeprüftem Cast oft leichter handhabbar (keine Exceptions und so) -- hängt immer vom Kontext ab.
                    <br>Ciao, Uli

                    Comment


                    • #11
                      Nochmals Danke für die Tips

                      Marcu

                      Comment


                      • #12
                        (Sender as TControl).Colo

                        Comment


                        • #13
                          @Hagen: Leider ist bei TControl die Eigenschaft Color noch nicht veröffentlich, auch wenn's laut Hilfe da angesiedelt ist (Delphi 6).<p>
                          Schöne Grüße, Mario Noac
                          Schöne Grüße, Mario

                          Comment


                          • #14
                            Oh, dann mal TWinControl nutzen, es zeigt aber schon die kleinen Inkonsistenzen in der VCL. So viel wie ich weis war aber in D3 noch diese Eigenschaft vorhanden. Werde das nochmal genauer überprüfen, danke.

                            Gruß Hage

                            Comment

                            Working...
                            X