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

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

Проблема с массивом неизвестного размера [D7, WinXP]


beglec ©   (2006-10-22 16:22:00) 


// задача: По нажатию кнопки создать 1 дополнительный объект
//         Изначально не известно сколько будет объектов
// ресурсы: подгружается изображение bmp 32x32
// Конфигурация компа: P3000x2 1Gb Memory.
// Проблема: Возникает исключительная ситуация уже на первом десятке создания объектов EAccessViolation
aunit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls,
     Install, rxGif;
type
  TsdComputer=record
  IDRec       : Integer;
  ComputerName: String;
  Login       : String;
  Image       : TImage;
  LabelLogin  : TLabel;
  end;
 TFMain = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
 public
 end;
var   FMain: TFMain;
     Computers: array of TsdComputer;
     Index:   Integer;
implementation
{$R *.dfm}
// ------------------------------------------------------------------------------ создание формы
procedure TFMain.FormCreate(Sender: TObject);
begin Index:=0; end;                                                             // индекс начала массива
// ------------------------------------------------------------------------------ нажимаем кнопочку
procedure TFMain.Button1Click(Sender: TObject);
begin
  Inc(Index);                                                                   // увеличиваем размер массива
  SetLength(Computers,Index);                                                   // создаем задаем новое значение длины массива
  Computers[Index].Image                 :=TImage.Create(FMain);                // создаем изображение
  Computers[Index].Image.Parent          :=FMain;                               //
  Computers[Index].Image.ShowHint        :=True;                                // разрешить подскаски
  Computers[Index].Image.Hint            := 'Имя: '+#13#10+                     // делаем двухстрочную подсказку
                                            'Группа: ';
  Computers[Index].Image.AutoSize        :=True;                                // автоматический размер установить
  Computers[Index].Image.Transparent     :=True;                                // изоражение прозрачное

  Computers[Index].Image.Picture.LoadFromFile(PathPicture+'comp0.gif');         // загружаем картинки
  Computers[Index].Image.Left            :=0;                                   // координаты
  Computers[Index].Image.Top             :=Index*32;
end;
end.


Ketmar   (2006-10-22 16:39:00) [1]

>[8] beglec(c) 22-Oct-2006, 16:37
>А почему тогда она (ИС) не сразу вылазит, а только после
>создания нескольких объектов?
потому что не сразу витальный кусок ливера портишь.


Ketmar   (2006-10-22 16:37:00) [2]

>[3] beglec(c) 22-Oct-2006, 16:31
>Что посоветуете ?
сделать {$R+} и долго удивляться.


beglec   (2006-10-22 16:37:00) [3]

Dmitrij_K - спасибо, действительно помогло!!!
Проблема исчезла.
А почему тогда она (ИС) не сразу вылазит, а только после создания нескольких объектов ? - Ну этот вопрос так, уже для дальнейшего просвещения


Dmitrij_K   (2006-10-22 16:35:00) [4]

// Index=0
Inc(Index);
//Index=1
SetLength(Computers,Index);
// Length(Computers)=1
// обрашение к индексу 1 которого нет, получаешь AV
Computers[Index].Image


beglec   (2006-10-22 16:33:00) [5]

Dmitrij_K -> а причем тут 0 индекс ?
я ведь к 0 индексу не обращаюсь ?
Но все равно спасибо учту. Честно говоря забыл про это дело.


Dmitrij_K   (2006-10-22 16:33:00) [6]


> Что посоветуете ?

лопату


beglec   (2006-10-22 16:31:00) [7]

Что посоветуете ?


Dmitrij_K   (2006-10-22 16:30:00) [8]

l := Length(Computers);
SetLEngth(Computers, l+1);
Computers[l].xxx
Computers[l].xxx

у такого метода плохая скорость, чем больше массив тем медленнее бедет работать


Dmitrij_K   (2006-10-22 16:27:00) [9]

Индексы дин. массива начинаются с нуля


Наверх

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