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

Вниз

Как получить жётскую ссылку на элемент в TList, независимо от   Найти похожие ветки 

 
Tool   (2004-12-05 01:16) [0]

того удалялись ли элементы перед ним, или вставлялись ли? Так, чтобы всегда точно попадать именно на этот элемент?


 
Gero ©   (2004-12-05 01:18) [1]

Link := List[n];


 
Alexander Panov ©   (2004-12-05 01:58) [2]

Пришлось 2 раза прочитать тему и то, что находится там, где должен находиться вопрос. Трудно что-ли нормально вопрос писать?

А ответ такой: Нет.


 
Gero ©   (2004-12-05 02:03) [3]


> А ответ такой: Нет.

Почему это нет?


 
Tool   (2004-12-05 02:04) [4]


> Gero ©   (05.12.04 01:18) [1]
> Link := List[n];

Если сделать List.Delete(n-1); элементы сместятся и линк будет показывать уже на следующий элемент.


 
Tool   (2004-12-05 02:06) [5]

procedure TForm1.Button1Click(Sender: TObject);
var
 s1, s2     : string;
 p1, p2, p3 : ^string;
begin
 s1 := "asdf";
 s2 := "qwer";
 p1 := @s1;
 p2 := @s2;
 lst1 := TList.Create;
 try
   lst1.Add(p1);
   lst1.Add(p2);
   p3 := lst1[0];
   ShowMessage(p3^);
   lst1.Delete(0);
   p3 := lst1[0];
   ShowMessage(p3^);
 finally
   lst1.Free;
 end;
end;


 
Tool   (2004-12-05 02:08) [6]

var
 lst1  : TList;


 
Gero ©   (2004-12-05 02:18) [7]

Хм, если я неправ, приношу свои извинения.
На досуге взгляну поближе на реализацию TList.


 
Sapersky   (2004-12-05 02:40) [8]

Tool   (05.12.04 02:06) [5]

Индексы (lst1[0]) - да, смещаются, но ссылки остаются те же самые. Конечно, если вы этот элемент удаляете, то толку от неё мало. В общем, пример не правильный :). Лучше так:

 lst1.Add(p1);
 lst1.Add(p2);
 p3 := lst1[1]; // ссылка на 2-й элемент
 ShowMessage(p3^);
 lst1.Delete(0);
 // первый улемент удалён, индексы сдвинулись,
 // дальнейшее обращение lst1[0] даст 2-й элемент
 ShowMessage(p3^);
 // но ссылка на 2-й элемент осталась та же


 
Tool   (2004-12-05 02:55) [9]


> Sapersky   (05.12.04 02:40) [8]
> // но ссылка на 2-й элемент осталась та же

А из ссылки можно получить номер элемента?


 
Gero ©   (2004-12-05 02:55) [10]


> А из ссылки можно получить номер элемента?

TList.IndexOf


 
Tool   (2004-12-05 02:57) [11]


> Gero ©   (05.12.04 02:55) [10]
>
> > А из ссылки можно получить номер элемента?
>
> TList.IndexOf

Это поиск. Он медленный.


 
Tool   (2004-12-05 03:03) [12]


> ShowMessage(p3^);
>  // но ссылка на 2-й элемент осталась та же

Ещё вопрос. А как сохранять эти ссылки? Чтобы потом загружать. Не собъётся ли у нас всё?


 
Gero ©   (2004-12-05 04:00) [13]


> Это поиск. Он медленный.

А ты это как-то ощутил?
Сколько элементов в твоем TList?

> А как сохранять эти ссылки? Чтобы потом загружать. Не собъётся
> ли у нас всё?

Посоветую купить книгу по основам программирования и прочитать.
После этого посмотреть на этот вопрос и подумать: а что ж я спросил?


 
Tool   (2004-12-05 04:42) [14]


> Gero ©   (05.12.04 04:00) [13]
>
> > Это поиск. Он медленный.
>
> А ты это как-то ощутил?

Когда ощутю - поздно будет.


> Посоветую купить книгу по основам программирования и прочитать.

Любимый совет всех идиотов.


> После этого посмотреть на этот вопрос и подумать: а что
> ж я спросил?

