Announcement

Collapse
No announcement yet.

xp und showmessage

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

  • xp und showmessage

    hallo
    folgendes problem nur bei winxp.
    in formactivate des hauptformulares führe ich bestimmte prüfungen durch. wenn die prueffunktion false zurückliefert informiere ich über showmessage
    den nutzer und breche über application.terminate das programm ab.
    bei winxp ist der dialog nicht modal, hinter dem hauptformular und ich
    kann das hauptformular normal bearbeiten. erst wenn die dialogbox beendet wird, terminiert auch die anwendung. messagedlg statt showmessage bringt auch keinen erfolg. showmessage und messagedlg erzeugen hier keine modalen
    dialoge.

    wer kann helfen ?

  • #2
    Hallo,

    ich kann das Verhalten mit Delphi 6.01 unter Windows XP Professional nicht reproduzieren: ShowMessage zeigt das Hinweisfenster modal an.
    <pre>
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs;

    type
    TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormActivate(Sender: TObject);
    begin
    ShowMessage('Test');
    Application.Terminate;
    end;

    end.
    </pre&gt

    Comment


    • #3
      hallo herr kosch. bin leider heute erst an einem xp-system.<br>
      in formactivate führe ich prüfungen, initialisierungen usw. durch,
      welche einige prozessorzeit verbraten.<br>
      mit folgender hilfsfunktion sollten sie das verhalten nachvollziehen können. <br>
      vor schowmessage.. if pruefen(5000) then exit;<br>

      function tform1.pruefen(dwms : dword):boolean;<br>
      var dwstart : dword;<br>
      begin<br>
      start := gettickcount;<br>
      repeat<br>
      slepp(200); // irgendwas tun<br>
      until gettickcount > dwstart+ dwms;<br>
      result := false;<br>
      end;<br>

      am besten sie fügen noch ein menü ein. während der 5 sekunden die
      der prozessor beschäftigt ist, können sie bei xp das formular über
      die titelleiste verschieben. es sollten auch bei ihnen die message
      und form1 als nicht modulare fenster focussiert werden. über das
      menü könnten sie in der startphase ein weiteres fenster erzeugen.
      habe aber alles nur mit d3 - d5 ausgeführt. wenn es mit d6 nicht
      auftritt bitte ich um mitteilung

      Comment


      • #4
        Hallo,

        mit der Wartezeit kann ich das Problem reproduzieren, wobei sich Delphi hier selbst ins Bein schiesst. Wird die VCL-Prozedur ShowMessage durch die Win32-API-Funktion <b>MessageBox</b> ersetzt, beendet sich das Programm erst dann, wenn die MessageBox weggeklickt wird:
        <pre>
        function DoWork(d: DWORD):Boolean;
        var
        dwStart : DWORD;
        begin
        dwStart := GetTickCount;
        repeat
        Sleep(200);
        until GetTickCount > dwStart + d;
        Result := False;
        end;

        procedure TForm1.FormActivate(Sender: TObject);
        begin
        DoWork(5000);
        Windows.MessageBox(0, 'Test','Test', 0);
        // ShowMessage -> CreateMessageDialog -> TMessageForm.CreateNew
        // ShowMessage('Test');
        Application.Terminate;
        end;
        </pre>
        Da sich hinter der VCL-Prozedur ShowMessage nur ein TForm verbirgt, das ein modales Verhalten simuliert, scheint die lange Wartezeit in DoWork die VCL aus dem Tritt zu bringen.

        Generell würde ich eine so zeitaufwendige Prüfung nicht direkt in der Ereignisbehandlungsmethode für OnActive unterbringen, sondern statt dessen über PostMessage eine eigene private Botschaft an das Formular schicken. Win32 stellt diese Botschaft erst dann zu, wenn der Teil der Anwendungsaktivierung (Fokuswechsel) abgearbeitet ist. Die Prüfung und der Aufruf von Application.Terminat erfolgt dann in der Botschaftsbehandlungsmethode für die private Botschaft, so dass auch die VCL-Prozedur ShowMessage wieder das gewohnte Verhalten an den Tag legen sollte.
        &#10

        Comment

        Working...
        X