Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.061 c
2-1268653223
tippa
2010-03-15 14:40
2010.08.27
одновременное обращение к процедуре


2-1272870252
Виктор
2010-05-03 11:04
2010.08.27
could not find program


6-1219075279
ocean
2008-08-18 20:01
2010.08.27
IdSmtp headers


4-1234276707
Serafim
2009-02-10 17:38
2010.08.27
Не получается записать во входной буфер консоли WriteConsoleInput


15-1273760942
Still Swamp
2010-05-13 18:29
2010.08.27
Windows 7 vs BDS 6.0





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский