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

Вниз

Как вытащить текст из ListBox?   Найти похожие ветки 

 
Alexander ©   (2002-05-11 19:14) [0]

пишу так:
function ListBox_GetText(hWndDlg: HWnd; Id: Word; Index: Integer): string;
var
Len: Integer;
Txt: PChar;
begin
Len := SendMessage(GetDlgItem(hWndDlg, Id), LB_GETTEXTLEN, Index, 0);
GetMem(Txt, Len);
SendMessage(GetDlgItem(hWndDlg, Id), LB_GETTEXT, Index, Integer(@Txt));
Result := Txt;
FreeMem(Txt);
end;

что-то не так я делаю во втором вызове SendMessage, но вот что?


 
Almaz ©   (2002-05-11 23:44) [1]

Пишите так:

function ListBox_GetText(hWndDlg: HWnd; Id: Word; Index: Integer): string;
var
Len: Integer;
Txt: PChar;
begin
Len := SendMessage(GetDlgItem(hWndDlg, Id), LB_GETTEXTLEN, Index, 0);
GetMem(Txt, Len);
SendMessage(GetDlgItem(hWndDlg, Id), LB_GETTEXT, Index, Integer(Txt));
Result := Txt;
end;


Удачи.


 
Alexander ©   (2002-05-12 13:54) [2]

Нет, так тоже самое - возвращается пустая строка, хотя Len верная. Да и память так тратится.


 
Alexander ©   (2002-05-13 11:25) [3]

Может тут GetMem и не нужен?


 
Alexander ©   (2002-05-13 15:20) [4]

Я уже и так попробовал - результат тот-же
SendMessage(GetDlgItem(hWndDlg, Id), CB_GETLBTEXT, Index, Integer(Txt));

Может кто всё-таки подскажет, что я не так делаю?



 
Raptor ©   (2002-05-13 21:53) [5]

Вроде все у тебя правильно и должно работать. Например у меня всегда 100% работает такой код:

Var wnd:HWND;
buf:Array[0..255] of Char;
s:String;
Index:Iteger;
Begin
Index:=1; //индекс требуемого элемента ListBox-а
wnd:=<хендл ListBox-а>;
SendMessage(wnd, LB_GETTEXT, Index, Integer(@buf));
s:=buf;
........................
End;

Проверь, возможно GetDlgItem(hWndDlg, Id) возвращает не тот хендл.


 
anod ©   (2002-05-13 23:23) [6]

szScrSize : PCHAR;


GetMem(szScrSize, 256);
SendMessage(LISTBOX2,LB_GETTEXT, i, integer(szScrSize));
FreeMem(szScrSize,256);

работает отлично


 
Almaz ©   (2002-05-14 00:35) [7]


> Alexander © (12.05.02 13:54)
> Нет, так тоже самое - возвращается пустая строка, хотя Len
> верная. Да и память так тратится.


А что строка вам не нужна ??? Она же у вас никуда не копируется! Вы выделяете память, копируетет туда строку, а затем отдаете память обратно вместе со строкой, или вы думаете, что Result := Txt; скопирует строку в Result ? Так это не так. А то, что вы еще не получили Access Violation после использованиия результата своей функции - так это, IMHO, специфика менеджера памяти Delphi.

p.s. Я проверил свой код - работает 100%

Удачи.


 
Evgeny ©   (2002-05-14 10:03) [8]

>Almaz
Память все-таки нужно отдавать системе обратно.

Реально, более правильный код привел Raptor. Если есть желание использовать код Приведенный Almaz`ом, то концовку требуется подправить.

var
S : String;
....
код Almaz`а
...

S := Txt;
FreeMem(Txt);
Result := S;

end;



 
Almaz ©   (2002-05-14 23:39) [9]


> Evgeny © (14.05.02 10:03)

Насчет памяти - вы правы, не посмотрел я сначала, что Result - типа String. В таком случае дейслвительно Delphi скопирует данные в строку.
Однако концовку можно поправить и без лишней переменной S - она не нужна.

Result := Txt;
FreeMem(Txt);


Удачи.


 
KSergey ©   (2002-05-15 16:34) [10]

Alexander , еще явная ошибочка у вас с выделяемым буфером: по LB_GETTEXTLEN возвращается длина строки, но без завершающего нулевого символа, а LB_GETTEXT подразумевае, что в буфере есть место для записи завершающего нулевого символа для C-шной строки
Таким образом:

GetMem(Txt, Len +1);


 
Alexander ©   (2002-05-15 16:55) [11]

Всем спасибо. Сам разобрался. Реально работает такой код, я просто хэндл не тот (не листбоксовский) пихал.

function ListBox_GetText(hWndDlg: HWnd; Id: Word; Index: Integer): string;
var
Len: Integer;
Txt: PChar;
begin
Len := SendMessage(GetDlgItem(hWndDlg, Id), LB_GETTEXTLEN, Index, 0);
GetMem(Txt, Len + 1);
SendMessage(GetDlgItem(hWndDlg, Id), LB_GETTEXT, Index, Integer(Txt));
Result := Txt;
FreeMem(Txt);
end;


 
KSergey ©   (2002-05-16 07:49) [12]

Так, некоторое замечаньице, если позволите
Прям рядом, в ветке
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1021317628&n=5
есть пример как возвращать строку в Result, не используя доп. буфер в памяти.
В кратце:
- выделяем память:
dwKeySize: DWORD;
SetLength( Result, dwKeySize );

- передаем ссылку на Result:
PByte(PChar(Result))



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

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

Наверх




Память: 0.49 MB
Время: 0.011 c
3-47144
Jony
2002-06-18 16:03
2002.07.15
Работа с картинками *.jpg в Delphi/MS SQL


14-47794
Snake2000
2002-06-14 06:29
2002.07.15
TV-тюнер без FM-приемника


14-47705
nejest
2002-06-18 22:56
2002.07.15
Где достать книгу Исскуство Программирования Дональда Кнута


1-47511
Cherepovets
2002-07-04 14:43
2002.07.15
Поподробнее про Toolbar в MDI


1-47312
Raiv
2002-07-01 09:47
2002.07.15
Как включить dll файл в свой exe