unit CDConvetor;interfaceuses Windows, Messages, SysUtils, Classes, DB;type TConvertType = (ctNone, ctGB2BIG5, ctBIG52GB); TChineseDataConvetor = class (TComponent) private FDataSet:TDataSet; FActive:Boolean; FInputConvert:TConvertType; FOutputConvert:TConvertType; FOldOnDataSetAfterOpen:TDataSetNotifyEvent; protected procedure SetDataSet(AValue:TDataSet); procedure OnDataSetAfterOpen(DataSet:TDataSet); procedure OnFieldGetText(Sender:TField;var Text:String;DisplayText:Boolean); procedure OnFieldSetText(Sender:TField;const Text:String); public constructor Create(AOwner:TComponent);override; destructor Destroy();override; published property DataSet:TDataSet read FDataSet write SetDataSet; property Active:Boolean read FActive write FActive default true; property InputConvert:TConvertType read FInputConvert write FInputConvert default ctGB2BIG5; property OutputConvert:TConvertType read FOutputConvert write FOutputConvert default ctBIG52GB; end;procedure Register;implementationuses CVCode;procedure Register; begin RegisterComponents ('Standard', [TChineseDataConvetor]); end;{ TChineseDataConvetor }procedure TChineseDataConvetor.SetDataSet(AValue:TDataSet); begin if FDataSet<>AValue then begin if Assigned(FDataSet) then begin FDataSet.AfterOpen:=FOldOnDataSetAfterOpen; end; FDataSet:=AValue; if Assigned(FDataSet) then begin FOldOnDataSetAfterOpen:=FDataSet.AfterOpen; FDataSet.AfterOpen:=OnDataSetAfterOpen; end; end; end;procedure TChineseDataConvetor.OnDataSetAfterOpen(DataSet:TDataSet); var I:Integer; begin if Assigned(FOldOnDataSetAfterOpen) then begin FOldOnDataSetAfterOpen(DataSet); end; for I:=0 to DataSet.Fields.Count-1 do begin DataSet.Fields[I].OnGetText:=OnFieldGetText; DataSet.Fields[I].OnSetText:=OnFieldSetText; end; if not DataSet.Eof then begin DataSet.First; end; end;procedure TChineseDataConvetor.OnFieldGetText(Sender:TField;var Text:String;DisplayText:Boolean); begin if (not FActive) or (FOutputConvert=ctNone) then begin Text:=Sender.AsString; end else if (FOutputConvert=ctGB2BIG5) then begin Text:=GBtoBIG5(Sender.AsString); end else if (FOutputConvert=ctBIG52GB) then begin Text:=BIG5toGB(Sender.AsString); end; end;procedure TChineseDataConvetor.OnFieldSetText(Sender:TField;const Text:String); begin if (not FActive) or (FInputConvert=ctNone) then begin Sender.AsString:=Text; end else if (FInputConvert=ctGB2BIG5) then begin Sender.AsString:=GBtoBIG5(Text); end else if (FInputConvert=ctBIG52GB) then begin Sender.AsString:=BIG5toGB(Text); end; end;constructor TChineseDataConvetor.Create(AOwner:TComponent); begin inherited Create(AOwner); FActive:=true; FInputConvert:=ctGB2BIG5; FOutputConvert:=ctBIG52GB; end;destructor TChineseDataConvetor.Destroy(); begin if Assigned(FDataSet) then begin FDataSet.AfterOpen:=FOldOnDataSetAfterOpen; end; inherited Destroy(); end;end.请将控件安装后使用,没有真正验证过,我还不确定这样做的可行性,你可以试试。。
TO : tonylk 请问cvcode单元能够实现简体转成繁体,繁体转成简体么。 我下了一个cvcode单元试了一下只能GB-》BIG5,并且是一个字一个字的转化,能 不能对整个数据集进行转换为简体或繁体,因为要在dbgrid控件中显示。
简体用GB2312_CHARSET 繁体下CHINESEBIG5_CHARSET应该没有问题吧
我回去后找找。
Windows, Messages, SysUtils, Classes, DB;type
TConvertType = (ctNone, ctGB2BIG5, ctBIG52GB); TChineseDataConvetor = class (TComponent)
private
FDataSet:TDataSet;
FActive:Boolean;
FInputConvert:TConvertType;
FOutputConvert:TConvertType;
FOldOnDataSetAfterOpen:TDataSetNotifyEvent;
protected
procedure SetDataSet(AValue:TDataSet);
procedure OnDataSetAfterOpen(DataSet:TDataSet);
procedure OnFieldGetText(Sender:TField;var Text:String;DisplayText:Boolean);
procedure OnFieldSetText(Sender:TField;const Text:String);
public
constructor Create(AOwner:TComponent);override;
destructor Destroy();override;
published
property DataSet:TDataSet read FDataSet write SetDataSet;
property Active:Boolean read FActive write FActive default true;
property InputConvert:TConvertType read FInputConvert write FInputConvert default ctGB2BIG5;
property OutputConvert:TConvertType read FOutputConvert write FOutputConvert default ctBIG52GB;
end;procedure Register;implementationuses
CVCode;procedure Register;
begin
RegisterComponents ('Standard', [TChineseDataConvetor]);
end;{ TChineseDataConvetor }procedure TChineseDataConvetor.SetDataSet(AValue:TDataSet);
begin
if FDataSet<>AValue then begin
if Assigned(FDataSet) then begin
FDataSet.AfterOpen:=FOldOnDataSetAfterOpen;
end;
FDataSet:=AValue;
if Assigned(FDataSet) then begin
FOldOnDataSetAfterOpen:=FDataSet.AfterOpen;
FDataSet.AfterOpen:=OnDataSetAfterOpen;
end;
end;
end;procedure TChineseDataConvetor.OnDataSetAfterOpen(DataSet:TDataSet);
var
I:Integer;
begin
if Assigned(FOldOnDataSetAfterOpen) then begin
FOldOnDataSetAfterOpen(DataSet);
end;
for I:=0 to DataSet.Fields.Count-1 do begin
DataSet.Fields[I].OnGetText:=OnFieldGetText;
DataSet.Fields[I].OnSetText:=OnFieldSetText;
end;
if not DataSet.Eof then begin
DataSet.First;
end;
end;procedure TChineseDataConvetor.OnFieldGetText(Sender:TField;var Text:String;DisplayText:Boolean);
begin
if (not FActive) or (FOutputConvert=ctNone) then begin
Text:=Sender.AsString;
end
else if (FOutputConvert=ctGB2BIG5) then begin
Text:=GBtoBIG5(Sender.AsString);
end
else if (FOutputConvert=ctBIG52GB) then begin
Text:=BIG5toGB(Sender.AsString);
end;
end;procedure TChineseDataConvetor.OnFieldSetText(Sender:TField;const Text:String);
begin
if (not FActive) or (FInputConvert=ctNone) then begin
Sender.AsString:=Text;
end
else if (FInputConvert=ctGB2BIG5) then begin
Sender.AsString:=GBtoBIG5(Text);
end
else if (FInputConvert=ctBIG52GB) then begin
Sender.AsString:=BIG5toGB(Text);
end;
end;constructor TChineseDataConvetor.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
FActive:=true;
FInputConvert:=ctGB2BIG5;
FOutputConvert:=ctBIG52GB;
end;destructor TChineseDataConvetor.Destroy();
begin
if Assigned(FDataSet) then begin
FDataSet.AfterOpen:=FOldOnDataSetAfterOpen;
end;
inherited Destroy();
end;end.请将控件安装后使用,没有真正验证过,我还不确定这样做的可行性,你可以试试。。
请问cvcode单元能够实现简体转成繁体,繁体转成简体么。
我下了一个cvcode单元试了一下只能GB-》BIG5,并且是一个字一个字的转化,能
不能对整个数据集进行转换为简体或繁体,因为要在dbgrid控件中显示。
确实是一个字一个字转的,不然还向怎么样。。
你要对整个数据库进行转就写个批处理,或者用触发器,每当有新纪录添加,就进行转换。。
奇怪,数据库可以存简体和繁体,程序用dbgrid在简体系统可以显示简繁体字,为什么在繁体系统繁体字可以,简体字就不行,,,,纳闷中.....
谁有妙策...