Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как проверить, что элемент массива пустой? [D7, XP]


pavel_guzhanov ©   (2010-03-21 11:40:00) 

имеется массив
BUT:array [1..20] of TTButton;

Он заполняется динамически создаными Tbutton.
После этого несколько элементов массива удаляются, например But[2].Destroy;

А потом надо вывести на панель все кнопки из массива.
for i:=1 to 20 do
begin
 But[i].Parent:=Panel1;
end;

Правильно ли я удаляю элемент из массива? Если неправильно, то как его надо удалять?
Как проверить при выводе на панель, что кнопки в массиве нет?


Сергей М.   (2010-03-21 17:30:00) [1]


> Правильно ли я удаляю элемент из массива?


Ты его ВООБЩЕ не удаляешь.


Демо   (2010-03-21 16:06:00) [2]


> После этого несколько элементов массива удаляются, например
> But[2].Destroy;А потом надо вывести на панель все кнопки
> из массива.for i:=1 to 20 dobegin  But[i].Parent:=Panel1;
> end; Правильно ли я удаляю элемент из массива? Если неправильно,
>  то как его надо удалять?Как проверить при выводе на панель,
>  что кнопки в массиве нет?


Удаляй объект используя не метод Free, а процедуру FreeAndnil.

Далее в цикле проверяй на равенство nil (Либо Assigned()).

Если количество объектов постоянно меняется, то лучше использовать TObjectList (или хотя бы TList), либо любой простейший связный список.


sniknik   (2010-03-21 13:50:00) [3]

unit UsrUnit;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DB, Grids, DBGrids, ADODB, StdCtrls, DBClient, ComCtrls, ComObj, Contnrs;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
 public
   ObjList: TObjectList;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Randomize;
 ObjList:= TObjectList.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if Button2.Enabled then
   ObjList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 Button: TButton;
begin
 for i:= 0 to 9 do begin
   Button:= TButton.Create(self);
   Button.Parent:= self;
   Button.Left  := Random(ClientWidth-75);
   Button.Top   := Random(ClientHeight-25);

   ObjList.Add(Button);
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 while ObjList.Count > 0 do
   ObjList.Delete(0);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 i: integer;
begin
 for i:= ControlCount - 1 downto 0 do
   if (Controls[i] <> Button1) and (Controls[i] <> Button2) and (Controls[i] <> Button3) then
     Controls[i].Free;

 Button2.Enabled:= false; //закрыть, т.к. список стал невалидным
end;

end.


sniknik   (2010-03-21 13:33:00) [4]

скрипач, т.е. массив не нужен! (ни разу не было дано на форуме условий при которых без массива элементов не обойтись... или он добавлял что-то полезное)

1 список элементов уже ведется, родителем этого элемента.
2 все события элементов имеют ссылку на самого себя, т.е. искать себя, вести из-за этого массив (именно это приводилось как аргумент, действия в зависимости от того какой он элемент в массиве) нет смысла.
3 если уж "приперло" то почему не список объектов?


Anatoly Podgoretsky   (2010-03-21 12:05:00) [5]

> pavel_guzhanov  (21.03.2010 11:40:00)  [0]

1. Free
2. Никак, надо самому указывать что нет


{RASkov}   (2010-03-21 11:43:00) [6]

Удаление:
But[i].Free;
But[i]:=nil;

проверка:
if But[i]<>nil then....


Наверх

Титульная страница Поиск, карта сайта Написать письмо