form1上有memo和edit,如何使得在edit上产生的所有键盘输入(包括A,B,C,...和各种控制符(回车,换行等),或者shift+/(组合键得到字符?))在memo上得到完全的模拟,最后效果是memo上的text和edit上的text是一样的。
   希望大家给出完整过程。

解决方案 »

  1.   

    text是一样的就很简单
    OnChange中
    Memo.Text:=Edit.Text
      

  2.   

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      Memo1.Perform(WM_CHAR, WParam(Key), 0);
    end;
      

  3.   

    ly_liuyang(Liu Yang),我要的是实现上述过程的算法,而不是程序表现出来的结果
      

  4.   

    forgetter() 的方法解决不了控制符问题
      

  5.   

    getkey
    text里每次keypress时间都捕捉,然后把取得的字符add到memo不就完了吗?
    我好像不太懂你的问题
      

  6.   

    我给你一个例证好好看看:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Button2: TButton;
        Button4: TButton;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Edit1KeyPress(Sender: TObject; var Key: Char);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    uses ShellAPI;
    {$R *.DFM}procedure SendShift(H: HWnd; Down: Boolean);
    var
       vKey, ScanCode: Word;
       lParam: longint;
    begin
        vKey:= $10;
        ScanCode:= MapVirtualKey(vKey, 0);
        lParam:= longint(ScanCode) shl 16 or 1;
        if not(Down) then
           lParam:= lParam or $C0000000;
        SendMessage(H,WM_KEYDOWN, vKey, lParam);
    end;procedure SendCtrl(H: HWnd; Down: Boolean);
    var
       vKey, ScanCode: Word; //wParam
       lParam: longint;
    begin
        vKey:= $11;
        ScanCode:= MapVirtualKey(vKey, 0);{虚拟键转换为扫描码}
        lParam:= longint(ScanCode) shl 16 or 1;
        if not(Down) then
           lParam:= lParam or $C0000000;
        SendMessage(H,WM_KEYDOWN, vKey, lParam);
    end;procedure SendKey(H: Hwnd; Key: char);
    var
      vKey, ScanCode, wParam: Word;
      lParam, ConvKey: longint;
      Shift, Ctrl: boolean;
    begin
        ConvKey:= OemKeyScan(ord(Key));
        Shift:= (ConvKey and $00020000) <> 0;
        Ctrl:= (ConvKey and $00040000) <> 0;
        ScanCode:= ConvKey and $000000FF or $FF00;
        vKey:= ord(Key);
        wParam:= vKey;
        lParam:= longint(ScanCode) shl 16 or 1;
        if Shift then SendShift(H, true);
        if Ctrl then SendCtrl(H, true);
        SendMessage(H, WM_KEYDOWN, vKey, lParam);
        SendMessage(H, WM_CHAR, vKey, lParam);
        lParam:= lParam or $C0000000;
        SendMessage(H, WM_KEYUP, vKey, lParam);
        if Shift then SendShift(H, false);
        if Ctrl then SendCtrl(H, false);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      pt: TPoint;
    begin
        pt:= edit1.ClientToScreen( Point( 4,4 ));
        SetCursorPos( pt.x, pt.y );
        mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
        mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );  
        mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
        mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
        SendMessage(edit1.Handle,WM_LBUTTONDOWN ,0,0);
    end;procedure TForm1.Button4Click(Sender: TObject);
    begin
        SendKey(edit1.handle, 'T');
        SendKey(edit1.handle, 'e');
        SendKey(edit1.handle, 's');
        SendKey(edit1.handle, 't');
    end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
       SendKey(edit2.Handle, Key);
    end;end.
      

  7.   

    forgetter() 你敲个在edit那里敲个;号,memo里只会出现?
      

  8.   

    coolfilm(苏飞工作室) 的方法解决了大部分问题,但像del,insert之类的键就没办法了
      

  9.   

    forgetter() 你的办法跟coolfilm(苏飞工作室)的效果一样,刚才错怪你了,不好意思
     但是你们的方法对于以下一些情况没用
     比如按左右键光标移动
     比如按delete键,Insert键
      

  10.   

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      Memo1.Perform(WM_CHAR, WParam(Key), 0);
    end;procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      Memo1.Perform(WM_KEYDOWN, WParam(Key), 0);
    end;procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      Memo1.Perform(WM_KEYUP, WParam(Key), 0);
    end;
      

  11.   

    Keybd_Event(Byte(VK_ESCAPE),KEYEVENTF_KEYUP,0,0);上面的命令就是模拟按下ESC键,但是实际并没有按下。