Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизКак проверить, что элемент массива пустой? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.102 c