Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.21;
Скачать: CL | DM;

Вниз

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

 
49 Cent   (2006-05-04 12:38) [0]

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

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


 
Elen ©   (2006-05-04 12:48) [1]

Попробуй

for i:=0 to form1.controlcount-1 do begin
if (form1.controls[i] is Timage) then
 if (Timage(form1.controls[i].name<>"Image1") then Удаляем обьект
end;


 
ЮЮ ©   (2006-05-04 12:54) [2]

Созданные объекты хранить в TObjectList.Create(true);

Затем достаточно Clear


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

Не хочет! У меня не совсем 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;


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


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

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


 
Elen ©   (2006-05-04 13:03) [5]

Вместо

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;


 
EvS ©   (2006-05-04 13:05) [6]

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


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

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


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

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 клон.


 
Elen ©   (2006-05-04 13:23) [9]

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


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

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


 
begin...end ©   (2006-05-04 13:28) [11]

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

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


 
Elen ©   (2006-05-04 13:38) [12]


> begin...end

Чего это Downto?


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


> 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:59) [14]

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

Ты лучше создай массив вроде
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;


 
begin...end ©   (2006-05-04 14:01) [15]

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

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


 
Elen ©   (2006-05-04 14:03) [16]


> begin...end

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


 
MBo ©   (2006-05-04 14:05) [17]

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


 
Elen ©   (2006-05-04 14:12) [18]


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


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


 
begin...end ©   (2006-05-04 14:18) [19]

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

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

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

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

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


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

>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] ...


 
Elen ©   (2006-05-04 14:24) [21]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.05.21;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.028 c
2-1147003224
Интересующийся
2006-05-07 16:00
2006.05.21
Delphi и 64-бита


2-1146741859
wirg
2006-05-04 15:24
2006.05.21
Вопрос про treeview


15-1145616875
Deka
2006-04-21 14:54
2006.05.21
IDE Delphi перестала тормозить!


15-1146064395
gogi
2006-04-26 19:13
2006.05.21
Распространение исходников по лицензии


8-1135172186
ZbarKiy
2005-12-21 16:36
2006.05.21
Как преобразовать TBitmap?