Raise - okienko wyskakuje pod formą główną - dlaczego?

0

Mam problem z którym nie potrafię sobie poradzić. Mam dwie formy w jednej naciskam button z procedurą "PostMessage" wysyłam komunikat do drugiej formy która to ten komunikat otrzymuje i w procedurze obsługi komunikatu wykonuję taką linię kodu:

raise Exception.Create('Niemożesz dodać produktu którego nie ma na magazynie!');

Za każdym razem okienko wyskakuje pod formą główną co doprowadza do zawieszenia programu. Jeżeli jednak wygeneruje taki wyjątek w buttonie na głównej formie okienko wyświetla się poprawnie.

Jakieś pomysły?

0

Po pierwsze to komunikat ma błędy językowe (języka polskiego) i powinien wyglądać tak:

raise Exception.Create('Nie możesz dodać produktu, którego nie ma w magazynie.');
//                         ^-- odstęp            ^-- przecinek    ^          ^-- nie krzycz
//                                                                `-- tłumaczyć nie trzeba

Za każdym razem okienko wyskakuje pod formą główną co doprowadza do zawieszenia programu. Jeżeli jednak wygeneruje taki wyjątek w buttonie na głównej formie okienko wyświetla się poprawnie.

A ten drugi formularz (nie ten główny) wyświetlany jest modalnie, czy zwyczajnie metodą Show? I dlaczego robisz to poprzez wyjątki, zamiast wyświetlić normalny komunikat z drugiej formy?

0

po pierwsze jak już wspomniał @furious programming to komunikowanie userowi czegokolwiek przez wyjątki to zły pomysł. Po drugie czy przypadkiem okienko, które zasłania komunikat nie ma ustawionego fsStayOnTop?

0

Dziękuję za odpowiedzi. Formę główną mam ustawioną na fsNormal Poniżej kod którym tworzę drugą formę:

//To jest na formie głównej
procedure TfOrder.ect_button_shopClick(Sender: TObject);
begin
  fRaflo.MI_Magazyn.OnClick(fRaflo.MI_Magazyn);
  TfCart.Create(application, False);
end;

//Forma druga
constructor TfCart.Create(AOwner: TComponent; OnlyBooking: Boolean);
begin
  inherited Create(AOwner);
  fCaption := 'Koszyk';

  if not OnlyBooking then
    Exit;

  { Formularz tylko rezerwacji }
  e_Sell.Visible := False;
  e_Booking.Left := e_Sell.Left;
  e_Booking.Tag := BookingAndClose;
  e_Booking.Caption := 'Rezerwuj';

  { Ukrywanie zbędnych elementów }
  sLabel4.Visible := False;
  sLabel5.Visible := False;
  e_TypePay.Visible := False;
  e_TypeBill.Visible := False;
  Self.Height := 327;
  e_More.Enabled := False;

  { Zamiana tekstu caption }
  fCaption := 'Rezerwacja';
end;

Forma druga ma ustawioną właściwość:
Visible = True
FormStyle = fsNormal

Ciekawostka: Forma 2 jest zawsze na wierzchu tak jakby miała fsStayOnTop ale nie ma :). Pisałem już o tym na forum i do dziś problem nie został rozwiązany.

Poniekąd dlatego używam raise do wyświetlenie błędów. Oraz dlatego że jedną linią kodu mam załatwione 2 rzeczy. Informacja o błędzie i przerwanie wykonywania danej procedury bez konieczności używania

IF *** Then Exit

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