Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Определение степени заполненности массива


Автор: WaterProof 22.3.2007, 13:11
Имеется массив определенной длины FavCount. 
Код

TFavItems = array[1..FavCount] of TMenuItem;

По мере работы программы в массив добавляются МенюИтемы:
Код

procedure TMainForm.N16Click(Sender: TObject);
var I:integer;
    item:TMenuItem;
    Ini:TIniFile;
    f:textfile;
begin
i:=1;
curitemCount := 0;
favlist.Enabled := true;
item := TMenuItem.Create(mainmenu);
item.Caption := treeview.Selected.Text;
item.Tag := treeview.Selected.AbsoluteIndex;
item.OnClick := ItemClick;
favlist.Add(item);
(******************* Скан массива ***)
while favitems[i] <> nil do
 begin
 inc(CurItemCount);
 end;
 favitems[curItemCount+1] := item; 
end;

Нужно узнать, сколько ячеек массива FavCount заполнено итемами....(то есть они не все будут заполнены, а только часть). Пустые ячейки по идее должны быть равны nil(или я не прав?).
Я пробую сканировать массив, но он неправильно определяет(программа просто зависает при проверке):
Код

while favitems[i] <> nil do
 begin
 inc(CurItemCount);
 end;
 favitems[curItemCount+1] := item;

Автор: Yanis 22.3.2007, 13:13
Цитата(WaterProof @  22.3.2007,  14:11 Найти цитируемый пост)
Я пробую сканировать массив, но он неправильно определяет(программа просто зависает при проверке):

Пройдись циклом for и не мучайся.

Добавлено @ 13:16 
Код
for i := 1 to FavCount do
  if IsBadCodePtr(favitems[i]) then
    Inc(BadItemCount);

  Length(favitems) - BadItemCount; // < - кол-во инициированных итемов

Автор: WaterProof 22.3.2007, 13:52
Хм... Вроде работает, и вроде не работает...
Код

for i:=1 to (length(favitems) - BadItemCount) do
favlist.Add(favitems[i]); // favlist - тоже TMenuItem


Строю меню динамическое из массива(считанного из файла), а меню и не появляется.... Хотя при проверке, массив 1)сохраняется 2) количество инициализированных итемов тоже подсчитывается.... В чем юмор??

Автор: Yanis 22.3.2007, 13:53
Цитата(WaterProof @  22.3.2007,  14:52 Найти цитируемый пост)
В чем юмор?? 

в F7 и F8.

Автор: WaterProof 22.3.2007, 13:55
Намек понял.

Автор: MetalFan 22.3.2007, 15:13
перед использованием массива сделать ему ZeroMemory.
ибо если это глобальная переменная, то там может содержаться мусор и проверка assigned или <>nil не прокатит

Автор: Rennigth 22.3.2007, 15:18
WaterProof,  кстати посоветовал бы все-таки динамический массив использовать и не статику.

Автор: WaterProof 22.3.2007, 16:43
Я сделал проще: отказался от массива вообще. Сделал через TstringList. И все оказалось ЗНАЧИТЕЛЬНО проще..... smile 
Rennigth, динамический массив там не к чему... Слишком малое количество данных, и слишком много кода(ну ладно, не слишком=))

MetalFan, вот кажется мне мусор и помешал сделать массивами...

Тем не менее, всем спасибо за участие в проблеме! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)