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

Вниз

мессага для listview   Найти похожие ветки 

 
redlord   (2006-05-24 18:38) [0]

привет всем
народ подскажите почему приведенный ниже код приводит к критичесской ошибке памяти в kernel32.dll

lvitem.cchTextMax:=20;
lvitem.iSubItem:=1;
lvitem.pszText:="";

hndcontrol:=form1.ListView1.Handle;
Count:=SendMessage(hndcontrol, LVM_GETITEMCOUNT, 0, 0);
for i := 0 to Count-1 do
begin
q:=SendMessage(hndcontrol,LVM_GETITEMTEXT, 1, intege(@LVItem));
if q <> 0 then
ListBox1.Items.Add(LVItem.pszText)
else
ListBox1.Items.Add("error");
end;


 
GanibalLector ©   (2006-05-24 18:49) [1]

1) Структуру LVITEM нужно инициализировать.Т.е. нужно выделить память для буфера, который будет принимать текст.
2) сделать проверку для Count. Он должен быть больше 0


 
redlord   (2006-05-24 18:57) [2]

lvitem.cchTextMax:=20;
lvitem.iSubItem:=1;
lvitem.pszText:="";

после всего етого она не инициализирована (
обьясните как ее инициализировать


 
GanibalLector ©   (2006-05-24 19:03) [3]


GetMem(Item.pszText, MaxLength);// где MaxLength например константа=$ff
  try
    Item.cchTextMax := MaxLength;
    Item.iSubItem := 0;
    repeat
      Dec(I);
      Item.iItem := I;
      SendMessage(ListView.Handle, LVM_GETITEMTEXT, I, Integer(@Item));
      MessageBox(0, Item.pszText, "Preved", MB_OK);
    until I = 0;
  finally
    FreeMem(Item.pszText)
  end


 
begin...end ©   (2006-05-24 21:20) [4]

> GanibalLector ©   (24.05.06 19:03) [3]

Я бы сделал немного по-другому:

var
 P: PChar;
begin
 GetMem(P, ...);
 try
   Item.pszText := P;
   ...
 finally
   FreeMem(P)
 end
end


Цитата из MSDN:

If the LVIF_TEXT flag is set in the mask member of the LVITEM structure, the pszText member must point to a valid buffer and the cchTextMax member must be set to the number of characters in that buffer. Applications should not assume that the text will necessarily be placed in the specified buffer. The control may instead change the pszText member of the structure to point to the new text, rather than place it in the buffer.

Т.е. ListView вместо заполнения выделенного нами буфера может изменить значение поля pszText, поместив в него адрес какого-либо своего готового буфера с текстом. И тогда код из [3] даст, во-первых, утечку памяти (потому что указатель на выделенный нами буфер мы потеряли), а во-вторых -- ошибку при попытке освобождения памяти по адресу Item.pszText (потому что мы её не выделяли).

И хотя это примечание из MSDN относится к сообщению LVM_GETITEM, вероятно, следует обращать на него внимание и в случае LVM_GETITEMTEXT.



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

Текущий архив: 2006.07.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.046 c
2-1150265000
Maxim_82
2006-06-14 10:03
2006.07.02
Помогите установить компонеты DSPack


1-1148481499
redlord
2006-05-24 18:38
2006.07.02
мессага для listview


3-1146733389
vantage-10
2006-05-04 13:03
2006.07.02
Полечение первого и последнего поля


4-1143642145
oleon
2006-03-29 18:22
2006.07.02
Какое событие случается во время запуска ScreenSaver.


11-1129717517
DmiSb
2005-10-19 14:25
2006.07.02
Как проверить, кто получил фокус при его потере в EditBoxe ?