Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2009, 12:52   #1
SibBear
Пользователь
 
Регистрация: 11.05.2008
Сообщений: 62
Счастье

Т.к. один вопрос одна тема:

Есть некое подобие многостраничного InternetExplorer'a
Вкладки создаются динамически и записываются в массив как TabSheet[i]
Внутри каждой вкладки создается WebBrowser так же записывается как WebBrowser[i]

В процессе выполнения нужно удалить вкладку
Код на удаление:
Код:
procedure TMainForm.N1Click(Sender: TObject);
var Last,i,j: integer;
begin

   // удаляем WebBrowser из массива
   Last:=Length(WebBrowser)-1;
   i:=PageControl1.ActivePageIndex;

   if i<Last then
       for j:=i to Last-1 do
         begin
           stValueArr[j]:=stValueArr[j+1];
           TabSheet[j].Caption:=TabSheet[j+1].Caption;
           TabSheet[j]:=TabSheet[j+1];
           WebBrowser[j]:=WebBrowser[j+1];
         end;
   
  WebBrowser[Last].Destroy;
  TabSheet[Last].Destroy;
   
   setLength(stValueArr,Last);
   setLength(TabSheet,Last);
   setLength(WebBrowser,Last);

end;
Проблема:

Если во время удаления какаято вкладка загружалась, то вылетает ошибка, т.е. как я понимаю программа пытается загрузить страницу в уже удаленный (или передвинутый) элемент массива WebBrowser[i]
Заблокировать выполнение программы до полной загрузки всех страниц не получается, да и нерационально, т.к. можно подвесить программу на долго.
Проблема 2: Если я уже удалял вкладку 4(к примеру), а потом создал еще 10 вкладок, то удаляя снова 4ю получаю ошибку.

Посоветуйте как удалить красиво вкладку без тормозов и ошибок?

У меня PAgeControl.

Последний раз редактировалось Stilet; 17.03.2009 в 13:14.
SibBear вне форума Ответить с цитированием
Старый 17.03.2009, 13:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну при удалении останавливай ВебБраузер и делайему а потом и вкладке free.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.03.2009, 13:28   #3
SibBear
Пользователь
 
Регистрация: 11.05.2008
Сообщений: 62
По умолчанию

Не все так просто, Остановить удаляемый (i) браузер можно, а вот если следующий (i+1) браузер не загрузился до конца, то вылетает ошибка, т.к. получается путаница в массиве и программа не знает что куда грузить (догружать).
SibBear вне форума Ответить с цитированием
Старый 17.03.2009, 14:10   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
.к. получается путаница в массиве и программа не знает что куда грузить (догружать).
Дык, обьясни ей. Как грузиш то?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.03.2009, 15:08   #5
SibBear
Пользователь
 
Регистрация: 11.05.2008
Сообщений: 62
По умолчанию

Наверху же код удаления написан. По существу ответы будут?
SibBear вне форума Ответить с цитированием
Старый 17.03.2009, 15:48   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Во-первых: Destroy замени на Free.
Во-вторых: Еще раз повторяю - Останавливай перед удалением.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.03.2009, 16:26   #7
SibBear
Пользователь
 
Регистрация: 11.05.2008
Сообщений: 62
По умолчанию

Я это уже пробовал. Останавливать все вкладки я не могу, остановка удаляемой не помогает. Destroy/Free эффект одинаковый - ошибка 000000000
Проблема похоже с самими массивами, но я не могу понять как все исправить.
SibBear вне форума Ответить с цитированием
Старый 17.03.2009, 16:42   #8
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Может для начала попробовать удалять браузер с активной вкладки?
Код:
procedure TMainForm.N1Click(Sender: TObject);
var Last,i,j: integer;
begin

   // удаляем WebBrowser из массива
   Last:=Length(WebBrowser)-1;
   i:=PageControl1.ActivePageIndex;

  WebBrowser[i].Free;
  TabSheet[i].Free;

   if i<Last then
       for j:=i to Last-1 do
         begin
           stValueArr[j]:=stValueArr[j+1];
           // TabSheet[j].Caption:=TabSheet[j+1].Caption;
           TabSheet[j]:=TabSheet[j+1];
           WebBrowser[j]:=WebBrowser[j+1];
         end;
   
   
   setLength(stValueArr,Last);
   setLength(TabSheet,Last);
   setLength(WebBrowser,Last);

end;
s.Creator вне форума Ответить с цитированием
Старый 17.03.2009, 17:40   #9
SibBear
Пользователь
 
Регистрация: 11.05.2008
Сообщений: 62
По умолчанию

Последовательность следующая:

Браузер(1):= Браузер(2)
Вкладка(1):=Вкладка(2)
Браузер(2):= Браузер(3)
Вкладка(2):=Вкладка(3)

Браузер(3) стоп
Браузер(3) удаляем
Вкладка(3) удаляем

Если в это время Браузер(2) не загрузился до конца, то ошибка.

Вобщем я скланяюсь к тому, что задача удалить элемент из середины динамического массива не влияя на работу остальныех элементов... Т.е. удалил 2й, а 1й и 3й в это время делают то что делали. Но не понятно как это сделать.

P.S. Зачем Вы закоментировали строку изменения названия вкладки так и не понял.
SibBear вне форума Ответить с цитированием
Старый 17.03.2009, 17:42   #10
SibBear
Пользователь
 
Регистрация: 11.05.2008
Сообщений: 62
По умолчанию

Что означает результат
WebBrowser=(D1:0;D2:0;D3:0;D4: (0,0,0,0,0,0,0,0)) ?

Это мне показала программа при наведении курсора на строку при ошибке.
SibBear вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
необходимо засечь время выполнения части алгоритма Lord Lex Win Api 12 03.03.2009 21:36
определить время выполнения процедуры? Bezdar Microsoft Office Excel 4 20.01.2009 13:57
Как узнать время работы программы в паскаль? bullvinkle Помощь студентам 2 26.12.2008 11:20
Цикл, время выполнения шага KiDoki Общие вопросы Delphi 9 19.12.2008 22:37
Как замерить время выполнения программы Gracel Общие вопросы Delphi 5 12.06.2007 22:16