做了个自定义的控件,可是在编辑之后,数据库中的数据没改。
下面是代码:
功能每隔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.
下面是代码:
功能每隔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.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货