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?
Jesteśmy w stanie pomóc, jeśli podasz konkretne informacje – np. kod, którym pokazujesz ten drugi formularz.
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ę ;)
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.
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;
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;