做了个自定义的控件,可是在编辑之后,数据库中的数据没改。
下面是代码:
功能每隔N位插入一个分隔符,但是数据库中时数据是没有分隔符的,只是显示时候是这样,就样我们在输入银行帐号时,每4位插入一个空格一样不知道那错了?unit LSLotnDBEdit;interfaceuses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Mask, DBCtrls,DB;type
  TLSLotnDBEdit = class(TEdit)
  private
    { Private declarations }
    FSplitChar:Char;
    FInterpos: integer;
    FDataLink: TFieldDataLink;
    FbDel    :Boolean;
    procedure CMGetDataLink(var Msg: TMessage);message CM_GETDATALINK;
    procedure DataChange(Sender: TObject);
    procedure EditingChange(Sender: TObject);
    procedure UpdateData(Sender: TObject);
    function InsertChar(const str:string):string;
    procedure SetInterpos(const Value: integer);
    procedure SetSplitChar(const Value: Char);
    function GetDataField: string;
    function GetDataSource: TDataSource;
    procedure SetDataField(const Value: string);
    procedure SetDataSource(const Value: TDataSource);
    function GetField:TField;
  protected
    { Protected declarations }
    procedure Change;override;
    procedure Notification(AComponent: TComponent;Operation: TOperation);override;
    procedure KeyPress(var Key:Char);override;
  public
    { Public declarations }
    constructor Create(AOwner:TComponent);override;
    destructor Destroy;override;
    property Field:TField read GetField;
  published
    { Published declarations }
    property Interpos:integer read FInterpos write SetInterpos;
    property SplitChar:Char read FSplitChar write SetSplitChar;
    property DataField: string read GetDataField write SetDataField;
    property DataSource:TDataSource read GetDataSource write SetDataSource;
     
  end;procedure Register;implementationprocedure Register;
begin
  RegisterComponents('LSControl', [TLSLotnDBEdit]);
end;{ TLSLotnDBEdit }procedure TLSLotnDBEdit.CMGetDataLink(var Msg: TMessage);
begin
  msg.Result := Integer(FDataLink); 
end;constructor TLSLotnDBEdit.Create(AOwner: TComponent);
begin
  inherited;
  FDataLink:=TFieldDataLink.Create;
  FDataLink.OnDataChange := DataChange;
  FDataLink.OnEditingChange := EditingChange;
  FDataLink.OnUpdateData := UpdateData;
  Interpos := 0;
end;procedure TLSLotnDBEdit.Change;
begin
  if (DataSource <> nil) and (DataField <> '') then
  begin
    if ( Interpos > 0) and Not FbDel then
    begin
     FDataLink.Edit;
     Text:=InsertChar(Text);
     SelStart:=Length(Text);
     //Field.Value:=StringReplace(Text,SplitChar,'',[rfReplaceAll]);
    end;
  end;
  inherited;
end;procedure TLSLotnDBEdit.DataChange(Sender: TObject);
begin
  If (DataSource<>nil) and (DataField<>'') then
  begin
   self.Text := InsertChar(Field.Text);
  end;end;destructor TLSLotnDBEdit.Destroy;
begin
  FDataLink.Free;
  inherited;
end;procedure TLSLotnDBEdit.EditingChange(Sender: TObject);
begin
  if (DataSource <> nil ) and (DataField<>'' ) then
  begin
    FDataLink.Edit;
  end;
end;function TLSLotnDBEdit.GetDataField: string;
begin
  Result:=FDataLink.FieldName;
end;function TLSLotnDBEdit.GetDataSource: TDataSource;
begin
  Result:=FDataLink.DataSource;
end;function TLSLotnDBEdit.GetField: TField;
begin
  Result := FDataLink.Field;
end;function TLSLotnDBEdit.InsertChar(const str: string): string;
var i,j:integer;
    s,part:string;
begin
  j:=1;
  s:=StringReplace(str,SplitChar,'',[rfReplaceAll]);
  for i:= 1 to Length(s) do
  begin
    part:=part+s[i];
    if ( (j mod Interpos) = 0 ) then
      part:=part+SplitChar;
    Inc(j);
  end;
  Result:=part;
//  SelStart:=Length(part);end;procedure TLSLotnDBEdit.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
//  inherited;
  if (Operation = opRemove) and (FDataLink <> nil) and
    (AComponent = DataSource) then
  DataSource := nil;end;procedure TLSLotnDBEdit.SetDataField(const Value: string);
begin
  FDataLink.FieldName:=Value;
end;procedure TLSLotnDBEdit.SetDataSource(const Value: TDataSource);
begin
  FDataLink.DataSource := Value;
  if Value <> nil then
    Value.FreeNotification(self);end;procedure TLSLotnDBEdit.SetInterpos(const Value: integer);
begin
  FInterpos := Value;
end;procedure TLSLotnDBEdit.SetSplitChar(const Value: Char);
begin
  FSplitChar := Value;
end;procedure TLSLotnDBEdit.UpdateData(Sender: TObject);
begin
  if (DataSource <> nil ) and (DataField <> '' ) then
  begin
    Field.Value:=StringReplace(self.Text,self.SplitChar,'',[rfReplaceAll]);
  end;
end;procedure TLSLotnDBEdit.KeyPress(var Key: Char);
begin
  inherited;
  if Key=#08 then FbDel:=True
  else FbDel:=False;
end;end.