Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];

Вниз

Как вытащить текст из 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.012 c
3-47090
Dim!S
2002-06-21 13:07
2002.07.15
Interbase литература, утилиты


3-47135
Gari
2002-06-24 10:54
2002.07.15
Вопрос по Oracle


1-47430
Alexander
2002-07-02 13:52
2002.07.15
Пытаюсь зашифровать файл функцией EncryptFile.


3-47143
Deschanel
2002-06-18 18:44
2002.07.15
delphi+mssql+ado


1-47283
Floyd
2002-06-30 11:43
2002.07.15
ListBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский