Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.042 c
2-1171441008
XTD
2007-02-14 11:16
2007.03.04
Перевод числа между системами счисления


4-1161510753
SysError
2006-10-22 13:52
2007.03.04
Перехват ZwQueryDirectoryFile


6-1159248027
WhiteBarin
2006-09-26 09:20
2007.03.04
Как определить IP подсоединённого клиента на стандартный сервер W


6-1159546933
vidiv
2006-09-29 20:22
2007.03.04
выполнение recv на болк. сокете


15-1170839769
alien1769
2007-02-07 12:16
2007.03.04
1C Сервер ТТХ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский