Autor Beitrag
cb_katze
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 08.08.02 15:50 
Hi...
... nach tagelanger Suche seid Ihr meine letzte Hoffnung :cry:
Problem: Von Form1 aus wird über einen Button ein Form2 (per ShowModal) angezeigt und soll sich nach einer in TForm2.FormActivate hinterlegten Routine (entpacken einer Datei mit Anzeige eines ProgressBar) automatisch wieder schliesen (also ohne Nutzereingabe), wenn die Routine abgearbeitet ist. Leider geht dies nicht mit "Close" !
Hinweis: Bitte keine Tipps mit dynamischer Erzeugung (und Destroy) von Form2 !

_________________
n.i.p.
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 08.08.02 16:00 
Also bislang habe ich meine Forms unter anderem auch mit Close geschlossen. Sollte eingentlich auch funktionieren. Poste doch mal ein bissel Code. Vielleicht kann man Dir dann besser helfen!

Gruß
TINO
cb_katze Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 08.08.02 16:17 
Titel: ... hier ein Beispiel-Code ...
Formular Form1 enthält einen Button und dazu die ClickRoutine zum Anzeigen von Form2:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit2;
type TForm1 = class(TForm)
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
     private { Private-Deklarationen }
     public  { Public-Deklarationen }
     end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2.ShowModal;
end;
end.


Formular Form2 enthält die abzuarbeitende Routine (hier nur eine längere Schleife) und die Close-Prozedure, die beide in Form2.FormActivate aufgerufen werden:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TForm2 = class(TForm)
     procedure FormActivate(Sender: TObject);
     private { Private-Deklarationen }
     public  { Public-Deklarationen }
     end;
var  Form2: TForm2;
implementation
{$R *.dfm}
procedure runUnzip;
var idx :longint;
begin  for idx:=1 to 1000000 do ; end;
procedure TForm2.FormActivate(Sender: TObject);
begin
     runUnzip; Close;
end;
end.


Ergebnis: Form2 wird nicht geschlossen !

_________________
n.i.p.
Renegade
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 358

Win XP Pro, Win 7 Beta
BDS 2006
BeitragVerfasst: Do 08.08.02 16:23 
Moin erstmal!

Da du das Form mit ShowModal öffnest versuche es mal mit folgenem Code statt close:

ausblenden Quelltext
1:
Form2.ModalResult:=mrOk;					


Ich hoffe das hilft :D .

_________________
Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
cb_katze Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 09.08.02 08:28 
Titel: ... hilft nicht wirklich ...
... hatte ich leider auch schon versucht (auch mit mrCancel) ! Wenn ich statt ShowModal nur Show (und Update) versuche und dann Close verwende, kommt es zu einer Fehlermeldung "... Eigenschaft Visible kann in OnShow oder OnHide nicht verändert werden.". :cry:

Das Problem liegt meiner Meinung nach darin, dass das Form im OnActivate-Ereignis nicht geschlossen werden kann ! Vermutlich muss dieses Ereignis überschrieben (override) werden - nur weiss ich leider nicht, wie ! :?:

TROTZDEM DANKE FÜR DEN NETTEN VERSUCH !

_________________
n.i.p.
Cashels
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: Fr 09.08.02 09:00 
Hi,

genau das Problem hatte ich auch schon, und wusste mir echt nur über einen Umweg zu helfen. Und zwar hab ich auf Form2 ein Timer eingerichtet, der in regelmässigen Abständen misst, ob alle Rechnungen fertig sind, und falls ja im Timer Event die Form schliesst. Da klappts dann. Ich würd aber anschliessend in Form1 nach dem Anzeigen ein Form2.free setzen, um die TimerEreignisse zu unterdrücken.

Gruss,
Tom
cb_katze Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 09.08.02 12:56 
Titel: ... endlich eine Lösung !
DANKE CASHELS - aber endlich hat sich meine Suche gelohnt ! Ich habe doch noch eine Lösung gefunden - Dank der CompLib "R&A Library 2.01 (ralib.hotbox.ru)" :D :D :D

Für diejenigen, die Interesse an der Lösung haben, hier der Code von Form2 (Änderung ROT hervorgehoben):
Zitat:

unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TForm2 = class(TForm)
procedure FormActivate(Sender: TObject);
private { Private-Deklarationen }
procedure WMUser1(var Message : TMessage); message wm_User+1;
public { Public-Deklarationen }
end;
var Form2: TForm2;
implementation
{$R *.dfm}

procedure TForm2.WMUser1(var Message : TMessage);
begin
Application.ProcessMessages;
ModalResult := mrOk;
end;

procedure runUnzip;
var idx :longint;
begin for idx:=1 to 1000000 do ; end;
procedure TForm2.FormActivate(Sender: TObject);
begin
runUnzip;
PostMessage(Form2.Handle, wm_User + 1, 0, 0);
end;
end.


Allen Beteiligten meinen Dank !

_________________
n.i.p.
XPert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 129

Windows 98/00/Me/XP
D6 Pers
BeitragVerfasst: So 01.09.02 14:44 
du darfst
ausblenden Quelltext
1:
ShowModal					

nicht verwenden, da das fenster bei einem solchen aufruf mit benutzereingabe gemacht werden muss! wie wärs, wenn du eine benutzereingabe simulierst?

_________________
MfG Fabian Schweers :lol: