Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
Виталька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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.119 c
2-1139562422
SPOK
2006-02-10 12:07
2006.02.26
Очень туго с СИ


2-1139423531
JEK2
2006-02-08 21:32
2006.02.26
Не понятные ошибки при работе с БД


2-1139773723
Непонятка
2006-02-12 22:48
2006.02.26
Как вызвать процедуру?


2-1139197063
alien thing
2006-02-06 06:37
2006.02.26
Службы Win


15-1138016970
Saruwatari
2006-01-23 14:49
2006.02.26
Помогите, у меня чего-то аська глючит...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский