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

Вниз

Как проверить, что элемент массива пустой?   Найти похожие ветки 

 
pavel_guzhanov ©   (2010-03-21 11:40) [0]

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

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

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

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


 
{RASkov} ©   (2010-03-21 11:43) [1]

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

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


 
Anatoly Podgoretsky ©   (2010-03-21 12:05) [2]

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

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


 
sniknik ©   (2010-03-21 13:33) [3]

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

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


 
sniknik ©   (2010-03-21 13:50) [4]

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.


 
Демо ©   (2010-03-21 16:06) [5]


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


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

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

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


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


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


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



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

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

Наверх




Память: 0.48 MB
Время: 0.107 c
2-1274530341
Delphist2
2010-05-22 16:12
2010.08.27
method insert класса range завершен неверно


15-1273161371
Jalevis
2010-05-06 19:56
2010.08.27
ни один проект не запускается из Дельфей


15-1267122258
Fenik
2010-02-25 21:24
2010.08.27
YAML под Delphi


2-1269309875
r_yevgeniy
2010-03-23 05:04
2010.08.27
Сохранить данные в файл из двух компонентов StringGrid


15-1271142494
brother
2010-04-13 11:08
2010.08.27
Полицейским камерам угрожает взлом через номер автомобиля