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

Вниз

Массив неизвестной длины   Найти похожие ветки 

 
Виталька2006   (2006-02-07 11:48) [0]

Здравствуйте мастера.
Вот для хранения списка строчек в делфи есть очень удобно
использовать тип TStrings.
А как лучше всего хранить массив переменной длины,
например, целых чисел или каких-либо записей?

Спасибо.


 
Desdechado ©   (2006-02-07 11:50) [1]

TList с указателями на эти записи, имхо

можно просто array of TMyRecord, но мне не нравится


 
Fay ©   (2006-02-07 11:53) [2]

array of


 
Виталька2006   (2006-02-07 12:23) [3]

Правильно я понял, что нужно создать динамический массив, а потом
при добавлении элемента делать setlength(myarray, length(myarray) + 1) ?

2 Desdechado: можно поинтересоваться,а почему не нравится array of TMyRecord ? может там какие подводные камни?


 
Kolan ©   (2006-02-07 12:43) [4]

Правильно я понял, что нужно создать динамический массив, а потом
при добавлении элемента делать setlength(myarray, length(myarray) + 1) ?


Угу


 
evvcom ©   (2006-02-07 12:48) [5]


> Правильно я понял, что нужно создать динамический массив,
>  а потом
> при добавлении элемента делать setlength(myarray, length(myarray)
> + 1) ?
>
> Угу

В частном случае - угу, в общем, все гораздо сложнее.
С TList и указателями на динамические массивы тоже надо быть осторожным, т.к. сами данные могут при ресайзинге "убежать" с одного места в другое.


 
MBo ©   (2006-02-07 12:49) [6]

>setlength(myarray, length(myarray) + 1)
Можно, но потом будешь спрашивать, почему программа долго работает и кучу памяти отъедает...
Лучше сразу задать массив разумной длины, а при необходимости расширения - увеличивать на значительное количество элементов сразу.


 
Ega23 ©   (2006-02-07 12:54) [7]

Я бы в TList всё хранил.


 
DUDAS ©   (2006-02-07 13:00) [8]

Можно так:

var
 intArray : array of integer;

begin
 intArray:=(New(IntArray,100); //Размер массива 100
end;


 
Desdechado ©   (2006-02-07 13:06) [9]

> почему не нравится array of TMyRecord ? может там какие подводные камни?
C неделю назад я описывал их. Повторять лениво. Ищи.

evvcom ©   (07.02.06 12:48) [5]
>С TList и указателями на динамические массивы
Не понял. При чем тут это. Либо TList, либо дин.массив.


 
Виталька2006   (2006-02-07 13:09) [10]

>Можно, но потом будешь спрашивать, почему программа долго работает и кучу памяти отъедает...
>Лучше сразу задать массив разумной длины, а при необходимости
>расширения - увеличивать на значительное количество элементов сразу.

В том и дело. У меня задача - сохранить контуры, которые пользователь обводит мышкой. Т.е. сохранить все Х-ы и Y-ки.
А он может как маленький кружочек выделить, так и пол экрана обвести..


 
Vlad ©   (2006-02-07 13:15) [11]


> Виталька2006   (07.02.06 13:09) [10]


> Т.е. сохранить все Х-ы и Y-ки.
> А он может как маленький кружочек выделить, так и пол экрана
> обвести..


array of TPoint ?
или TList, куда пишешь PPoint ( = ^TPoint)


 
MBo ©   (2006-02-07 13:15) [12]

>DUDAS ©   (07.02.06 13:00) [8]
>Можно так

нельзя так.

>Виталька2006   (07.02.06 13:09) [10]
Используй TList.


 
MBo ©   (2006-02-07 13:16) [13]

>Виталька2006
А сохранять нужно координаты точек или что-то еще?


 
Kolan ©   (2006-02-07 13:25) [14]

Можно выделить заведомо больший массив, а когда узнаешь сколько точек надо сохранить - уменьшишь его длинну...


 
Виталька2006   (2006-02-07 13:29) [15]

спасибо.

>А сохранять нужно координаты точек или что-то еще?

В массиве только координаты хранятся.
А вообще будет объект (или запись) "контур", для которого хранятся
название, тип и тд.. и как одно из полей - граница, тот самый массив точек.
по советам, я так понимаю, что в данном случае ТЛист удобней...


 
evvcom ©   (2006-02-07 13:38) [16]


> >С TList и указателями на динамические массивы
> Не понял. При чем тут это. Либо TList, либо дин.массив.

А... Где-то показалось, что массив массивов. С массивом записей все действительно гораздо проще.


 
MBo ©   (2006-02-07 13:42) [17]


 Pts:TList;

procedure TForm18.FormCreate(Sender: TObject);
begin
 Pts:=TList.Create;
end;

procedure TForm18.Button3Click(Sender: TObject);
var
 i:Integer;
 Pt:TSmallPoint;
begin
 for i := 0 to Pts.Count - 1 do begin
   Pt:=TSmallPoint(Pts[i]);
   ListBox1.Items.Add(Format("%d: %d",[Pt.x, Pt.y]));
 end;
end;

procedure TForm18.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
 Pt:TSmallPoint;
begin
 Pt:=SmallPoint(X,Y);
 Pts.Add(Pointer(Pt));
end;




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

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

Наверх




Память: 0.51 MB
Время: 0.033 c
2-1139558231
Id
2006-02-10 10:57
2006.02.26
Вертикальная надпись в QReport


2-1139250325
TimScorp
2006-02-06 21:25
2006.02.26
EConvertError


2-1139808145
Rubey
2006-02-13 08:22
2006.02.26
Значение ключей в реестре


2-1139402563
R.O.O.T
2006-02-08 15:42
2006.02.26
Как добавить поле в таблицу базы Access


6-1132152638
pmi1
2005-11-16 17:50
2006.02.26
Кто-то пользовался функцией InternetCheckConnection?