Announcement

Collapse
No announcement yet.

Application.ProcessMessages

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

  • Application.ProcessMessages

    Hallo,<br>ich habe ein Problem mit Application.ProcessMessages während ich eine Form dynamisch erstelle.
    <code><pre>
    <font face="Verdana" size="1"> <font color="#800000"><b>With</b></font> TFormSearch.Create(Application) <font color="#800000"><b>do</b></font>
    <font color="#800000"><b>begin</b></font>
    <font color="#800000"><b>Try</b></font>
    <font color="#800000"><b>If</b></font> ShowModal=mrOk <font color="#800000"><b>then</b></font>
    <font color="#800000"><b>begin</b></font>
    <font color="#000080"><b>// Application.ProcessMessages;</b></font>
    FSearchModus:=ComboBox1.ItemIndex;
    <font color="#800000"><b>end</b></font>; <font color="#000080"><b>// If ShowModal=mrOk then</b></font>
    <font color="#800000"><b>Finally</b></font>
    Release;
    <font color="#800000"><b>end</b></font>;
    <font color="#800000"><b>end</b></font>;</font>
    </pre></code><br>Nach meinem Verständnis sollte die Form und alle darauf enthaltenen Komponenten bis Release gültig sein. Wenn ich jedoch Application.ProcessMessages nicht auskommentiere, ist ComboBox1 bei der Zuweisung zu FSearchModus gleich Nil. Ohne Application.ProcessMessages scheint alles prima zu laufen. <br>Könnte mir das bitte jemand erklären?<br>:-) Jens Schumann

  • #2
    Hallo,

    ich kann das o.g. Verhalten mit dem folgenden Beispiel nicht reproduzieren:
    <pre>
    uses Unit2;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    with TForm2.Create(Application) do
    begin
    try
    ShowModal;
    Application.ProcessMessages;
    ShowMessage(IntToStr(ComboBox1.ItemIndex));
    finally
    Release;
    end;
    end;
    end;
    </pre>
    Nur dann, wenn das zweite Formular beim Schließen Action auf <b>caFree</b> setzt, wird das Formular gleich beim Schließen entsorgt, so dass der Combobox-Zugriff fehlschlagen muss:
    <pre>
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    Action := caFree;
    end;
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch,<br>vielen Dank, caFree das ist es. Mit caHide im OnClose-Handler sieht die Sache schon ganz anders aus.<br>:-) Jens Schuman

      Comment


      • #4
        Hallo Herr Kosch,<br>wenn ich im OnClose-Handler Action:=caFree setzte, könnte ich mir dann den Aufruf von Release sparen?<br>:-) Jens Schuman

        Comment


        • #5
          Hallo,

          der Sourcecode bleibt übersichtlicher und sicherer, wenn der Try..Finally-Block mit dem Create/Release-Aufruf an einer Stelle zusammengefasst wird. Sie haben selbst gesehen, wie schnell eine Änderung wie <i>caHide/caFree</i> gemacht ist und welche unerwünschten Nebenwirkungen damit auftauchen. Ich würde daher auf <i>caFree</i> verzichten, da dieser Weg nur für nichtmodale Dialoge üblich ist, die vom Anwender mehrfach aufgerufen werden dürfen

          Comment

          Working...
          X