tworze formy w sposob dynamiczny
array of TForm1 ...
i jak wlaczam inna jakas aplikacje to wyskakuje blad -access violation at adres...in a.exe.....
czy jakos trzeba zabezpieczyc przy dynamicznym tworzeniu pamiec?
tworze formy w sposob dynamiczny
array of TForm1 ...
i jak wlaczam inna jakas aplikacje to wyskakuje blad -access violation at adres...in a.exe.....
czy jakos trzeba zabezpieczyc przy dynamicznym tworzeniu pamiec?
...kiedys korzystalem z funkcji to chyba byla "AllocMem()".
a jak ja wykorzystac w odniesieniu do tworzonych form (ktorych moze byc x wielkrotnosci) ?
czy to sie tak robi ? :
forms:=AllocMem(11111)
ale teraz nie wiem jaki zromiar dac :|
bedize maxymalnie 15 okien ...
Najpierw ustalasz długość tablicy Form (jest to tablica wskażników do obiektów):
SetLength(forms,dlugosc);
Potem musisz każdą formę utworzyć, zanim jej użyjesz (logiczne chyba :) ) (mysle, że stąd się mógł brać twój błąd:
for i:=Low(forms) to High(forms) do
begin
forms[i]:=TForm1.Create(nil {albo forma glowna});
forms[i].Caption:='blebleble'; //itp
end;
Jeśli tworzysz formy dynamicznie, nie zapomij zwalniać pamięci. Najlepiej w OnClose każdej dynamicznej formy ustawić action:=caFree;.
to jest ten kod ( u mnei na kompie akurat jest dobrze ale u kumpla , gdy otwirac cos innego to jest ten blad)
procedure stworzforme(l:integer);
begin
SetLength(Forms,l+1);
Forms[l] := TForm1.Create(Application);
with forms[l] do begin
top:=random(100);
left:=random(100);
Caption := 'Okno wykresu ['+inttostr(l)+']';
FormStyle := fsMDIChild;
Show;
Visible:=true;
end;end;
Widocznie gdzies wywołujesz swoją procedurę w ten sposób:
{..}
stworzforme(4);
{..}
stworzforme(2); // powoduje zmniejszenie rozmiaru tablicy z 5 do 3
{..}
Forms[4] // odowłujesz się do elementu ktory nie istnieje
Proponuję:
If Length(Forms)<(L+1) Then SetLength(Forms,l+1);