Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
ВнизКак получить жётскую ссылку на элемент в 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.037 c