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

Вниз

Проблема с массивом неизвестного размера   Найти похожие ветки 

 
beglec ©   (2006-10-22 16:22) [0]


// задача: По нажатию кнопки создать 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.


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

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


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

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

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


 
beglec ©   (2006-10-22 16:31) [3]

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


 
beglec ©   (2006-10-22 16:33) [4]

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


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


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

лопату


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

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


 
Ketmar ©   (2006-10-22 16:37) [7]

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


 
beglec ©   (2006-10-22 16:37) [8]

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


 
Ketmar ©   (2006-10-22 16:39) [9]

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



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

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

Наверх




Память: 0.49 MB
Время: 0.036 c
2-1161589778
попович
2006-10-23 11:49
2006.11.05
Как перевести String в double?


4-1150866700
й
2006-06-21 09:11
2006.11.05
вид курсора


15-1161297183
PHPDeveloper
2006-10-20 02:33
2006.11.05
Закачка с фтп


1-1159007734
Дмитрий В
2006-09-23 14:35
2006.11.05
Как записать байт в lpt порт


6-1146778260
Sergio77
2006-05-05 01:31
2006.11.05
данные от сервера INDY всем клиентам INDY