Announcement

Collapse
No announcement yet.

Form wird nicht angezeigt

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

  • Form wird nicht angezeigt

    Hallo,
    ichhabe folgendes Problem.

    Ein kleines Programm "Projekt1.exe" ruft bei mir eine weiteres Programm "Projekt2.exe" auf, welches wiederum eine DLL lädt, in der der eigentliche Ablauf des Programm enthalten ist.
    Bei dieser Prozedur, wird die Form in der DLL nicht angezeigt. Der Programmablauf funktioniert aber.

    Rufe ich jedoch das Programm "Projekt2.exe" allein auf, so wird mir die Form aus der DLL angezeigt.
    Woran kann das liegen. Kann mir jemand helfen ?

    Danke John

  • #2
    Hallo John,<br>trotz meiner Erfahrung mit Forms in einer DLL kann ich mich nicht zu Deinem Problem äußern. Bitte zeig uns doch den DLL-Source. Das DLL-dpr und die unit mir dem Formular<br>:-) Jens Schuman

    Comment


    • #3
      Hallo John,<br> mir ist da noch was eingefallen. Wenn Du in der DLL das <b>Form</b> mit <b>Show</b> anzeigst verschwindet es sofort wieder. <b>ShowModal</b> kann hier machmal helfen.<br>:-) Jen

      Comment


      • #4
        Hallo Jens,
        hier ist erstmal der Source von dem Programm, welches die DLL aufruft.

        Procedure TForm1.FormActivate( Sender : TObject );
        Begin
        DLLHandle := LoadLibrary( PChar( 'PCRDLL' ) );
        FuncPtr := GetProcAddress( DLLHandle, 'ADMCtrl' );
        If FuncPtr <> Nil Then
        Begin
        Application.Title := 'PCR';
        @TFunction := FuncPtr;
        TFunction;
        FuncPtr := Nil;
        End
        Else
        Begin
        Showmessagepos( 'PCRDLL.dll wurde nicht gefunden !!!', 1, 1 );
        End;
        FreeLibrary( DLLHandle );
        End;

        Hier ist der Source der DLL bzw die Funktion, durch die ich die DLL
        aufrufe.

        Function ADMCtrl : Word;
        Begin
        Form1 := TForm1.Create( Application );
        Try
        Form1.ShowModal;
        Finally
        Form1.Free;
        End;
        End;

        Durch das eine Programm überwache ich Windows, ob Windows beendet wird.
        Ist das der Fall, soll das Projekt2 aufgerufen werden und dadurchdie DLL. Klingt ein wenig verwirrend, aber anders geht es nicht

        procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
        begin
        inherited; { let the inherited message handler respond first }
        if Message.Result= 0 then begin
        end
        else begin
        GetADMMessage.ReadMailButtonClick;
        if PCR_Mail_Exists = True then begin
        Executefile('project2.exe','',ProgrammdirADM,0);
        Message.Result:=0;
        end else begin
        Message.Result:=1;
        end;
        end;
        end;

        Wie gesagt : Rufe ich das Projekt2 direkt auf sehe ich die Form der DLL. Rufe ich das Programm "Projekt2.exe" durch das Programm "Projekt1.exe" auf, sehe ichdie Form nicht.

        Eine Ahnung ?

        Danke für dir Hilfe

        Joh

        Comment


        • #5
          Hallo John,<br>so etwas habe ich noch nicht gemacht. Deshalb kann ich nur Mutmassungen anstellen. Ich habe das Gefühl, da Du projekt2 über projekt1 startest irgendwas mit Application nicht stimmt. Deshalb schlage ich vor explizit das Application Handle in ADMCtrl zu setzen. Einmal von projekt1 und dann von Projekt2. Wenn das nicht hilft, weiss ich auch nicht weiter.<br>
          <pre>
          Function ADMCtrl(Apphandle : THandle) : Word;
          var
          OldHandle : THandle;
          Begin
          OldHandle:=Application.handle;
          Application.Handle:=AppHandle;
          Form1 := TForm1.Create( Application );
          Try
          Form1.ShowModal;
          Finally
          Application.Handle:=OldHandle;
          Form1.Relesee; {Ist hier besser, da erst alle Botschaften an
          Form1 abgearbeitet werden}
          End;
          End;
          </pre>

          Bei mir hat es schon so manchesmal Wunder gewirkt.<br>
          :-) Jen

          Comment

          Working...
          X