[Delphi] Blad przy operacji na 'macierzystej' formie

0

Pomozcie, pewnie jest jakis prosty blad ale nie moge sobie poradzic

Dlaczego wywala Access violation w linijkach 1: 2: itd?

FormSession wywoluje FormSelect jako modal, uprzednio ustawiwszy wlasciwosc SenderTag FormSelect na 1..6 w zaleznosci od kontekstu wywolania.

kiedy uzytkownik wykonuje operacje w FormSelect, wywolywana jest ponizsza procedura ktora uaktualnia LabelNumber na FormSelect, oraz, w zaleznosci od SenderTag, odpowiedni LabelNumberXXX na FormSession. No i proba ukatualnienia LabelNumberXXX powoduje Access violation.

procedure TFormSelect.NumberUpdate;
begin
LabelNumber.Caption:=IntToStr(ListBoxSelect.SelCount)+'/'+
IntToStr(ListBoxSelect.Items.Count);
case SenderTag of
1: FormSession.LabelNumberCond.Caption:=LabelNumber.Caption;
2: FormSession.LabelNumberTrial.Caption:=LabelNumber.Caption;
3: FormSession.LabelNumberBlock.Caption:=LabelNumber.Caption;
4: FormSession.LabelNumberRepeat.Caption:=LabelNumber.Caption;
5: FormSession.LabelNumberResponse.Caption:=LabelNumber.Caption;
6: FormSession.LabelNumberOutcome.Caption:=LabelNumber.Caption;
end;
end;

PS. Nie wiem, czy to ma znaczenie, ale FormSession jest MDIChild--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Ciężko mi coś powidzieć, mając tylko fragment kodu, ale sprawdź samo odwołanie do FormSession. Np.:
FomSession.Caption := LabelNumber.Caption;

Prawdopodobnie któryś z obiektów jest w tej chwili niedostępny. Możesz postawić BreakPoint przed case i potem krok po kroku przechodzić dalej, sprawdzając które elementy istnieją, a które nie (Inaccess value).--Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

Pomoc do Delphi po polsku. http://www.4programmers.net/forum/index.php?action=show&id=21335&c=2

Oficjalny kanał IRC serwisu 4programers:
serwer: warszawa.ircnet.pl sieć: POLNet kanał: #4programmers.net

0

Dzieki, Dryobates {brawo} {brawo} , naprowadziles mnie na rozwiazanie.

Okazuje sie, ze mialo znaczenie, ze FormSession jest MDIChild. W takim programie FormSession=nil. To ma sens, bo w koncu skad program ma wiedziec, do ktorego FormSession (moze ich byc przeciez kilka) ma sie odniesc?? Wiec trzeba sie odwolywac z glownej formy przez MDIChildren. No ale moglem nie wiedziec, bo to moja pierwsza aplikacja MDI...

Tak dziala:

procedure TFormSelect.NumberUpdate;
begin
LabelNumber.Caption:=IntToStr(ListBoxSelect.SelCount)+'/'+
IntToStr(ListBoxSelect.Items.Count);
case SenderTag of
1: (FormMain.MDIChildren[0] as TFormSession).LabelNumberCond.
Caption:=LabelNumber.Caption;
2: (FormMain.MDIChildren[0] as TFormSession).LabelNumberTrial.
Caption:=LabelNumber.Caption;
3: (FormMain.MDIChildren[0] as TFormSession).LabelNumberBlock.
Caption:=LabelNumber.Caption;
4: (FormMain.MDIChildren[0] as TFormSession).LabelNumberRepeat.
Caption:=LabelNumber.Caption;
5: (FormMain.MDIChildren[0] as TFormSession).LabelNumberResponse.
Caption:=LabelNumber.Caption;
6: (FormMain.MDIChildren[0] as TFormSession).LabelNumberOutcome.
Caption:=LabelNumber.Caption;
end;
end;

--
Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

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