Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как удалить все компоненты сделанные в Run time


Страницы:   1 2

49 Cent ©   (2006-05-04 12:38:00) 

Суть в том, что делаю на базе timage клоны, которые затем передвигаю по экрану. Необходимо в результате нажатия на кнопку удалить все имеющиеся на форме timage, кроме image1, поскольку это основа для клонирования. Имена клонированным объектам программа не дает, поскольку такой необходимости не было. Как удалить все image кроме image1?

Заранее спасибо!


49 Cent   (2006-05-04 16:02:00) [1]

Всем Вам спасибо и респект!


Elen   (2006-05-04 14:24:00) [2]

Ясно теперь. Да ты прав MBo. Тогда можно работать с массивом (См. выше) или так как ты предложил.


MBo   (2006-05-04 14:20:00) [3]

>Elen ©   (04.05.06 14:12) [18]
>Что ты имеешь ввиду? Элементы удаляются поочереди начиная с нулевого и заканчивая i-тым

1. В списке 3 элемента A, B, C. Цикл запускается for i := 0 to 2
2. Удаляется элемент List[0], т.е. A. Сколько осталось в списке?
3. Удаляется List[1]. Какая буква в нем содержится? Сколько осталось в списке?
4. Попытка удаления List[2] ...


begin...end   (2006-05-04 14:18:00) [4]

> Elen ©   (04.05.06 14:03) [16]

Потому что границы выполнения цикла for определяются только один раз -- перед первым его выполнением.

И если крутить цикл в прямом направлении, удаляя внутри него компоненты, то получим ошибку (собсно, уже получили -- см. [8]), поскольку реальное количество контролов (ControlCount) УМЕНЬШИЛОСЬ, а цикл продолжает крутиться до тех пор, пока значение счётчика не станет равным СТАРОМУ значению ControlCount минус 1.

А если крутить в обратном направлении (от ControlCount - 1 до 0), то выхода за границы списка не будет -- мы удаляем элемент, и на следующем проходе цикла обращаемся к ПРЕДЫДУЩЕМУ элементу, который гарантированно есть в списке. И так до тех пор, пока не дойдём до нулевого.

Правда, непонятно, зачем самому крутить какие-то циклы, в которых определять, КАКИЕ ИМЕННО контролы нужно уничтожать. Поскольку можно завести отдельный список, в который заносить ТОЛЬКО нужные контролы. Что уже и посоветовали -- см. [2].


Elen   (2006-05-04 14:12:00) [5]


> А задумайся, что происходит при удалении из списка при прямом обходе, например, если в списке 3 элемента...


Что ты имеешь ввиду? Элементы удаляются поочереди начиная с нулевого и заканчивая i-тым


MBo   (2006-05-04 14:05:00) [6]

>Elen ©   (04.05.06 14:03) [16]
>я спрашиваю почему DownTo а не To?
А задумайся, что происходит при удалении из списка при прямом обходе, например, если в списке 3 элемента...


Elen   (2006-05-04 14:03:00) [7]


> begin...end

я спрашиваю почему DownTo а не To?


begin...end   (2006-05-04 14:01:00) [8]

> Elen ©   (04.05.06 13:38) [12]

Это зарезервированное слово.


Elen   (2006-05-04 13:59:00) [9]

Ты создаеш в одну переменку кучу объектов. и поэтому удалить можеш только один объект, на который ссылается эта переменка, а остальные остаются вне досягаемости

Ты лучше создай массив вроде
fa:array[1..100] of TRotateImage
или динамический
и при создавай новый объект в новый массив :
Fa[i]:=TRotateimage.Create(Self);
Fa[i].Parent:=Self;

i:=i+1;
i - глобальная переменка количество клонов
и потом


for k:=0 to i do begin
 fa[k].Free;
end;


49 Cent   (2006-05-04 13:44:00) [10]


> for i:=0 to form1.controlcount-2 do begin

