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


Автор: Ptica_Oz 1.6.2007, 07:19
на форме лежит компанент TStringGrid в ячейки которого надо вводить числа. при обработке события KeyPress я могу запретить пользователю вводить буквы и пр., но хитрый пользователь может вставить текст из буфера! как предотвратить такое подлое поведение со стороны пользователя?  smile 
изначально в ячейке стоит 0, хорошо бы что бы он там и оставался при вызове пользователем команды "Вставить" из контекстного меню, а ещё лючше если можно проводить анализ вставляемого текста и если это число, то вставлять его, а если нет, то не вставлять
направте на путь истинный...

Автор: Sunvas 1.6.2007, 18:57
Вот, набросал на примере Эдита - будут вставляться только числа. Может можно оптимизировать.
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function NewEditProc(wnd:HWND; uMsg:UINT; wParam:WPARAM; lParam:LPARAM):integer; stdcall;
var  T: TClipboard;
     olds,s:string;
     i:word;
begin
 if uMsg=wm_paste then
 begin
   T:=TClipboard.Create;
   olds:=T.AsText;
   s:=olds;
   for i:=length(s) downto 1 do
    begin
      if not (s[i] in ['0'..'9']) then delete(s,i,1);
    end;
   t.AsText:=s;
   result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,uMsg,wParam,lParam);
   t.AsText:=olds;
   T.Free;
 end else
   result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,uMsg,wParam,lParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(edit1.Handle,GWL_USERDATA,SetWindowLong(edit1.Handle,GWL_WNDPROC, LPARAM(@NewEditProc)));
end;

end.


Автор: Ptica_Oz 4.6.2007, 06:08
Sunvas, спасибо, пример хороший и на Эдите работает замечательно, только вот на TStringGrid'е нет  smile не срабатывает условие if uMsg=wm_paste then. подскажите как быть?

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