![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли c помощью SendMessage передавать строку
i-s-v © (2004-03-19 22:59:00)Здрасте, люди!
Можно ли при помощи функции SendMessage (или какой-то другой, которая отсылает сообщения) передавать в качестве одного из параметров строку? Если да, то как?
Заранее благодарен.
i-s-v (2004-03-27 01:56:00) [1]2 ALL
Все это, конечно, хорошо, но нельзя ли примерчик для WM_COPYDATA?
А то какая-то муть получается вместо строки...
procedure TForm1.WMCOPYDATA;
var
cds: PCOPYDATASTRUCT;
p: PChar;
begin
cds := Pointer(m.LParam);
lstrcpy(p, cds.lpData);
//p := cds.lpData;
if p <> nil
then ShowMessage(p);
end;
Германн (2004-03-23 01:22:00) [2]2 Игорь Шевченко © (20.03.04 12:50) [7]
Да, вопрос действительно остается открытым.
2 Ihor Osov'yak © (21.03.04 18:27) [10]
Ваши доводы понятны. Но они не учитывают того факта, что может быть установлено {$H-}.
Т.е. корректная передача строки (да и не только строки, а вообще чего-либо) через Message.LParam, имхо, должна обязательно подразумевать, что обработчик данного сообщения точно знает, что ему было передано в LParam. А в таком случае зачем какие-либо преобразования типа перед посылкой?
Ihor Osov'yak (2004-03-21 18:27:00) [3]в дополнение Игорь Шевченко © (20.03.04 12:50) [7]
Не поленился, посмотрел сгенерированный компилятором код.
Разница между
SendMessage(Handle, WM_User, 0, LPARAM(PChar(s)));
и
SendMessage(Handle, WM_User, 0, LPARAM(s));
в том, что в первом случае вызывается LStrToPChar, во втором - нет (D4, установки компилятора по дефолту, проверил также в D6 - ситуация аналогична)..
LStrToPChar примечателен тем, что nil преобразовывает в указатель на байт, в котором есть 0. Но поскольку при использовании "чистого" паскаля нельзя скомпилировать s := nil;
s здесь string, то PChar здесь - обычная перестраховка..
Хотя бы от шедевра типа
i := 0;
Move(i, s, sizeof(pointer));
И то, катострофичен ли по последствиям этот шедевр - это будет зависить от реализации обработчика сообщения.. Можно сделать и такую реализацию, что как раз передача nil расценивается допустимой, а вот подмена nil на поинтер, смотрящий на нулевой байт - может стать для программера некоторой неожиданностью..
Зы. Хотя я бы лично написал-бы все же
SendMessage(Handle, WM_User, 0, LPARAM(PChar(s))); - сила привычки и нелюбовь к неявным преобразованиям..
Германн (2004-03-20 17:39:00) [4]2 Artog (20.03.04 16:05) [8]
А какая разница? И так и этак передается в LParam указатель. А на что он указывает без разницы, если на приемном конце известно что это. Кроме того никто не говорил о передаче строки в API функцию.
Artog (2004-03-20 16:05:00) [5]По дефолту в delphi включена директива {$H+}, которая преобразует все строки в nullterminate строки, поэтому отпадает необходимость вызова PChar. Попробуйте сделать {$H-} и передать строку в API функцию, думаю что ничего хорошего не получится.
Игорь Шевченко (2004-03-20 12:50:00) [6]Германн © (20.03.04 02:18)
Вопрос конечно интересный: Пришлось написать простенькое приложение, чтобы обнаружить, что, оказывается, не так уж и обязательно выполнять преобразование PChar(S).
С другой стороны, в непростеньких проектах встречается это преобразование, наверное, неспроста, вполне могли быть какие-то подводные камни, о которых я сейчас не вспомню. Так что вопрос остается открытым.
Германн (2004-03-20 02:18:00) [7]2 Игорь Шевченко © (20.03.04 01:18) [5]
Если не сложно. А для чего?
Игорь Шевченко (2004-03-20 01:18:00) [8]Германн © (20.03.04 01:16)
> нужно ли в свем приложении преобразование PChar(Str)?
Нужно.
Германн (2004-03-20 01:16:00) [9]2 Игорь Шевченко © (19.03.04 23:18) [1]
А нужно ли в свем приложении преобразование PChar(Str)?
2 Алхимик © (19.03.04 23:22) [2]
А при передаче в чужое приложение вариант не пройдет, несмотря на верноподданческие мотивыи отрицание масс-культуры! :))
i-s-v (2004-03-20 00:53:00) [10]Спасибо!
Алхимик (2004-03-19 23:22:00) [11]VAR S : ARRAY[0..40] OF Char;
...
StrCopy(S, 'Путин - президент, децл - лох');
SendMessage(<дескриптор окна>, <сообщение WM...>, 0, LongInt(@S));
Игорь Шевченко (2004-03-19 23:18:00) [12]В свое приложение можно как угодно, в том числе своими сообщениями.
const UM_MYMESSAGE = WM_USER + 10;
SendMessage(MyForm.Handle, UM_MYMESSAGE, 0, LPARAM(PChar(Str)));
например.
В MyForm должен быть обработчки этого сообщения, который знает, что делать со строкой.
В чужое приложение можно специальными сообщениями, например WM_SETTEXT или WM_COPYDATA.