|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Ошибки при работе с динамическими объектами
Всех приветствую. Только учусь работать с динамическими объектами, объясню суть вкратце: необходимо реализовать отрисовку на ScrollBox компонентов Panel,на которых будет помещён компонент WebBrowser. Создал процедуру,которая это делает,однако она зависит от количества,которое нужно создать. Если количество маленькое,например, 7 он может создать,но при закрытии приложения выводится ошибка: "Прекращена работа приложения" и ошибки. Но,например,с 20 работает и закрывается всё идеально.Прошу помощи доработать или указать на недостатки.
Код:
.. { Private declarations } public //массив компонентов webbrowser web: array of TWebBrowser; //массив компонентов Panel panel:array of Tpanel; //общее количество,которое нужно создать const allcount=14; //количество объектов,которое поместится в строке в зависимости от размеров экрана var count:integer; //отступ сверху toppos:integer; //параметры объектов const widthweb=200; const heightweb=100; const interval=30; .. procedure TForm1.WebCreate(); var i,j,a,z,count:integer; begin showmessage(inttostr(allcount)); Form1.ScrollBox1.Width:=screen.Width; Form1.ScrollBox1.Height:=screen.Height-Scrollbox1.Top; Form1.toppos:=20; showmessage(inttostr(Screen.Width)); //расчет штук в строке count:=Floor(Screen.Width/(Form1.widthweb+Form1.interval)); showmessage(inttostr(count)); //расчёт сколько строк нужно нарисовать a:=floor(allcount/count); //задание размеров массивов SetLength(Form1.web,Form1.allcount-1); SetLength(Form1.panel,Form1.allcount-1); for j := 0 to a do begin for i :=j*count to ((j*count)+count-1) do begin Form1.panel[i]:=TPanel.Create(self); Form1.panel[i].Parent:=Form1.scrollbox1; Form1.web[i]:=TWebBrowser.Create(Form1.panel[i]); TWinControl(Form1.web[i]).Parent := Form1.panel[i]; if i=j*count then begin Form1.panel[i].Left:=74 ; end else begin Form1.panel[i].Left:=Form1.panel[i-1].Left+Form1.widthweb+Form1.interval; end; Form1.panel[i].Top:=Form1.toppos; Form1.web[i].Left:=0; Form1.web[i].Top:=0; //Form1.web[i].Navigate('google.com'); Form1.web[i].Silent:=true; Form1.panel[i].Width:=Form1.widthweb; Form1.web[i].Width:=Form1.widthweb; Form1.panel[i].Height:=Form1.heightweb; Form1.web[i].Height:=Form1.heightweb; //уборка лишних компонентов if i>Form1.allcount-1 then begin Form1.web[i].Free; Form1.panel[i].free; end; end; Form1.toppos:=Form1.toppos+Form1.heightweb+Form1.interval; end; end; |
#2
|
||||
|
||||
Вы устанавливаете размер массива в точное значение, а создаете компоненты "до усеру" в цикле, а потом пытаетесь удалить лишние. А куда эти лишние создались?
Переделайте цикл так, чтоб лишние компоненты не создавались. Например, сделайте проверку на количество до создания и при необходимости прерывайте цикл командой break. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#3
|
|||
|
|||
Я бы сказал по друому.
Там промашка с размерами массива и циклом создания точно есть. А вообще, ссылки на созданные компоненты кроме как для уничтожения таковых нужны? Может им просто Owner'а указать и пусть уничтожением занимается форма когда сама будет уничтожена? Это во первых. А во вторых, даже если ссылки нужны. Ты создаешь таблицу компонентов NxM, так почему бы и массив не объявить двухмерный и не заниматься ерундой? Ну и так, как вишенка на торте. В процедуре setLength указваается КОЛ-ВО элементов, а не индекс последнего. Индексация динамических массивов всегда начинается с 0. Т.е. если тебе надо создать массив из 20 элементов, то и в SetLength надо передавать 20, а индексы у них будут от 0 до 19. |