Cześć mam pewien problem mianowicie, Chciałbym po otworzeniu nowego formularza zamknąć poprzedni niestety funkcja form2.close; nie wiem dlaczego nie działa, czy jesteście w stanie mi pomóc?
Zamknięcie formularza po pokazaniu innego
- Rejestracja: dni
- Ostatnio: dni
- Postów: 3
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Tuchów
- Postów: 12269
Jesteśmy w stanie pomóc, jeśli podasz konkretne informacje – np. kod, którym pokazujesz ten drugi formularz.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 3
w momencie kiedy pisałem odpowiedź zmieniłem polecenie close na hide i zadziałało jeżeli będę miał jeszcze jakieś problemy napiszę ;)
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Tuchów
- Postów: 12269
Metoda Hide ukrywa formularz, a nie go zamyka. On nadal istnieje w pamięci, nadal posiada jakieś dane wpisane w kontrolkach, więc jeśli postanowisz go znów pokazać (np. za pomocą metody Show), to jego zawartość będzie taka sama jak przed jego ukryciem.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Świecie
A tu masz jak zamknąć program kiedy chcesz zamknąć go innym za pomocą wysyłania komunikatu do innej aplikacji w tym przypadku będzie Form1.Zamknij.Click.
Program, który działa:
private
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
Zmienna globalna // Zamknij
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
sText: array[0..99] of Char;
ms: TMemoryStream;
begin
case Msg.CopyDataStruct.dwData of
begin
StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
Zamknij:= sText;
if Zamknij = '12345_abcde_ABCDE' then Form1.Zamknij.Click; // np. 12345_abcde_ABCD komunikat z innej aplikacji
end;
end;
Aplikacja zamykająca:
procedure TForm1.FormShow(Sender: TObject);
var
MyCopyDataStruct: TCopyDataStruct;
hTargetWnd: HWND;
s : string;
begin
s := '12345_abcde_ABCDE';
with MyCopyDataStruct do
begin
dwData := 0;
cbData := StrLen(PChar(s)) + 1;
lpData := pchar(s);
end;
hTargetWnd := FindWindow('TForm1', nil);
SendCopyData(hTargetWnd, MyCopyDataStruct);
end;
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Świecie
Polecenie Form2.Show, czy ShowModal jak i inne wywoływane w ten sposób oznacza, że po uruchomieniu programu a np. kiedy będziesz miał ich kilka wszystkie są w pamięci nawet jeśli z nich nie korzystasz. Ja wywołuje je dynamicznie na żądanie. Mój program ma ponad 1000 form wyobraź sobie gdyby wszystko załadowało się w pliku Program.dpr? program by odpalał się bardzo długo. W pliku *.dpr mam jedną tylko formę :-)
procedure TForm1.OtworzForme2(Sender: TObject);
begin
TForm2:=TTForm2.Create(Application);
try
TForm2.ShowModal;
finally
TForm2.Free;
end;
end;