Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1101455719
Pentium133
2004-11-26 10:55
2004.12.19
Телевидение


14-1101542253
ИМХО
2004-11-27 10:57
2004.12.19
Это правда?


4-1099905979
ZedeS
2004-11-08 12:26
2004.12.19
Работа со CMOS в Win XP


8-1095439667
Рыба
2004-09-17 20:47
2004.12.19
ScanLine и RGB


1-1101982296
Zif
2004-12-02 13:11
2004.12.19
Как перевести из Кб в Мб?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский