Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Отправка текста из одного приложение в другое


Автор: Leos 27.6.2006, 14:24
У меня такой вопрос:
пусть у меня имеются 2 приложения (которые я разрабатываю)

приложение 1:
  есть две формы, одна главная - видна,  а вторая - некоторое диалоговое окно с Memo1 (вторая форма вызывается по некоторой процедуре); вторая форма изначально не видна

приложение 2: там есть кнопка по нажатию на которую нужно: как-то связаться с приложением 1, открыть в нём его форму 2 (возможно по той некоторой процедуре) и в находящийся там Memo1 вставить некоторый текст.
Как такое можно осуществить? 

Автор: Alexeis 27.6.2006, 14:30
Такое возможно осуществить при помощи DDE
А синхронизацию произвести при помощи отправки user сообщений 

Автор: Sunvas 30.6.2006, 01:32
Можешь сокетами поигаться - адрес компьюетра ставишь localhost. Есть, конечно и другие методы, но этот помоиму самый продуктивный. Сокетами будет удобно, но если будет стоят фаервол - то неудастся соедениться.  

Автор: Yanis 30.6.2006, 09:31
Leos
Для простой передачи строки можно и без DDE обойтись. В отправителе пишешь такой код:
Код
var
  cds: TCopyDataStruct;
  hRecipient: HWND;
begin
  with cds do
    begin
      dwData := 0;
      cbData := StrLen(PChar(Edit1.Text)) + 1;
      lpData := PChar(Edit1.Text)
    end;

  // ноходим окно получателя
  hRecipient := FindWindowEx(0, 0, 'TForm1', PChar('Form2'));
  if hRecipient <> 0 then
    SendMessage(hRecipient, WM_COPYDATA, Longint(Handle), Longint(@cds))
  else
    ShowMessage('Получатель не найден!');
end;

а в получателе пишешь так:
Код
type
  TForm2 = class(TForm)
    Label1: TLabel;
  private
    { Private declarations }
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
  public
    { Public declarations }
  end;

{ ... }

procedure TForm2.WMCopyData(var Msg: TWMCopyData);
var
  sText: array[0..99] of Char;
begin
  StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
  Label1.Caption := sText;
end;
 

Автор: Leos 8.7.2006, 23:53
Всем спасибо. Здесь я применил com-технологию и основную задачу решил, правда появились некоторые вопросы по com, но это уже не для этого топика. 

Автор: Agent_Smit 13.3.2007, 20:34
а как сие можно сделать через Pipe ?

p.s. попробовал вышеприведённый код - нифига не работает =(((

Автор: Yanis 14.3.2007, 10:00
Цитата(Agent_Smit @  13.3.2007,  21:34 Найти цитируемый пост)
p.s. попробовал вышеприведённый код - нифига не работает =(((

У всех видите ли работает, а у тебя нет smile Значит что то сделал неправильно. Показывай код.

Автор: Agent_Smit 27.3.2007, 02:19
код отправителя

Код


unit Unit1_main;

interface

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

type
  Tmain_Form1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  main_Form1: Tmain_Form1;

implementation

{$R *.dfm}

procedure Tmain_Form1.Button1Click(Sender: TObject);
var
  cds: TCopyDataStruct;
  hRecipient: HWND;
begin
with cds do
    begin
      dwData := 0;
      cbData := StrLen(PChar(Edit1.Text)) + 1;
      lpData := PChar(Edit1.Text)
    end;
  // ноходим окно получателя
  hRecipient := FindWindowEx(0, 0, 'TForm1', PChar('Form2'));
  if hRecipient <> 0 then
    SendMessage(hRecipient, WM_COPYDATA, Longint(Handle), Longint(@cds))
  else
    ShowMessage('Получатель не найден!');
end;

end.



код получателя

Код


unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
  private
    { Private declarations }
  public
     procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.WMCopyData(var Msg: TWMCopyData);
var
  sText: array[0..99] of Char;
begin
  StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
  Label1.Caption := sText;
end;

end.




форма получателя вызывается через другую форму путём динамического создания этой формы... код получателя и отправителя нахдятся в разных проектах и ни чем не связаны... запускаю просто два екзешника и проверяю - не пашет... 



да и ещё один вопросец.. а можно всё это реализовать через сокеты?

Автор: Yanis 27.3.2007, 08:16
Неправильно:
Цитата(Agent_Smit @  27.3.2007,  03:19 Найти цитируемый пост)
hRecipient := FindWindowEx(0, 0, 'TForm1', PChar('Form2'));


Правильно:
Цитата(Agent_Smit)
hRecipient := FindWindow('TForm2', PChar('Form2'));

Автор: MetalFan 27.3.2007, 08:18
Цитата(Agent_Smit @  27.3.2007,  02:19 Найти цитируемый пост)
hRecipient := FindWindowEx(0, 0, 'TForm1', PChar('Form2'));

тут как бы надо определиться... у тебя там Form1 или Form2 ;)

Автор: Yanis 27.3.2007, 08:18
Почувствуйте разницу, как говорится smile

Цитата(Agent_Smit @  27.3.2007,  03:19 Найти цитируемый пост)
да и ещё один вопросец.. а можно всё это реализовать через сокеты? 

Можно, если нарвятся трудности, как в изветном анекдоте smile
Но я бы наверное на пайпах сделал.

Автор: Agent_Smit 31.3.2007, 01:07
to Yanis спасибо теперь работает...

а на пайпах как сделать?

и ещё маленький вопрос... как мне из одного проекта из компонерта Image1 перекинуть изображение (в формате bmp) в другой проект, в  базу данных и отобразить  его в компоненте DBImage ??

по возможности ответьте пожалуйста на эти 2 вопроса... буду премного благодарен...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)