Форум: "Начинающим";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
ВнизПроблема с массивом неизвестного размера Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c