Текущий архив: 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.52 MB
Время: 0.03 c