Главная страница
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.027 c
2-1139749664
~intel~
2006-02-12 16:07
2006.02.26
Скрытие значения поля


6-1132520333
Balex
2005-11-20 23:58
2006.02.26
Как программно открыть Word овский документ Word ом


3-1135769758
Id
2005-12-28 14:35
2006.02.26
SQL error code = -804


15-1139037280
vidiv
2006-02-04 10:14
2006.02.26
RSS - что это за зверь?


11-1120125688
stals
2005-06-30 14:01
2006.02.26
Работа с сетью