Show nie pokazuje formy

0

Po kliknięciu z menu "Nowy" powinny zerować się zmienne i czyścić pola Edit formularza. Z powodu używania na tych polach funkcji StrToInt nie mogę kazać mu tam wpisać spacji przy wyborze "Nowy". Zdecydowałem się na zniszczenie i stworzenie formy:

 
procedure TForm_Wej.Nowy1Click(Sender: TObject);
  begin
    MessageBox(Handle,'Czy chcesz wyczyścić wszystkie dane?',
        'Nowe obliczenia',MB_OKCANCEL + MB_IconExclamation);
    Form_Wej.Free;
    Form_Wej.FormCreate(self);
    Form_Wej.Show;
  end;

Dodatkowo Form_wej ma na ONcreate wykonać:

 
procedure TForm_Wej.FormCreate(Sender: TObject);
begin
         //Dane
    Fip:=0;       fik:=0 ;      dfi:=0;
    thetap:=0;    thetak:=0 ;   dTheta:=0;
    v:=0;         h:=0;         zeta:=0;
    pt:=0;        ls:=0;
    PRF:=0;       tau:=0;
    lambda:=0;    G0:=0;
         //Zmienne
    Nd:=0;        Nr:=0;        Rmax:=0;
    //Tablice 1 -wym
    SetLength (fd,0);         // Definicja wymiaru tablicy
    SetLength (R,0);            SetLength (DELTAR,0);
    SetLength (Ga,0);           SetLength (Ge,0);
    SetLength (sinusFig,0);     SetLength (fig,0);
    SetLength (d0,0);           SetLength (MdC,0);
     //Tablice 2-wym
    SetLength (G, 0, 0);
    SetLength (LdC,0, 0);       SetLength (dA, 0, 0);
    SetLength (dC, 0, 0);
   end;

Problem polega na tym, że Form_Wej.Show nie pokazuje formy, a .ShowModal powoduje błąd stackOverflow lub
Project MGR.exe raised exception class EAccessViolation with message 'Access violation at address 004AC213 in module 'MGR.exe'. Read of address 00000010'.

0

a nie powinieneś użyć jeszcze zmiennej dla formy?
var
NF:TForm_Wej;
begin
NF:=Form_Wej.FormCreate(self);
NF.Show;

czy jakoś tak to było...

0

Co Ty człowieku robisz? Zrób to porządnie. Co masz i co chcesz zrobić?

0
MessageBox(Handle,'Czy chcesz wyczyścić wszystkie dane?',
        'Nowe obliczenia',MB_OKCANCEL + MB_IconExclamation); //czy kliknie OK czy anuluj to i tak jeden huj
    Form_Wej.Free;
    Form_Wej := TForm_Wej.FormCreate(self);
    Form_Wej.Show;
0

Próby z nową zmienną powodują Overflow. Co do wypowiedzi Juhasa to przydałoby się rozwinięcie "porządnie". A ten kawałek kodu ma za zadanie zniszczyć i stworzyć na nowo mój główny formularz, co spowoduje wyczyszczenie wszystkich pól i wyzerowanie zmiennych.

0

Ad Misiekd:

Myślałem że to okienko ma już zaprogramowane aby na Ok przechodzić dalej a na cancel ominąć resztę instrukcji w danej procedurze.

0

a niby gdzie?? Trzeba zrobić

if MessageBox(...) = mrOK then
begin
  //twój kod
end;
0

Myślałem że to okienko ma już zaprogramowane aby na Ok przechodzić dalej a na cancel ominąć resztę instrukcji w danej procedurze.

Tak jasne, a jak się wyświetla exception to się sam poprawia bo po naciśnięciu Ok działa dobrze :>

Form_Wej.Free;
Form_Wej.FormCreate(self);

Czytałeś o tym jak się tworzy klasy? Przyda ci się to przeczytać (jeszcze raz?), bo tutaj jest ogromny byk.

0

Form_Wej:=TForm_Wej.Create(self); -> powoduje overflow
Form_Wej:=TForm_Wej.Create; -> brak argumentu

Może problemem jest to, że procedura

procedure TForm_Wej.Nowy1Click(Sender: TObject);
 

jest zawarta w klasie TForm_Wej i próbuje jeszcze raz ją stworzyć ?

A najlepsze że kod tworzący inny formularz w postaci:

  Form_Wyk:= TForm_Wyk.Create(self);
  Form_Wyk.showmodal;
 

działa bez problemu

0
Pegii napisał(a)

Z powodu używania na tych polach funkcji StrToInt nie mogę kazać mu tam wpisać spacji przy wyborze "Nowy".

Nie rozumiem... Wolisz niszczyć formularz i tworzyć go od nowa dokładając sobie w ch*j roboty, zamiast wyczyścić po ludzku pola i zostawić go w spokoju...? Co ma do tego funkcja StrToInt?! Przecież można wykonać sprawdzanie zanim użyje się tej funkcji czy użytkownik w ogóle wpisał poprawną liczbę i jeśli nie - wyświetlić informację żeby ją wpisał; Po co tyle kombinowania, jak można także użyć TryStrToInt; Dokładasz sobie masę roboty, zamiast pomyśleć logicznie; Masz co najmniej kilka wyjść (podam Ci trzy na zachętę):

  1. sprawdzać pola czy są poprawne dane i jeśli nie - pokazać informację,
  2. przy kliknięciu na Nowy zamiast wstawiać znak spacji - wstaw 0,
  3. wymienić kontrolki, które mają przechowywać liczby na takie, które do tego służą - np. TSpinEdit;
    i zostaw w spokoju formularz! A co jeśli dojdzie Ci więcej ustawień formularza? Wiesz ile będziesz miał ustawiania na nowo? Niby można to napisać w jednej procedurze, ale po co? W ten sposób myśląc równie dobrze możesz wykonać reboot'a aplikacji...

Jeżeli chodzi o samą składnię - obiekty tworzy się z operatorem przypisania, także formularze (to też obiekty...):

Obiekt := TKlasa.Create({ewentualne parametry});

dodaj w zdarzeniu OnClose nowego formularza te dwie linie:

Action := caFree;
NazwaFormularza := nil;

Poza tym sprawdź, czy formularz nie jest tworzony automatycznie podczas uruchamiania aplikacji (główny plik projektu (*.dpr) lub Shift+Ctrl+F11 i zakładka Forms) - w przypadku DB7; Jeżeli jest tworzony automatycznie to AV dostaniesz podczas próby utworzenia obiektu, który już jest stworzony;

Pegii napisał(a)

A ten kawałek kodu ma za zadanie zniszczyć i stworzyć na nowo mój główny formularz, co spowoduje wyczyszczenie wszystkich pól i wyzerowanie zmiennych.

Nic z tego, to nie takie proste; Jeżeli aplikacja sama tworzy formularz to musisz uważać na to, co piszesz;


Poza tym nie ma sensu o tym pisać, wyczyść pola normalnie i zostaw w spokoju formularz;

0

Użycie spinedit rozwiązało wszystkie problemy.
Furious miał racje formy są tworzone przez Aplication.create.
Dziękuję za pomoc.

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