Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2011, 23:04   #1
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
Восклицание Посылка и обработка сообщений Delphi

Задание:
Создать два проекта, из первого во второй передать число типа int, во втором принять его, обработать, вывести на экран сумму цифр числа.

Код:

Проект передачи:

Код:

Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls;

type
  TData = record
      num:integer;
  end;
  TForm2 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    servh:HWND;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
   servh:=FindWindow(nil,'ReciveMsg');
   if servh<>0 then begin
   button1.Caption:=inttostr(servh);
   button1.Enabled:=false;
   button2.Enabled:=true;
    end;
end;

procedure TForm2.Button2Click(Sender: TObject);
var copydata:COPYDATASTRUCT;
    data:TData;
begin
  try
    data.num:=strtoint(edit1.Text);
    copydata.cbData:=sizeof(TData);
    copydata.dwData:=0;
    copydata.lpData:=@data;
    SendMessage(servh,WM_COPYDATA,0,lparam(@copydata));

  except
     messagebox(handle,'Error','While send message',mb_ok+mb_iconerror);
  end;

end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  button1.OnClick(button1);
end;

procedure TForm2.FormShow(Sender: TObject);
begin
randomize;
edit1.Text:=inttostr(random(99));
end;

end.
Проект приема:

Код:
Код:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs,  StdCtrls;

type
  TData = record
      num:integer;
  end;
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label5: TLabel;
    Label6: TLabel;
  private
    procedure RecvData(var Msg:TWMCopyData);message WM_COPYDATA;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.RecvData;
var data:TData;
s:integer;

begin
   data:=TData(msg.CopyDataStruct.lpData^);
   label2.Caption:=inttostR(data.num);

 s:=0;

 while ( data.num<>0 ) do
 begin
  s := s + (data.num mod 10);
  data.num := data.num div 10;
  end;
   label6.Caption:=inttostr(s);
end;
end.
Для передачи использовал:
Код:
Код:
SendMessage(servh,WM_COPYDATA,0,lparam(@copydata));
Препод придрался, и просит переделать используя:
WM_LBUTTONUP

Толком не пойму что он хочет, но как я понял сообщение должно то ли передаваться то ли приниматься при отжатии левой кнопки мыши, или как ?
iCaesy вне форума Ответить с цитированием
Старый 03.11.2011, 00:23   #2
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Как например сделать чтобы проет 2й принимал передаваемое число, но выводил сумму цифр только после отжатия левой кнопки мыши ?

Вот так не работает :
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs,  StdCtrls, Menus;

type
  TData = record
      num:integer;
  end;
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label5: TLabel;
    Label6: TLabel;
  private
    //procedure RecvData(var Msg:TWMCopyData);message WM_COPYDATA;

         procedure WMLButtonUP(var Msg : TWMMouse); message
WM_LBUTTONUP;

  public
    { Public declarations }
    procedure RecvData(var Msg:TWMCopyData);message WM_COPYDATA;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.RecvData;
var data:TData;
s:integer;

begin
   data:=TData(msg.CopyDataStruct.lpData^);
   label2.Caption:=inttostR(data.num);
end;

procedure TForm1.WMLButtonUP(var Msg : TWMMouse);
var s:integer; data:Tdata;
begin
    s:=0;
    while ( data.num<>0 ) do
  begin
    s := s + (data.num mod 10);
    data.num := data.num div 10;
  end;
   label6.Caption:=inttostr(s);

end;

end.
iCaesy вне форума Ответить с цитированием
Старый 06.11.2011, 01:49   #3
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

ап ( 10 символов
iCaesy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
посылка сообщений между экземплярами классов. vsrmis Паскаль, Turbo Pascal, PascalABC.NET 7 01.08.2011 20:38
спонтанная ошибка при синхронизации потока Thread и основного приложения(Посылка сообщений) Человек_Борща Общие вопросы Delphi 2 14.05.2011 22:25
Посылка пользовательских сообщений в чужое приложение RFbager Win Api 8 11.01.2011 20:51
Посылка сообщений Windows другой программе shurik_7866 Win Api 1 23.10.2008 16:25