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

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

ListView.Items.Item[n].Data присвоить ansistring


Страницы:   1 2

o_serg ©   (2006-10-09 22:35:00) 

Есть ListView мне нужно каждому его итему поставить в соответствие строку(но чтобы не отображалась в самом списке на экране). Я делаю так:
procedure...
...
name:=OpenDialog.FileName;
...
tempItem:=ListView.Items.Add;
tempItem.Data:=name;
end;

В таком случае правильно прочитать ListView.Items.Item[n].Data получается только у последнего добавленного итема, а у остальных содержимое строки затирается.
Что я делаю не так скажите пожалуйста?


Ketmar   (2006-10-10 01:40:00) [21]

>[12] zamtmn(c) 10-Oct-2006, 01:04
>с string`ом компилятор можно обмануть и без гетмемов
можно. а потом месяцами ловить загадочные глюки и мемлики. лично я, пишущий далеко не первый год, этого делать не стал бы. я бы вообще забабахал запись.. или класс, что ещё прикольней.


Германн   (2006-10-10 01:23:00) [22]

Я вообще-то совсем не хотел тут высказываться, но не выдержал. Пусть автор уберет многоточия в своих высказываниях и заменит их реальнымкодом! А то, имхо, всяк высказывшийся в этой ветке говорит о том, что он понял в вопросе.


zamtmn   (2006-10-10 01:04:00) [23]

с string`ом компилятор можно обмануть и без гетмемов

procedure...
var name:string;
...
name:=OpenDialog.FileName;
tempItem:=ListView.Items.Add;
tempItem.Data:=pointer(name);
pointer(name):=nil;
...

получится что refcnt стринга будет на еденицу больше количества живых ссылок на него, и стринг переживет свои "пределы видимости". потом естественно нужно незабыть почистить всё ручками string(tempItem.Data):='';


Ketmar   (2006-10-10 00:12:00) [24]

>[8] Kolan(c) 9-Oct-2006, 23:35
>Это как? Смешная шутка, которую я не понял?
ты бы вопрос сначала прочёл, ага?


Kolan   (2006-10-09 23:52:00) [25]


> Но ты все равно не поймешь...

Фух, слава богу, буду по старинке писать S := 'What Ever';


DrPass   (2006-10-09 23:46:00) [26]


> Kolan ©   (09.10.06 23:35) [8]

Нет, это суровая правда жизни. Но ты все равно не поймешь...


Kolan   (2006-10-09 23:35:00) [27]


> выделяй под них память руками -- это надёжней всего.

Это как? Смешная шутка, которую я не понял?


Ketmar   (2006-10-09 23:29:00) [28]

и, кстати, не Length(), а Length()+1. потому что завершающий нулевой байтик не надо забывать. %-)


DrPass   (2006-10-09 23:22:00) [29]


>  у остальных содержимое строки затирается.

Так и есть. Строка - тип с управляемым временем жизни. Как только программа выходит "за пределы видимости" строковой переменной, занимаемая ей память автоматически высвобождается.
То же самое происходит и здесь:
GetMem(name, Length(OpenDialog.FileName));
name:=OpenDialog.FileName;
Ты ведь сначалы выделяешь память, а потом не копируешь в нее содержимое строки, а просто переставляешь указатель на саму строку (которая также уйдет в небытие после завершения работы процедуры). Тебе нужно не присваивать, а перенести данные: StrCopy(name, PChar(OpenDialog.FileName))


o_serg   (2006-10-09 23:16:00) [30]

var
 name: Pchar;
procedure...
...
GetMem(name, Length(OpenDialog.FileName));
name:=OpenDialog.FileName;
...
tempItem:=ListView.Items.Add;
tempItem.Data:=name;
end;
сделал вот так - тот же глюк


Ketmar   (2006-10-09 23:15:00) [31]

перед Clear(). руками.


o_serg   (2006-10-09 22:47:00) [32]

с GetMem ясно - вделить когда создаю новый итем, а освобождать его как, если я использую ListView.Items.Clear


o_serg   (2006-10-09 22:47:00) [33]

Удалено модератором
Примечание: дубль


Ketmar   (2006-10-09 22:38:00) [34]

не так то, что не знаком с организацией строк в Delphi. выделяй под них память руками -- это надёжней всего. GetMem()/FreeMem(). иначе нагребёшь таких багов, что за год не вылечишь.


Страницы:   1 2

Наверх

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