Советую иногда задумываться над вопросом, "а правильно ли я понял ?".


 
begin...end ©   (2004-12-05 09:46) [15]

> [5] Tool   (05.12.04 02:06)

Ответ на вопрос уже дан в [2].

Кстати, пример немного неудачен. Т.к. переменные s1 и s2, по сути дела, сами являются указателями, и имеют размер 4 байта, то я думаю, что в данном случае можно было обойтись без дополнительных переменных и заносить в список s1 и s2 непосредственно, например:

var
 s1, s2: String;
begin
 s1 := "asdf";
 s2 := "qwer";
 with TList.Create do
 try
   Add(Pointer(s1));
   Add(Pointer(s2));
   ShowMessage(String(Items[0]));
   Delete(0);
   ShowMessage(String(Items[0]))
 finally
   Free
 end
end.


Однако сути дела это, конечно, не меняет, и индексы ссылок всё равно поменяются.

> [11] Tool   (05.12.04 02:57)

> Это поиск. Он медленный.

На маленьких списках это будет незаметно. А больше никак.

> [12] Tool   (05.12.04 03:03)

> А как сохранять эти ссылки? Чтобы потом загружать. Не собъётся
> ли у нас всё?

Сохранять куда и зачем? Что имеется в виду?

Если нужно, чтобы индексы сохранялись, то, может быть, лучше и не удалять эти ссылки из списка, а, например, помечать их NIL"ом? Но в этом случае, может быть, хватит и обычного динамического массива указателей.

> [14] Tool   (05.12.04 04:42)

> Любимый совет всех идиотов.

Выбирайте выражения, молодой человек. И формулируйте вопросы более конкретно. Тогда, может быть, и ответы будут более конкретными. А посылать мы и сами можем.


 
Anatoly Podgoretsky ©   (2004-12-05 10:33) [16]

Конечно можно, но придется препринять множество усилий.
Придется создать новый класс TLinkToList, организовать механизм оповещения ссылок.

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


 
Sapersky   (2004-12-05 14:05) [17]

А из ссылки можно получить номер элемента?

А зачем номер? Если только для сохранения (в файл, если я правильно понял), то вполне подойдёт IndexOf. Можно реализовать и более быстрый метод, ценой использования большего кол-ва памяти - запихивать в список не собственно тип, а
 PListType = ^TListType;
 TListType = record
   NeededVar : TNeededType;
   Index : Integer;
 end;

Перед получением индексов проходим по всему списку в цикле:
For n:=0 to List.Count-1 do PListType(List.List[n]).Index:=n;

...и в любой присутствующей в списке ссылке PListType будет нужный индекс.

Кстати, если используются строки - то, может быть, лучше TStringList?


 
TButton ©   (2004-12-05 14:13) [18]


> Ещё вопрос. А как сохранять эти ссылки? Чтобы потом загружать.
> Не собъётся ли у нас всё?

во-первых сохранять ссылки нам нафиг не надо, ибо при следующем запуске программы объекты на которые ссылается лист надо будет создавать заново, соответственно они будут иметь другие адреса в памяти, соответственно то, что вы героически насохраняли потеряет актуалность.
во-вторых кто это мы?
в-третьих не знаю как у вас, у меня ничего не сбивается, а если сбивается я никому не сообщая *втихаря* исправляю ситуацию.

и наконец.
если вам нужно сохранить то что было списком объектов, рекомендую:
а. описать для объекта методы SaveToStream, LoadFromStream.
б. при загрузке/сохранении создавать файловый поток и последовательно вызывать соответствующий метод объекта, передавая ему ссылку на этот самый поток.



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

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

Наверх




Память: 0.52 MB
Время: 0.024 c
8-1095174012
Zeqfreed
2004-09-14 19:00
2004.12.19
Flash и Стримы, есть аналог TFlashControl?


14-1101883869
GanibalLector
2004-12-01 09:51
2004.12.19
Расчет потребности в оборудовании


3-1101100340
janb
2004-11-22 08:12
2004.12.19
Добавление записей на mysql


14-1101675462
OneFragLeft
2004-11-28 23:57
2004.12.19
Чё за дрянь?


14-1101885880
raymond
2004-12-01 10:24
2004.12.19
Адвминистрирование компьютерного класса (ищу программу)...