Обнаружил странную вещь! Чем больше минусуешь, тем меньше проблем. :) К примеру я наклонировал от 3 до 5 штук, при -2 выскакивает ошибка List index out of bounds (5). Если делаешь for i:=0 to form1.controlcount-5 do begin, то удаляется без проблема. Правда не все, а группами. Т.е чтобы удалить все, нужно нажимать на кнопку много раз. При этом если наклонировать шутк 100, то при - 5 выскакивает ошибка. Глупейшая ситуация, но факт остается фактом. :)

Клонирую так:
Fa:=TRotateimage.Create(Self);
Fa.Parent:=Self;
Fa.Visible:=True;
Fa.Picture.LoadFromFile(s+'.bmp');
Fa.AutoSize:=true;
Fa.OnMouseMove:=rotateimage1.OnMouseMove;
Fa.OnMouseUp:=rotateimage1.OnMouseUp;
Fa.OnMouseDown:=rotateimage1.OnMouseDown;
Fa.OnClick:=rotateimage1.OnClick;
Fa.PopupMenu:=PopupMenu1;
Fa.Transparent:=true;

Может можно проще сделать если удалить все компоненты без имени. Это собственно все наклонированные и есть компоненты?


Elen   (2006-05-04 13:38:00) [11]


> begin...end

Чего это Downto?


begin...end   (2006-05-04 13:28:00) [12]

> 49 Cent   (04.05.06 13:17) [8]

Во-первых, не to, а downto. А во-вторых, не Destroy, а Free.


Elen   (2006-05-04 13:25:00) [13]

49 cent А как ты делаеш клоны? примерчик приведи


Elen   (2006-05-04 13:23:00) [14]

for i:=0 to form1.controlcount-2 do begin
Почему -2 надо либо -1 либо просто
for i:=0 to form1.controlcount do begin
Проверь точнее


49 Cent   (2006-05-04 13:17:00) [15]

for i:=0 to form1.controlcount-2 do begin
if (form1.controls[i] is Trotateimage) then
if Trotateimage(form1.controls[i]).name<>'RotateImage1' then
Trotateimage(form1.controls[i]).Destroy;
end;


Когда накидаю кучу клонов и использую указанный код, то выдает ошибку: List index out of bounds (5)

Работает без ошибок если на форме только 1 клон.


49 Cent   (2006-05-04 13:09:00) [16]

Когда я использую кавычки, компилятор выдает ошибку и пишет, что:
Incomtable types: String and Trotateimage


EvS   (2006-05-04 13:05:00) [17]

Trotateimage(form1.controls[i].name)<>RotateImage1->Trotateimage(form1.controls[i]).name<>'RotateImage1'
Trotateimage(form1.controls[i].name).Destroy->Trotateimage(form1.controls[i]).Destroy;


Elen   (2006-05-04 13:03:00) [18]

Вместо

for i:=0 to form1.controlcount-1 do begin
if (form1.controls[i] is Trotateimage) then
if Trotateimage(form1.controls[i].name)<>RotateImage1 then
Trotateimage(form1.controls[i].name).Destroy;
end;

Перепиши

for i:=0 to form1.controlcount-1 do begin
if (form1.controls[i] is Trotateimage) then
if Trotateimage(form1.controls[i].name)<> 'RotateImage1'then
Trotateimage(form1.controls[i].name).Destroy;
end;


49 Cent   (2006-05-04 12:59:00) [19]

2 ЮЮ
А нельзя ли по подробней? Правильно ли я понимаю, что надо на Form.Create надо делать TObjectList.Create, а затем что-нить типа TObjectList.add()?


49 Cent   (2006-05-04 12:56:00) [20]

Не хочет! У меня не совсем timage, у меня trotateimage, а это тот же image, только с возможностью крутить по оси.

Использую такой код:
for i:=0 to form1.controlcount-1 do begin
if (form1.controls[i] is Trotateimage) then
if Trotateimage(form1.controls[i].name)<>RotateImage1 then
Trotateimage(form1.controls[i].name).Destroy;
end;


Выдает ошибку.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо