![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить жётскую ссылку на элемент в 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];