Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit mehreren Forms und ShowModal (https://www.delphipraxis.net/28744-problem-mit-mehreren-forms-und-showmodal.html)

jfheins 29. Aug 2004 16:32


Problem mit mehreren Forms und ShowModal
 
Ich habe ein Hauptformular (Form1).
Daraus wird per ShowModal ein zweites Formular geöffnet.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.FormStyle := fsNormal;
Form2.FormStyle := fsStayOnTop;
Form2.ShowModal;
Form2.FormStyle := fsNormal;
Form1.FormStyle := fsStayOnTop;
refreshed;
end;
Wenn man auf den Button klickt, Sieht Form1 erstmal ganz komisch aus, (Graue Fläche, alle "Sachen" als weiße Löcher) und nach einiger Zeit (=nach dem alles ausgeführt wurde) wird Form2 angezeigt, es schließt sich jedoch nicht.

Hier der Quellcode für Form2:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Inifiles, StrUtils, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, ComCtrls, ExtCtrls;

type
  TForm2 = class(TForm)
  IdHTTP1: TIdHTTP;
  ProgressBar1: TProgressBar;
  Label1: TLabel;

  procedure FormCreate(Sender: TObject);
  procedure refresh;
  procedure FormShow(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
  nach: array[0..8] of string;

implementation

uses Unit1;

{$R *.dfm}


procedure TForm2.refresh;
const
 vfehler = 'Es trat ein Fehler bei der Internetverbindung auf !';
 sfehler = 'Es trat ein Fehler bei der Speicherung der Wechselkurse auf !';
var
 Ini: TIniFile;
 quell: array[0..7] of string;
 z: integer;
 fehler: string;
begin
 Progressbar1.Position := 0;
 Label1.Caption := 'Aktualisierung läuft ...';
 Label1.Font.Color := clNavy;

 sleep (1000);
 Application.ProcessMessages;

 try

  // viele Anweisungen, Falls etwas schief geht steht eine Beschreibung des Fehlers in Fehler

  Label1.Caption := 'Erfolgreich Aktualisiert';
  Label1.Font.Color := clGreen;
 except
  showmessage (fehler);
  Label1.Caption := 'Es sind Fehler aufgetreten !';
  Label1.Font.Color := clRed;
 end;
 Application.ProcessMessages;
 sleep (1000);

 Form2.Close;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
nach[0] := 'USD';
nach[1] := 'GBP';
nach[2] := 'CHF';
nach[3] := 'NOK';
nach[4] := 'DKK';
nach[5] := 'SEK';
nach[6] := 'JPY';
nach[7] := 'XAU';
end;

procedure TForm2.FormShow(Sender: TObject);
begin
 refresh;
end;

end.

mytar 29. Aug 2004 16:41

Re: Problem mit mehreren Forms und ShowModal
 
Ein Teil deindes Codes:

Delphi-Quellcode:
procedure TForm2.refresh;
const
vfehler = 'Es trat ein Fehler bei der Internetverbindung auf !';
sfehler = 'Es trat ein Fehler bei der Speicherung der Wechselkurse auf !';
var
Ini: TIniFile;
quell: array[0..7] of string;
z: integer;
fehler: string;
begin
Progressbar1.Position := 0;
Label1.Caption := 'Aktualisierung läuft ...';
Label1.Font.Color := clNavy;

sleep (1000);
Application.ProcessMessages;

try

  // viele Anweisungen, Falls etwas schief geht steht eine Beschreibung des Fehlers in Fehler

  Label1.Caption := 'Erfolgreich Aktualisiert';
  Label1.Font.Color := clGreen;
except
  showmessage (fehler);
  Label1.Caption := 'Es sind Fehler aufgetreten !';
  Label1.Font.Color := clRed;
end;
Application.ProcessMessages;
sleep (1000);

Form2.Close;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
nach[0] := 'USD';
nach[1] := 'GBP';
nach[2] := 'CHF';
nach[3] := 'NOK';
nach[4] := 'DKK';
nach[5] := 'SEK';
nach[6] := 'JPY';
nach[7] := 'XAU';
end;

procedure TForm2.FormShow(Sender: TObject);
begin
refresh;
end;
Du löst hier Refresh im OnShow-Event des Forms auf, vielleicht wäre eine bessere Codeformatierung und eine bessere Bezeichnerauswahl angebracht :-D

Wieso sleepst du eigentlich?

jfheins 29. Aug 2004 16:47

Re: Problem mit mehreren Forms und ShowModal
 
Zitat:

Zitat von mytar
vielleicht wäre eine bessere Codeformatierung und eine bessere Bezeichnerauswahl angebracht :-D

Möchtest du mal den Code sehen, bevor ich das alles in eine prozedur gepackt habe ???

Zitat:

Zitat von mytar
Wieso sleepst du eigentlich?

Weil ich dem Benutzer mit wenig programmiertechnischen aufwand die Möglichkeit geben möchte, zu sehen, was passiert.
Sonst würde das Ergebnis erscheinen und Millisekunden später schon wieder weg sein ...

mytar 29. Aug 2004 16:51

Re: Problem mit mehreren Forms und ShowModal
 
Jetzt ist mir klar!

Deine Prozedur Refresh wird mit dem OnShow-Event aufgerufen.

Aber hier:

einmal machst du:
Delphi-Quellcode:
sleep (1000);
Application.ProcessMessages;
und ein anderes mal:
Delphi-Quellcode:
Application.ProcessMessages;
sleep (1000);

jfheins 29. Aug 2004 17:15

Re: Problem mit mehreren Forms und ShowModal
 
Zitat:

Zitat von mytar
einmal machst du:
Delphi-Quellcode:
sleep (1000);
Application.ProcessMessages;
und ein anderes mal:
Delphi-Quellcode:
Application.ProcessMessages;
sleep (1000);

Ist das schlimm ???
Das eine mal möchte ich, dass er schläft, alles was passiert ist aufarbeitet, und dann weitermacht.
Das andere mal, dass er zum Schluss noch mal alles abarbeitet, und sich dann nach einer sekunde schließt.

jfheins 30. Aug 2004 13:59

Re: Problem mit mehreren Forms und ShowModal
 
Ich pushe ja sonst nicht (*schleim*), aber das muss jetzt mal sein ...
Hat keiner mehr eine Idee ???

nailor 30. Aug 2004 14:02

Re: Problem mit mehreren Forms und ShowModal
 
nee. so direkt nicht. aber lass mal das verändern des formstyles weg.

Luckie 30. Aug 2004 14:03

Re: Problem mit mehreren Forms und ShowModal
 
Also was mir als erstes in sAuge springt ist die Tatsache, dass du den Delphi-Referenz durchsuchenFormStyle zur Laufzeit änderst. In meiner Delphi Hilfe steht dazu:
Zitat:

Note: It is not advisable to change FormStyle at runtime.

jfheins 30. Aug 2004 14:10

Re: Problem mit mehreren Forms und ShowModal
 
Wenn ich das FormStyle weglasse, bleibt Form1, wie es ist, aber Form2 erscheint erst, wenn es fertig ist, ausserdem, schließt es sich immernoch nicht.

Leuselator 30. Aug 2004 14:13

Re: Problem mit mehreren Forms und ShowModal
 
Lass den ganzen FormStyle-, Sleep- und App.ProcessMess-Scheiss weg und guck dir den Anhang zu meinem letzten Post in diesem Thread an - das sollte Dein Problem lösen.
Gruß

jfheins 30. Aug 2004 14:29

Re: Problem mit mehreren Forms und ShowModal
 
Mmmh ... geht das nicht auch einfacher ???

Leuselator 30. Aug 2004 14:32

Re: Problem mit mehreren Forms und ShowModal
 
Ja:
Delphi-Quellcode:
Form2.ModalResult := mrCancel;
//oder:
Form2.ModalResult := mrOk;

jfheins 30. Aug 2004 14:35

Re: Problem mit mehreren Forms und ShowModal
 
Wo muss das Hin ?

Etwa So?
Delphi-Quellcode:
Form2.ModalResult := mrOk;
Form2.Close;
Wäre imernoch das Problem, das das Form2 erst erscheint, wenn refresh; beendet ist ...

Leuselator 30. Aug 2004 14:37

Re: Problem mit mehreren Forms und ShowModal
 
Statt Close

jfheins 30. Aug 2004 14:48

Re: Problem mit mehreren Forms und ShowModal
 
Liste der Anhänge anzeigen (Anzahl: 1)
Geht immer noch nicht :? :cry:

Aktueller Quelltext im Anhang ... (Funktion: siehe hier)

Luckie 30. Aug 2004 15:14

Re: Problem mit mehreren Forms und ShowModal
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das ganze muss in das OnPaint Ereignis rein:
Delphi-Quellcode:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    ProgressBar1: TProgressBar;
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  bFirstTime: Boolean = True;

implementation

{$R *.dfm}


procedure TForm2.FormPaint(Sender: TObject);
var
  i: Integer;
begin
  Application.ProcessMessages;
  if bFirstTime then
  begin
    bFirstTime := False;
    for I := 0 to 9 do
    begin
      Progressbar1.StepIt;
      Progressbar1.Repaint;
      Sleep(1000);
    end;
  end;
end;

end.
Im Anhang noch mal dein Projekt.

Edit:
Den Rest des Codes habe ich nicht durchgesehen. Aber da läßt sich bestimmt auch noch einiges verbessern.

jfheins 30. Aug 2004 20:10

Re: Problem mit mehreren Forms und ShowModal
 
Ich habe alles hinbekommen, bis auf eines:
Da ich möchte, dass alles automatisch abläuft, geht es, bei einem mit ShowModal geöffneten Formular,
dieses innerhalb von Form2.Activate wieder zu schließen ?

(Mit anderen Worten: Gibt's da einen Trick? Ich würds sonst mit nem Timer machen ...)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz