IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> передача сообщений, delphi xe2
18192123
сообщение 19.07.2012 13:17
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Доброго времени суток!

Имеется два приложения (запускаются одновременно, условно их назову 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 нормально передается..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 19.07.2012 15:06
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Кто ж так посылает строки? Строка - это дельфийский класс, с ней 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 здесь не нужна.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 10.08.2025 2:44
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"