Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Automatisches Schließen von Form2 ...
cb_katze - Do 08.08.02 15:50
Titel: Automatisches Schließen von Form2 ...
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 !
Tino - 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 - 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 !
Renegade - 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 :D .
cb_katze - 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 !
Cashels - 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 - 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 (
http://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 !
XPert - So 01.09.02 14:44
du darfst
nicht verwenden, da das fenster bei einem solchen aufruf mit benutzereingabe gemacht werden muss! wie wärs, wenn du eine benutzereingabe simulierst?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!