Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.19;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.033 c
9-1134845898
QwertyKz
2005-12-17 21:58
2006.11.19
http://www.gamemaker.nl/


1-1159992500
Альберт
2006-10-05 00:08
2006.11.19
TWebBrowser с собственными настройками


1-1160498919
Olleg_ator
2006-10-10 20:48
2006.11.19
Проблема при формировании отчета в Excel


2-1162495674
daser
2006-11-02 22:27
2006.11.19
Что неправильно в запросе?


2-1162205363
regdown
2006-10-30 13:49
2006.11.19
Помогите с Паскалем