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

Вниз

Удаление созданных компонентов   Найти похожие ветки 

 
Annn   (2007-02-13 13:51) [0]

Здраствуйте. Помогите решить мне такою проблемку (немогу корректно
удвлить "выделенные" объекты
)

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 13:58) [1]


> Annn   (13.02.07 13:51)
//Вот сдесь и возникает какая то ошибка

Если не секрет в какой строке?


 
Annn   (2007-02-13 14:09) [2]

Progect Progect1.exe raiset exception class ELisrError with message`List index out of bounts(3)`Такая вот ошибка(ну может и не там)


 
icWasya ©   (2007-02-13 14:22) [3]

Скорее всего
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:47) [4]

дело не в том наверное
вот такой код выдаёт ту же ошибку
//form.OnClik
var
i:integer;
begin
for i:=0 to Form1.ComponentCount-1 do
Components[i].Free;
end;


 
Elen ©   (2007-02-13 14:55) [5]


> дело не в том наверное
> вот такой код выдаёт ту же ошибку
> //form.OnClik
> var
> i:integer;
> begin
> for i:=0 to Form1.ComponentCount-1 do
> Components[i].Free;
> end;

А почему при Components[i].Free; не проверяеш его на nil?


 
Elen ©   (2007-02-13 14:56) [6]


> А почему при Components[i].Free; не проверяеш его на nil?

Ой не это кажись фигню морожу.
Лучше скажи в какой строке останавливается.?


 
Elen ©   (2007-02-13 15:05) [7]


> for i:=0 to Form1.ComponentCount-1 do
> Components[i].Free;

Кстати попробуй вместо этого вот это while Form1.ComponentCount>=1 do  form1.Components[Form1.ComponentCount-1].Free;


 
evvcom ©   (2007-02-13 15:21) [8]

> [7] Elen ©   (13.02.07 15:05)

И Form1 убирайте на фик! Это ж делается в обработчике этой самой Form1?

> [0] Annn   (13.02.07 13:51)
> //Вот сдесь и возникает какая то ошибка
> for del := Pred(ComponentCount) downto 0 do
> for so:=0 to SelObj.Count-1 do
> TImage(Components[del]).Free;

Ты здесь делаешь 2 цикла. Зачем? Уничтожаешь объект и продолжаешь "его" сравнивать. Можно в StringList добавлять объект не через Add, а через AddObject, тогда у тебя будет кроме текста, еще и ссылка на сам объект. Далее цикл только по SelObj, и без каких-либо сравнений/проверок Free объекту.


 
Elen ©   (2007-02-13 15:25) [9]


> И Form1 убирайте на фик! Это ж делается в обработчике этой
> самой Form1?

Ну и что?


 
Leonid Troyanovsky ©   (2007-02-13 19:47) [10]


> Elen ©   (13.02.07 15:25) [9]

> > И Form1 убирайте на фик! Это ж делается в обработчике

> Ну и что?

Убирать, в любом случае, надо.
Бо, плохой стиль, в лучшем случае.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-02-13 19:51) [11]


> Elen ©   (13.02.07 15:05) [7]

> Кстати попробуй вместо этого вот это while Form1.ComponentCount>=1

for i:= ComponentCount-1 downto 0

--
Regards, LVT.


 
Annn   (2007-02-13 21:19) [12]

Всёравно не пойму С While вроде работает но нужно ведь для сравнения
ещё один цикл для прогона по Листу удаления для сравнения


 
Annn   (2007-02-13 21:20) [13]

И тогда опять ошибка


 
Annn   (2007-02-13 21:21) [14]

И тогда опять ошибка


 
Annn   (2007-02-13 21:21) [15]

И тогда опять ошибка


 
Плохиш ©   (2007-02-13 22:12) [16]


> Elen ©   (13.02.07 15:25) [9]
>
> > И Form1 убирайте на фик! Это ж делается в обработчике
> этой
> > самой Form1?
>
> Ну и что?

Куда тебе нужно будет отправить твой код, если будет создано больше одного экземпляра TForm1?

> Annn   (13.02.07 21:20) [13]
> И тогда опять ошибка

Честно скажу, я рад за тебя.


 
Annn   (2007-02-14 02:17) [17]

А куда его можно отправить? А почему ты рад за меня.


 
Elen ©   (2007-02-14 08:40) [18]


