Главная страница
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.5 MB
Время: 0.026 c
4-47860
stainer a
2002-05-10 01:04
2002.07.15
очень интересный вопрос


14-47756
любитель
2002-06-13 09:49
2002.07.15
Нужна песня группы Лето Февраль


14-47711
lak_b
2002-06-12 12:27
2002.07.15
Дающий жизнь - посвящается всем разработчикам комп. игр


1-47560
MikeGavrilov
2002-06-28 10:51
2002.07.15
Проблема с Qreport и изображениями


3-47223
artbdk
2002-06-20 10:23
2002.07.15
access.mdb + php