![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с массивом неизвестного размера [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]Индексы дин. массива начинаются с нуля