> Куда тебе нужно будет отправить твой код, если будет создано
> больше одного экземпляра TForm1?

То-есть? Выражайся понятнее...


> Leonid Troyanovsky ©   (13.02.07 19:47) [10]
> Убирать, в любом случае, надо.

Что убирать? Форма никуда не денется. Проверь код если сомневаешся.


 
Elen ©   (2007-02-14 08:53) [19]


> Annn   (14.02.07 02:17) [17]

Вот хочу предложить свой вариант удаления контролов из списка :
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   Button1: TButton;
   Edit1: TEdit;
   Memo1: TMemo;
   ListBox2: TListBox;
   RadioButton1: TRadioButton;
   CheckBox1: TCheckBox;
   Button2: TButton;
   Memo2: TMemo;
   procedure FormCreate(Sender: TObject);
   procedure ListBox1Click(Sender: TObject);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
i:=0;
while ListBox1.Count<Form1.ComponentCount do begin
ListBox1.Items.Append(Form1.Components[i].Name);
inc(i);
end;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var cm:TComponent;
begin
ListBox1.Items.Delete(ListBox1.Items.IndexOf(ListBox1.Name));
while ListBox1.Items.Count>=1 do begin
FindComponent(ListBox1.Items[ListBox1.Items.count-1]).free;
ListBox1.Items.Delete(ListBox1.Items.Count-1);
end;
end;
end.



Здесь в лист забивается список контролов, которые потом выбираются из листа находятся и free...


 
Virgo_Style ©   (2007-02-14 09:00) [20]

Elen ©   (14.02.07 8:40) [18]
Что убирать? Форма никуда не денется. Проверь код если сомневаешся.


при нажатии кнопки на Form1812 очистится Form1, что определенно непорядок


 
Elen ©   (2007-02-14 09:02) [21]


> Virgo_Style ©   (14.02.07 09:00) [20]

А-а-а. Теперь ясно. Ну я предполагаю что у меня одна форма. Ну можно из контролов парент вытянуть или вообще form1 не писать. (Но лучше парент вытянуть)


 
evvcom ©   (2007-02-14 09:10) [22]

> [21] Elen ©   (14.02.07 09:02)

Лучше Form1 не писать. Тогда обращение к объекту пойдет через Self.


 
Elen ©   (2007-02-14 09:19) [23]


> Лучше Form1 не писать. Тогда обращение к объекту пойдет
> через Self.

Хм. А мне кажется что получить парент было бы универсальнее, если форм много. Еще раз повторюсь что имела ввиду всего одну форму в проекте.


 
Virgo_Style ©   (2007-02-14 09:20) [24]

Elen ©   (14.02.07 9:19) [23]
А мне кажется что получить парент было бы универсальнее


честно говоря, не вижу разницы. Поясните?


 
Elen ©   (2007-02-14 09:26) [25]


> Virgo_Style ©   (14.02.07 09:20) [24]

В общем то я по поводу отсуттвия разницы не спорю просто этому self не очень доверяю. Ну это субъективное мнение, сильно не пинай. :)


 
Плохиш ©   (2007-02-14 10:56) [26]


> Annn   (14.02.07 02:17) [17]
> А куда его можно отправить? А почему ты рад за меня.

Потому что в делфи нет исключений "Ошибка", Вы одна из немногих избранных, которые умудрились его получить.


 
ЮЮ ©   (2007-02-14 11:42) [27]

>просто этому self не очень доверяю

Это всё-равно, что не доверять себе самому. По крайней мере в переводе с английского звучит так :)

По существу. Если есть список объектов, зачем ещё и по форме бегать? А  SelObj лучше не TStringList, а  TList или TObjectList и хранить не имя, а ссылку. Если TObjectList создать с соответствующим параметром, то для удаления "выделенных" TImage достаточно будет одной строки: SelObj.Clear;



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

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

Наверх




Память: 0.54 MB
Время: 0.031 c
15-1170447247
Суслик
2007-02-02 23:14
2007.03.04
Запись avi с экрана.


4-1161622457
spyrytus
2006-10-23 20:54
2007.03.04
Как управлять чужим окном


2-1171354823
Sapos
2007-02-13 11:20
2007.03.04
Редактирование в ComboBox


15-1171193492
Parus
2007-02-11 14:31
2007.03.04
Всё этот самый ASP VBScript


11-1135015016
Alex55
2005-12-19 20:56
2007.03.04
как установить indy