Kilka Form

0

Mam kila form: FormMenu oraz FormMenu1, FormMenu2, ... FormMenuX.
(X-nr.formy)
W Project-Options-Forms, FormMenu jest formą ‘Auto-create’ zaś FormMenu1... FormMenuX są ‘Available forms’.
Wywołanie FormMenu1... FormMenuX, następuje poprzez procedurę, która jest umieszczona w FormMenu:

Procedure TworzFormMenu(TNazwaFormy : TComponentClass; NazwaFormy : TForm);
Begin
FormMenu.Enabled := False;
Application.CreateForm(TNazwaFormy, NazwaFormy);
NazwaFormy.Visible :=True;
Repeat
Application.ProcessMessages;
Until(NazwaFormy.Visible=False);
NazwaFormy.Destroy;
FormMenu.Enabled := True;
FormMenu.Show;
End; { koniec procedury }

Na FormMenu1 mam umieszczony tylko jeden komponent ComboBox zwany ListaZakresow.
W FormMenu1 istnieją tylko dwie procedury:

Procedure WpiszListeZakresow;
Var
xx : Integer;
Begin
FormMenu1.ListaZakresow.Clear;
For xx:=0 to 9 Do
Begin
FormMenu1.ListaZakresow.Items.Add(IntToStr(xx));
End;//xx
FormMenu1.ListaZakresow.ItemIndex := 0;
End; { koniec procedury }

procedure TFormMenu1.FormActivate(Sender: TObject);
begin
WpiszListeZakresow;
end;

Kiedy wywołuję TworzFormMenu(TFormMenu1, FormMenu1);
Program mi się zawiesza. To samo dzieje się z innymi FormMenuX, wktórych umieszczone są jakieś komponenty lub w których odwołuję się do funkcji lub procedur w zadeklarowanym UnitProcedury. UnitProcedury nie ma wpływu na problem, gdyż kiedy go nie deklaruję, opisany stan rzeczy nadal ma miejsce.
Generalnie chodzi mi o to, aby w zależności jakie parametry podam w Procedure TworzFormMenu() , otworzyło mi się okno z FormMenuX.
Może przyjąłem złą metodę tworzenia i uaktywniania kolejnych okienek FormMenuX ?
Będę wdzięczny za wyjaśnienia.
Pozdrawiam.

0

NazwaFormy.Visible :=True;
Repeat
Application.ProcessMessages;
Until(NazwaFormy.Visible=False);

Rozumiem, że ten kod nakazuje pokazanie formy i czeka az to zostanie wykonane. No to chyba powinno byc

NazwaFormy.Visible :=True;
while not NazwaFormy.Visible do
Application.ProcessMessages;

albo

NazwaFormy.Visible:=True; //nawiasem mówiąc można NazwaFormy.Show; - krótsze i jaśniejsze dla czytającego
repeat
Application.ProcessMessages;
until NazwaFormy.Visible;

0

NazwaFormy.Visible :=True;
Repeat
Application.ProcessMessages;
Until(NazwaFormy.Visible=False);

Rozumiem, że ten kod nakazuje pokazanie formy i czeka az to zostanie wykonane. No to chyba powinno byc

Taki jest zamiar.
Spróbuję tak ja napisałeś. Dam odpowiedź jutro.
Swoją drogą procedura ta nie powoduje żadnych problemów jeśli wywołuję Formy w sposób "bezpośredni" czyli Application.CreateForm(TFormX, FormX). Problem w tym, że przy np. 20 Formach trzeba pisać 20 takich procedur. Myślałem, że zastąpie to jedną, przekazując tylko parametry formy, którą chcę w danej chwili uaktywnić.
Tym nie mniej, tymczasem dziękuję, mając nadzieję na dalsze pomysły i uwagi.

0

No niestety to nic nie dało.
pg, jeżeli pozwolisz prześlę źródło e-milkiem. Wiem, że nie widząc kodu trudno jest doradzić.
Z góry dziękuję

0

No niestety to nic nie dało.
pg, jeżeli pozwolisz prześlę źródło e-milkiem. Wiem, że nie widząc kodu trudno jest doradzić.
Z góry dziękuję

Następnym razem badź tak miły i zzipuj co wysylasz. Troche poprawilem, ale skontroluj czy wszystko OK, bo ja nie mialem czasu sleczec. Mam nadzieje ze moje doraźne zmiany nie napsuly czegos innego - ale wybacz, nie mam czasu sledzic struktury Twojego calego programu. Tym bardziej ze jest niekompletny...

W UnitMenu1 (tak samo trzeba by w 2)

type
TFormMenu1 = class(TForm)
{...}
private
{ Private declarations }
procedure WpiszListeZakresow;
{...}

uses UnitMenu; //dzieki temu mozna wywolac metody FormMenu

Procedure TFormMenu1.WpiszListeZakresow;
{wstawilem procedure jako metode formularza - niepotrzebny jest wtedy with no i sie nie sypie}
Var
xx : Byte; //lepiej byloby Integer - jest szybszy a pamiec i tak sie zaraz zwolni po skonczeniu procedury
Begin
ListaZakresow.Clear; //TU SIE WYWALALO A TERAZ NIE
For xx:=0 To 9 Do ListaZakresow.Items.Add(IntToStr(xx));
End; { koniec procedury }

procedure TFormMenu1.FormCreate(Sender: TObject);
begin
WpiszListeZakresow; //przenioslem z OnActivate ktore nie jest chyba potrzebne
//Visible := True; niepotrzebne - jest pokazanie w UnitMenu
end;

procedure TFormMenu1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Visible:=False; Po co - jak sie zamyka to sie i schowa
FormMenu.Enabled:=True;
FormMenu.Show;
Release; //wywola Free jak sie zakonczy OnClose
end;

W UnitMenu

Procedure TworzFormMenu(TNazwaFormy : TComponentClass; NazwaFormy : TForm);
Begin
FormMenu.Enabled := False;
Application.CreateForm(TNazwaFormy, NazwaFormy);
NazwaFormy.Show;
// While NazwaFormy.Visible Do
// Application.ProcessMessages;
{Rozumiem, ze ten kod czeka ze zniszczeniem Formy nazwaformy i wlaczeniem
FormMenu do schowania formy NazwaFormy. Wywalilem to bo po co ma chodzic
w pustej petli skoro mozna te rzeczy zrobic w OnClose NazwaFormy }
// NazwaFormy.Destroy; zajrzyj do helpa - nie wywoluje sie destroy - powinno byc Free, ale...
// NazwaFormy.Free; nie trzeba, zrobimy Release w OnClose formy
//FormMenu.Enabled := True; damy tez w OnClose
//FormMenu.Show;
End; { koniec procedury }

A w ogole moze zamiast dawac FormMenu.Enabled :=False a potem True po prostu wywolac NazwaFormy.ShowModal

0

pg, bardzo dziękuję za "poślęczony" czas nad moimi wypocinami. Ponieważ jestem w Polsce, poprawki naniosę za tydzień. Jeszcze raz dziękuję i dam odpowiedź.
Pozdrawiam

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