Текущий архив: 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.47 MB
Время: 0.01 c