Zamknięcie formularza po pokazaniu innego

0

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?

0

Jesteśmy w stanie pomóc, jeśli podasz konkretne informacje – np. kod, którym pokazujesz ten drugi formularz.

0

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ę ;)

1

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.

0

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;
0

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;

1 użytkowników online, w tym zalogowanych: 0, gości: 1