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

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

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


Tool ©   (2004-12-05 01:16:00) 

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


TButton   (2004-12-05 14:13:00) [1]


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

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

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


Sapersky   (2004-12-05 14:05:00) [2]

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

А зачемномер? Если только для сохранения (в файл, если я правильно понял), то вполне подойдёт 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?


Anatoly Podgoretsky   (2004-12-05 10:33:00) [3]

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

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


begin...end   (2004-12-05 09:46:00) [4]

> [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)

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

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


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


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

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


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

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


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

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


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


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

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

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

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


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


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

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


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


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

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


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


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

TList.IndexOf


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


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

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


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

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-й элемент осталась та же


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

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


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

var
 lst1  : TList;


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

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:04:00) [15]


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

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


Gero   (2004-12-05 02:03:00) [16]


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

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


Alexander Panov   (2004-12-05 01:58:00) [17]

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

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


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

Link := List[n];


Наверх

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