2013-06-21 37 views
7

Đối với thành phần TEdit, liệu thành phần có thể xử lý dán nhiều dòng từ Windows Clipboard bằng cách chuyển đổi ngắt dòng thành dấu cách không?Dán nhiều dòng vào một TEdit

Nói cách khác, nếu các dữ liệu sau đây là trên Windows Clipboard:

Hello 
world 
! 

... và người dùng đặt con trỏ của họ trong một TEdit sau đó nhấn tổ hợp phím CTRL + V, nó sẽ có thể để có TEdit hiển thị đầu vào là:

Xin chào mọi người!

Trả lời

12

Bạn sẽ cần phải phân lớp các TEdit sử dụng một lớp interposer, và thêm một handler cho WM_PASTE nhắn:

unit Unit3; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, DB, adsdata, adsfunc, adstable; 

type 
    TEdit= class(StdCtrls.TEdit) 
    procedure WMPaste(var Msg: TWMPaste); message WM_PASTE; 
    end; 

type 
    TForm3 = class(TForm) 
    AdsTable1: TAdsTable; 
    Edit1: TEdit; 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form3: TForm3; 

implementation 

{$R *.dfm} 

uses 
    Clipbrd; 

{ TEdit } 

procedure TEdit.WMPaste(var Msg: TWMPaste); 
var 
    TempTxt: string; 
begin 
    TempTxt := Clipboard.AsText; 
    TempTxt := StringReplace(TempTxt, #13#10, #32, [rfReplaceAll]); 
    Text := TempTxt; 
end; 

end. 
+6

Và nếu bạn có một trường hợp cụ thể và bạn cảm thấy subclassing là quá mức cần thiết, bạn có thể gán một xử lý tin nhắn mới cho 'YourEdit.WindowProc'. – GolezTrol