Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

За 2005-03-14

Delphi чтение текста WINAPI

> i:=SendMessage(h,WM_GETTEXTLENGTH,0,0);
> i:=GetWindowText(h, st, i);

Это всё правильно. Но: переведённая мною цитата из MSND - "приложения
посылают сообщение WM_GETTEXTLENGTH для определения длины текста,
ассоциированного с окном, в символах". Если окно является обычным окном, то
ассоциированным текстом является его заголовок, если стандартным контролом,
то им является текст в этом окне, в зависимости от типа контрола: кнопки
возвращают текст на себе (OK или Cancel, например), списки возвращают текст
"подсвеченно" элемента итп. То же относится и к функции GetWindowText().
Описанная тобой ситуация похожа на то, что у тебя собственные, созданные
тобой дочерние окна, которые обслуживаются не ОС, а твоим приложением, и при

этом не имеющие заголовков. Если ты намеревался таким образом получить
текст, отображаемый в окне, как например отображает набранный в документе
текст MS Word, то вынужден огорчить: ничего не получится. ОС не запоминает,
что приложение рисует в своём окне. Этот текст НЕ СТАНОВИТСЯ ассоциированным

с окном, хотя бы потому, что там кроме текста могут быть ещё и изображения.
Вместо этого она посылает приложению сообщение о необходимости перерисовать
такое-то окно (WM_PAINT), и приложение само должно это сделать. Это сделано
из соображений экономии системных ресурсов: проще приложению сохранять
состояние своего окна наиэкономнейшим способом (например, программист может
просто запоминать текст в массиве строк, чтобы по запросу вновь его
перерисовать какими-нибудь DrawText()-ами), вместо того чтобы ОС запоминала
целый битовый образ окна, временно "затираемого" другими окнами. Это ещё и
быстрее на порядок будет, если программист не ламер последний, конечно. Это
всё азбука Windows-программирования, но если ты используешь что-нибудь типа
VCL, то ты вполне может этого и не знать, ибо эта библиотека сама заботится
обо всех подобных нюансах (точнее, заботятся её канвы - Canvas), если только

ты явно не программируешь иным образом.
Чтобы решить эту проблему, тебе нужно будет или самому обрабатывать
сообщения WM_GETTEXTLENGTH и WM_GETTEXT в своих дочерних окнах, или
использовать собственные сообщения, из разряда WM_USER, что лучше, ибо в
этом случае они не будут пересекаться со стандартными WM_GETTEXTLENGTH и
WM_GETTEXT, предназначенными вообще-то для других и вполне определённых
целей.
Кстати, "по настояшему" профессиональные программисты на Builder-е и Delphi
редко используют канвы на полную катушку из сображений экономии системных
ресурсов. Канва ведь всё равно в общем случае не может сохранить свой
констекст иначе, как битовое изображение. Представь, если MS Word будет
сохранять 200-страничный документ в виде Bitmap-а, да ещё с "принтерным"
разрешением 600 dpi, а не 96 или 120, как на большинстве мониторов.

--
С уважением, boroda
mailto:boroden***@s*****.ru

Номер выпуска : 4138
Возраст листа : 540 (дней)
Количество подписчиков : 527
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/332780
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

   Шматко А.А. 2005-03-14 21:36:04 (#332780)

Re[4]: Delphi чтение текста WINAPI

Здравствуйте, Victor.

Вы писали 14 марта 2005 г., 10:02:17:

VVV> А h чему равен ? Не nil ?

Нет, h>0 Более того посылка wm_settext в тот же hendel приводит к замене текста!

   2005-03-14 17:51:14 (#332642)

FoxPro: rак удалить файл таблицы с жёсткого диска?

Добрый день!
В общем-то всё описано в теме.

С уважением, Бурляев Вячеслав

Номер выпуска : 4136
Возраст листа : 540 (дней)
Количество подписчиков : 527
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/332575
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

   2005-03-14 14:53:05 (#332575)

Re[3]: Delphi чтение текста WINAPI

Здравствуйте !

> Более полный отрезок функции
> h:=GetNextWindow(h, GW_CHILD);

А h чему равен ? Не nil ?

--
С уважением, Вахтуров Виктор.

Номер выпуска : 4135
Возраст листа : 540 (дней)
Количество подписчиков : 527
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/332273
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

   2005-03-14 07:02:12 (#332273)

Re[2]: Delphi чтение текста WINAPI

Здравствуйте, Victor.

Вы писали 14 марта 2005 г., 2:03:47:

VVV> Есть API функция GetWindowTextLength - как раз возвратит
VVV> длину текста окна. Ей надо передать дескриптор окна.
VVV> то есть:
VVV> i:=SendMessage(h);
VVV> Хотя, честно говоря, непонятно, почему не получается с WM_GETTEXTLENGTH.
VVV> Может, дочернее окно - комбобокс, где ничего не выбрано, или еще что ?

VVV> Также следует учесть, что длина st должна быть не меньше i.
VVV> Третий параметр, передаваемый в GetWindowText - максимальная длина буфера,
VVV> переданного вторым параметром. То есть память должна быть уже выделена
VVV> (это так, на всякий случай).

VVV> --
VVV> С уважением, Вахтуров Виктор.

Более полный отрезок функции

h:=GetNextWindow(h, GW_CHILD);
i:=GetWindowTextLength(h);
for e:=1 to i do ss:=ss+' '; // i=0!
st:=PChar(ss);
i:=GetWindowText(h, st, i);

Окно типа TMemo, и текст есть!

   2005-03-14 03:35:28 (#332253)