Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Массив неизвестной длины [D7, WinXP]


Виталька2006 ©   (2006-02-07 11:48:00) 

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

Спасибо.


MBo   (2006-02-07 13:42:00) [1]


 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;


evvcom   (2006-02-07 13:38:00) [2]


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

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


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

спасибо.

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

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


Kolan   (2006-02-07 13:25:00) [4]

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


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

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


MBo   (2006-02-07 13:15:00) [6]

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

нельзя так.

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


Vlad   (2006-02-07 13:15:00) [7]


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


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


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


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

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

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


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

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

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


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

Можно так:

var
 intArray : array of integer;

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


Ega23   (2006-02-07 12:54:00) [11]

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


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

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


evvcom   (2006-02-07 12:48:00) [13]


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

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


Kolan   (2006-02-07 12:43:00) [14]

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


Угу


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

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

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


Fay   (2006-02-07 11:53:00) [16]

array of


Desdechado   (2006-02-07 11:50:00) [17]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо