![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
18192123 |
![]()
Сообщение
#1
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Доброго времени суток!
Имеется два приложения (запускаются одновременно, условно их назову interf и mainprog). При наведении мыши на некоторый элемент приложения interf второму приложению отправляется сообщение.
type
PrMessage = record
flTHelper: boolean;
TextHelper: string;
end;
//..
serviceMessage: PrMessage;
//...
procedure TForm1.SendMessageToMainProgram;
var
MesData: tCOPYDATASTRUCT;
begin
MesData.lpData := @serviceMessage;
MesData.cbData := sizeof(serviceMessage);
SendMessageA(mainHwnd, WM_COPYDATA, 0, integer(@MesData));
end;
procedure TForm1.Image14MouseEnter(Sender: TObject);
begin
Rectangle19.Visible := true;
serviceMessage.flTHelper := true;
serviceMessage.TextHelper := 'подсказка 1';
SendMessageToMainProgram;
end;
procedure TForm1.Image14MouseLeave(Sender: TObject);
begin
Rectangle19.Visible := false;
serviceMessage.flTHelper := false;
SendMessageToMainProgram;
end;
В приложении mainprog переданное сообщение выводится в компонент JvStaticText.
procedure TForm1.GetMessages(var Msg: TWMCopyData);
var
mes: ^PrMessage;
begin
application.MainForm.WindowState := twindowstate(0);
mes := Msg.CopyDataStruct.lpData;
if mes.flTHelper then
FormHelper.JvStT.Caption := mes.TextHelper
else
FormHelper.JvStT.Caption := ' ';
end;
Проблема в том, что в JvStaticText в итоге ничего не отображается. Вместо заполнения Caption пробовала назначить другое действие (скрытие/отображение формы FormHelper), сработало, по-видимому флаг flTHelper нормально передается.. |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Кто ж так посылает строки? Строка - это дельфийский класс, с ней WinAPI не умеет работать. Вот это:
// Отсылка WM_COPYDATA
procedure TForm2.SendMessageToMainProgram(b : boolean; s : string);
var
MesData: TCopyDataStruct;
begin
MesData.dwData := Ord(b);
MesData.cbData := Length(s) * sizeof(char);
MesData.lpData := PChar(s);
SendMessage(mainHwnd, WM_COPYDATA, 0, LPARAM(@MesData));
end;
procedure TForm2.Image1MouseEnter(Sender: TObject);
begin
SendMessageToMainProgram(true, 'подсказка 1');
end;
procedure TForm2.Image1MouseLeave(Sender: TObject);
begin
SendMessageToMainProgram(false, '');
end;
// Прием WM_COPYDATA
procedure TForm1.GetMessages(var Msg: TWMCopyData);
var
s : string;
Len : Integer;
begin
Application.MainForm.WindowState := TWindowState(0);
if Boolean(Msg.CopyDataStruct.dwData) then
begin
Len := Msg.CopyDataStruct.cbData div SizeOf(Char);
SetLength(s, Len);
Move(PChar(Msg.CopyDataStruct.lpData)^, PChar(s)^, Len * SizeOf(Char));
Self.StaticText1.Caption := s;
end
else
Self.StaticText1.Caption := '';
end;
работает прекрасно... Да, ты правильно поняла. Структура PrMessage здесь не нужна. |
![]() ![]() |
![]() |
Текстовая версия | 10.08.2025 2:44 |