![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление созданных компонентов [D7, XP]
Annn © (2007-02-13 13:51:00)Здраствуйте. Помогите решить мне такою проблемку (немогу корректно
удвлить "выделенные" объекты
)
Var
``````````````````````
I_:array[1..100] of TImage;
il:integer=0;
SelObj:TStringList;
``````````````````````
//Создание списка на удаление
procedure TForm1.FormActivate(Sender: TObject);
begin
SelObj:=TStringList.Create;
end;
//Так создаю компоненты (Массив нужен для обрашения к комнентам)
`````````````````````````
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
il:=il+1;
I_[il]:=TImage.Create(self);
with I_[il] do begin
Parent:=Form1;
Name:='I'+IntToStr(il);
Transparent:=True;
Left:=StrToInt(sl);
Top:=StrToInt(st);
Width:=60;
Height:=40;
Tag:=3;
Picture:=Form3.Image1.Picture;
OnClick:=DelImg.OnClick;
end;
end;
//Это событие присваеваю всем созданным компонентам
// OnClick:=DelImg.OnClick;
`````````````````````````````````````
procedure TForm1.DelImgClick(Sender: TObject);
begin
SelObj.Add((Sender as TImage).Name);
SelObj.Sort;
end;
//Кнопка удаления объектов списка
//Вот сдесь и возникает какая то ошибка
//иногда удаляет и иногда выдают ошибку
`````````````````````````````````````
procedure TForm1.Button3Click(Sender: TObject);
var
del,so : Integer;
begin
for del := Pred(ComponentCount) downto 0 do
if (Components[del] is TImage)and
((Components[del] as TImage).Left>=162)and
((Components[del] as TImage).Top>=58)
then
for so:=0 to SelObj.Count-1 do
if SelObj.Strings[so]=(Components[del] as TImage).Name
then
TImage(Components[del]).Free;
SelObj.Clear;
end;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
SelObj.Clear;
end;
Elen (2007-02-13 15:05:00) [21]
> for i:=0 to Form1.ComponentCount-1 do
> Components[i].Free;
Кстати попробуй вместо этого вот этоwhile Form1.ComponentCount>=1 do form1.Components[Form1.ComponentCount-1].Free;
Elen (2007-02-13 14:56:00) [22]
> А почему при Components[i].Free; не проверяеш его на nil?
Ой не это кажись фигню морожу.
Лучше скажи в какой строке останавливается.?
Elen (2007-02-13 14:55:00) [23]
> дело не в том наверное
> вот такой код выдаёт ту же ошибку
> //form.OnClik
> var
> i:integer;
> begin
> for i:=0 to Form1.ComponentCount-1 do
> Components[i].Free;
> end;
А почему при Components[i].Free; не проверяеш его на nil?
Annn (2007-02-13 14:47:00) [24]дело не в том наверное
вот такой код выдаёт ту же ошибку
//form.OnClik
var
i:integer;
begin
for i:=0 to Form1.ComponentCount-1 do
Components[i].Free;
end;
icWasya (2007-02-13 14:22:00) [25]Скорее всего
SelObj:=TStringList.Create;
SelObj.Duplicates := dupIgnore;//<<<===-----
и по стилю - поскольку Name и Free есть прямо у TComponent, то вот это
for so:=0 to SelObj.Count-1 do
if SelObj.Strings[so]=(Components[del] as TImage).Name
then
TImage(Components[del]).Free;
можно заменить на это
if SelObj.IndexOf(Components[del] .Name) >0
then
Components[del].Free;
Annn (2007-02-13 14:09:00) [26]Progect Progect1.exe raiset exception class ELisrError with message`List index out of bounts(3)`Такая вот ошибка(ну может и не там)
Elen (2007-02-13 13:58:00) [27]
> Annn (13.02.07 13:51)
//Вот сдесь и возникает какая то ошибка
Если не секрет в какой строке?