Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];

Вниз

ListView.Items.Item[n].Data присвоить ansistring   Найти похожие ветки 

 
o_serg   (2006-10-09 22:35) [0]

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

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


 
Ketmar ©   (2006-10-09 22:38) [1]

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


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

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


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

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


 
Ketmar ©   (2006-10-09 23:15) [4]

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


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

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


 
DrPass ©   (2006-10-09 23:22) [6]


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

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


 
Ketmar ©   (2006-10-09 23:29) [7]

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


 
Kolan ©   (2006-10-09 23:35) [8]


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

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


 
DrPass ©   (2006-10-09 23:46) [9]


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

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


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


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

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


 
Ketmar ©   (2006-10-10 00:12) [11]

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


 
zamtmn ©   (2006-10-10 01:04) [12]

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

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

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


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

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


 
Ketmar ©   (2006-10-10 01:40) [14]

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


 
Сергей М. ©   (2006-10-10 08:34) [15]


> o_serg   (09.10.06 22:47) [2]
>
> с GetMem ясно - вделить когда создаю новый итем, а освобождать
> его как, если я использую ListView.Clear


Освобождать в обработчике TTreeView.OnDeletion:

FreeMem(Node.Data);

p.s.
Еще удобней в этом случае будет пользоваться StrNew/StrDispose вместо GetMem/FreeMem


 
zamtmn ©   (2006-10-10 08:38) [16]

>>я бы вообще забабахал запись..
с полем record`а будет тожесамое
>>а потом месяцами ловить загадочные глюки и мемлики
ну загадочного ниче не будет, а ловить можно долго, да:)


 
Ketmar ©   (2006-10-10 15:09) [17]

>с полем record`а будет тожесамое
ни разу. тогда можно использовать New() и Dispose(), а она корректно работают со строками. то же и для классов -- конструкторы/деструкторы обрабатывают всё как надо.


 
Наиль ©   (2006-10-10 16:38) [18]

При грамотном использовании помогает такой код:
tempItem:=ListView.Items.Add;
// Сохранение
tempItem.SubItems.Add(name);
// Восстановление
s:=ListView.Items[i].SubItems[0];


Реальный код может значительно отличаться от предложеного при использовании нескольких столбцов в ListView.


 
zamtmn ©   (2006-10-10 18:01) [19]

>>ни разу
я имею ввиду что стринговые поля рекордов также инициализируются в начале и убиваются в конце зоны видимости рекорда. и если name из [0] заменить на myrecord.name ниче не изменится
>>При грамотном использовании помогает такой код:
чему помогает?


 
Ketmar ©   (2006-10-10 18:04) [20]

>[19] zamtmn(c) 10-Oct-2006, 18:01
>видимости рекорда. и если name из [0] заменить на myrecord.
>name ниче не изменится
странный ты. догадаться, что я говорю об указателе на запись -- ни-ни? если это не очевидно, то -- ну, ты в курсе. метла. %-)


 
zamtmn ©   (2006-10-10 18:13) [21]

ты погоди метлы свои впаривать
>>я бы вообще забабахал запись
нислова про указатель:). тогда уж pstring, зачем лишние типы
>>странный ты. догадаться, что я говорю об...
нискольео тебя не страннее, просто с телепат хреновый)


 
Ketmar ©   (2006-10-10 18:35) [22]

вот интересно мне: о чём ты подумал, когда я сказал про запись? ты знаешь какой-нибудь иной способ сохранить запись в Data кроме указателей?


 
atruhin ©   (2006-10-10 19:38) [23]

> тогда можно использовать New() и Dispose(),

А с чего Dispose, стала финализировать строки записи?


 
Ketmar ©   (2006-10-10 19:42) [24]

>[23] atruhin(c) 10-Oct-2006, 19:38
>А с чего Dispose, стала финализировать строки записи?
а с чего бы не стала?


 
zamtmn ©   (2006-10-10 19:42) [25]

>>иной способ сохранить запись в Data кроме указателей?
помоему тут проблема не в Data а в локальнолй переменной name которая выходит за пределы видимости, вот я и подумал что ты ее предлагаешь в рекорд запихать, не говоришь что его нужно создать динамически
>>этого делать не стал бы. я бы вообще забабахал запись..
какая разница что бабахать, главное чтоб это было создано динамически


 
zamtmn ©   (2006-10-10 19:44) [26]

>>А с чего Dispose, стала финализировать строки записи?
а она всегда это делала (на моей памяти). и не только строки дин.массивы тоже


 
Ketmar ©   (2006-10-10 19:45) [27]

читаем код, созданый компилятором -- что видим? ага. call @Finalize.


 
Ketmar ©   (2006-10-10 19:45) [28]

>[25] zamtmn(c) 10-Oct-2006, 19:42
>какая разница что бабахать, главное чтоб это было создано
>динамически
угу. просто в записи можно использовать строки без магии. %-)


 
atruhin ©   (2006-10-10 20:09) [29]

Хм не знал, в хелпе не написано, спасибо посмотрю.


 
Ketmar ©   (2006-10-10 20:25) [30]

таки где-то написано. в частности, о том, что лучше выделять память для записей через New(), а освобождать -- через Dispose(). и даже пояснено, почему. %-)


 
zamtmn ©   (2006-10-10 21:03) [31]

>>угу. просто в записи можно использовать строки без магии. %-)
пожалста тут поподробнее


 
Ketmar ©   (2006-10-10 21:17) [32]

дык уже всё сказано. New(r); r.s := xxx; data := Pointer(r); ... Dispose(PMyRecord(data)); всё. %-)


 
zamtmn ©   (2006-10-10 21:47) [33]

убей не пойму нафиг record? это тожесамое что
r:pstring
New(r); r^ := xxx; data := Pointer(r); ... Dispose(PString(data));
ИМХО pointer(name):=nil будет практичней, при кривом использовании мемлмки теже, а память лишний раз выделять ненадо


 
Ketmar ©   (2006-10-10 21:50) [34]

а вот люблю я record"ы. %-)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.046 c
2-1162208904
Kosh
2006-10-30 14:48
2006.11.19
путь к папке


15-1161882072
Real
2006-10-26 21:01
2006.11.19
cd boot error 0x073 - И винда не сетапится!


15-1162547532
Stanislav1
2006-11-03 12:52
2006.11.19
WinAPI программист


2-1162358799
apic
2006-11-01 08:26
2006.11.19
TPersistent


3-1158774261
anton773
2006-09-20 21:44
2006.11.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский