Autor |
Beitrag |
cb_katze
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 08.08.02 15:50
Hi...
... nach tagelanger Suche seid Ihr meine letzte Hoffnung
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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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:
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:
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
      
Beiträge: 358
Win XP Pro, Win 7 Beta
BDS 2006
|
Verfasst: Do 08.08.02 16:23
Moin erstmal!
Da du das Form mit ShowModal öffnest versuche es mal mit folgenem Code statt close:
Quelltext 1:
| Form2.ModalResult:=mrOk; |
Ich hoffe das hilft  .
_________________ Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
|
|
cb_katze 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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.".
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
      
Beiträge: 167
|
Verfasst: 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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)"
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
      
Beiträge: 129
Windows 98/00/Me/XP
D6 Pers
|
Verfasst: So 01.09.02 14:44
du darfst
Quelltext
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
|
|
|