Announcement

Collapse
No announcement yet.

Kompo soll beim Schließen eines Property - Forms anderen Prop setzen (wie ???)

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

  • Kompo soll beim Schließen eines Property - Forms anderen Prop setzen (wie ???)

    Hallo,<br>
    <br>
    Ich habe eine Kompo die von TComponent abgeleitet ist.<br>
    Diese Kompo hat ein Property Visible.<br>
    Beim Setzen auf True, soll ein TForm Objekt erzeugt und angezeigt werden.<br>
    Beim Setzen auf False soll das TForm Objekt geschlossen und freigegeben werden.<br>
    Das funktioniert auch alles 100%ig einwandfrei!<br>
    <br>
    Nun zum Problem:<br>
    Wenn das TForm Objekt nun nicht über die Property Visible geschlossen wird, sondern über das "Kreuz" oder "Alt+F4" dann möchte ich das die Eigenschaft Visible auf False gesetzt wird.<br>
    <br>
    Wie kann man das realisieren?
    <br>
    <br>
    Cu
    <br>
    Ingo Schreiber

  • #2
    Du kannst deiner Komponente einen Destructor verpassen in dem du dann die Property Visible vor dem Zerstören der Komponente auf False setzt

    Comment


    • #3
      Hallo Ingo,

      ich glaub Du suchst eher eine Möglichkeit das Schließen des Forms abzufangen. Wenn das erzeugende Objekt innerhalb des Forms bekannt ist, kannst Du in dem Ereignis OnClose() bzw. OnCloseQuery() entsprechend die Eigenschaft im Objekt setzen.

      Grüße Joche

      Comment


      • #4
        @Sascha...<br>
        <br>
        ich denke, ich habe das noch nicht richtig beschrieben.<br>
        <br>
        Kompo A vom Typ TComponent hat ein Property Visible.<br>
        Wenn ich die Property Visible auf True setze, dann soll ein TForm Objekt mit folgender Anweisung erzeugt werden.<br>
        <br>
        .....
        <br>
        if FForm = Nil then<br>
        FForm := TXYZForm.Create(Application);<br>
        FForm.Show;<br>
        <br>
        .....
        <br>
        <br>
        Das funktioniert wie geschrieben ja auch.<br>
        <br>
        Wenn mann nun das FForm schließt (über X oder Alt+F4) dann soll dass der Kompo A mitgeteilt werden und Visible auf False gesetzt werden.<br>
        Mit Owner geht es nicht, weil Owner ja die Application ist (Delphi).
        <br>
        Hast du da ne Lösung (oder jemand anders)?
        <br>
        <br>
        Cu
        <br>
        Ing

        Comment


        • #5
          Was spricht dagegen als Owner Kompo A statt der Application zu nehmen

          Comment


          • #6
            Hallo Jochen,

            wenn ich folgenden Source nehme, dann wird das FForm doch nicht angezeigt in Delphi.

            ....

            if FForm = Nil then

            FForm := TXYZForm.Create(Kompo A);

            FForm.Show;

            oder sehe ich das falsch?

            cu

            Ing

            Comment


            • #7
              Hallo Ingo,

              kann ich nicht sagen, im C++ Builder funktioniert es, also denke ich es sollte auch in Delphi funktionieren....

              Joche

              Comment


              • #8
                Hallo Jochen,

                ich denke schon....
                werde es heute Abend mal testen!

                cu

                Ing

                Comment


                • #9
                  Nur nochmal als Nachtrag....
                  Die ganze Sache soll in der Delphi IDE stattfinden.<br>
                  Also im Entwicklermodus wenn man es so nennen kann.<br>
                  Also wenn jemand ne Lösung hat dann --->>>

                  cu

                  Ing

                  Comment


                  • #10
                    Ich bin mir nicht sicher, ob ich alles richtig verstanden habe, aber notfalls (wenn's mit dem Owner nicht klappt), kannst du der TXYZForm doch auf andere Art (also <i>nicht</i> als Owner) eine Referenz auf Kompo A mitgeben, entweder als weiteren Parameter im Konstruktor oder als eigenständige Property.

                    <p>Uli

                    Comment


                    • #11
                      @Uli,<br>
                      <br>
                      meinst du das so?<br>
                      <br>
                      - Form XYZ ableiten von TForm;<br>
                      - Form XYZ eine neue Eigenschaft (Property) geben (Typ String);<br>
                      - beim Create von Form XYZ den Owner in die neue Prop schreiben;<br>
                      - beim Schließen von Form XYZ mit FindComponent auf die Eigenschaft Visible zugreifen und setzen;<br>
                      <br>
                      <br>
                      Habe ich das so richtig verstanden?<br>
                      <br&gt

                      Comment


                      • #12
                        Hallo,

                        zur Entwicklungszeit in der Delphi IDE ????
                        Dann mal im OpenTools API unter TPropertyEditor
                        b.z.w. unter TComponent Editor nachsehen !
                        Viel Erfolg

                        Comment


                        • #13
                          Hallo Ingo,<BR><BR>
                          dafür ist meiner Meinung nach die Methode FreeNotification zuständig:<BR><BR>
                          <PRE>
                          if FForm = nil then
                          begin
                          FForm := TXYZForm.Create(Application);
                          // Compo bei Destoy benachrichtigen...
                          FForm.FreeNotification(self);
                          end;
                          FForm.Show;
                          </PRE>
                          Dann noch die Methode Notification der Komponente überschreiben<BR>
                          <PRE>
                          protected
                          procedure Notification(AComponent: TComponent; Operation: TOperation); override;
                          ...
                          Procedure TMyComponent.Notification(Component:TComponent; Operation:TOperation);
                          Begin
                          inherited Notification( AComponent, Operation );
                          If (Component=FForm) and (Operation=opRemove) then
                          begin
                          FForm := nil;
                          FVisible := False;
                          end;
                          end;
                          </PRE>
                          Fran

                          Comment


                          • #14
                            <i>meinst du das so?</i><br>

                            Prinzipiell ja, nur soll die Eigenschaft kein String sein, sondern den Typ von Kompo A haben. Dann fällt auch das FindComponent flach.
                            <p>Oder sehe ich das Problem zu simpel? :-)
                            Ich bin nämich nicht sicher, ob der Dialog jetzt ein Component-/Property-Editor ist oder zur Laufzeit auftauchen soll.
                            <p>Uli

                            Comment


                            • #15
                              Hallo Ingo,<BR><BR>
                              ich find das ganze Durchgereiche von Info' s nicht sinnvoll und es wiederspricht auch den Regeln von OOP.<BR>
                              Prinzipiell ist es zwar möglich, die Compo als Owner zu übergeben. Ein eigenes Property im Form ist aber dann überflüssig.<BR>
                              Im DestroyEvent des Forms könnte dann stehen:<BR>
                              <PRE>
                              if self.Owner is TMyCompo then
                              TMyCompo(self.Owner).Form := nil;
                              </PRE>
                              Es ist aber unsauber, da das Formular jetzt die Klasse der Komponente und deren Properties kennen muß. Das Formular soll aber "dumm" sein, sonst schaffst du unnötige Abhängigkeiten und über eine Wiedeverwendung brauchst du nicht mehr nachzudenken.<BR>
                              Dein Fall ist ein Standardfall und genau dafür hat Borland die Methode FreeNotification implementiert. Damit Registrierst du deine Komponente beim Formular, damit auch deine Komponente von der Zerstörung des Formulares über Notification benachrichtigt wird.<BR>
                              Im Formular hast du dadurch keinen weiteren Code und auch keine Abhängigkeit.<BR><BR>
                              Gruss, Fran

                              Comment

                              Working...
                              X