Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 3847|回复: 3

TOdbcConnection连接MS Access 数据库中文记录显示解决方案

[复制链接]

该用户从未签到

发表于 2011-10-24 23:00:37 | 显示全部楼层 |阅读模式
众里寻她千百度,原来官方坛子里早就有人给出了,只怪自己没早发现。

一。新建一UnitGetSetText.pas文件,当然你也可以你女朋友的名字命名:
  1. unit UnitGetSetText;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5.   Classes, SysUtils, Forms, LConvEncoding, db;
  6. type
  7.   { TGetSetTextClass }
  8.   TGetSetTextClass = class
  9.   private
  10.     procedure GetText(Sender: TField; var aText: string;
  11.            DisplayText: Boolean);
  12.     procedure SetText(Sender: TField; const aText: string);
  13.   public
  14.     procedure AssignGetTextToQueries(F: TCustomForm);
  15.   end;
  16. var
  17.   GetSetTextClass: TGetSetTextClass;
  18. implementation
  19. { TGetSetTextClass }
  20. procedure TGetSetTextClass.GetText(Sender: TField; var aText: string;
  21.   DisplayText: Boolean);
  22. begin
  23.   aText := CP936ToUTF8(Sender.AsString);
  24. end;
  25. procedure TGetSetTextClass.SetText(Sender: TField; const aText: string);
  26. begin
  27.   Sender.AsString := UTF8ToCP936(aText);
  28. end;
  29. procedure TGetSetTextClass.AssignGetTextToQueries(F: TCustomForm);
  30. var
  31.   I, J: Integer;
  32.   Q: TDataSet; // doesn't matter if it's TQuery or TTable or TZQuery...
  33.   SF: TStringField;
  34. begin
  35.   for I := 0 to F.ComponentCount - 1 do
  36.     if F.Components[I] is TDataSet then begin
  37.       Q := TDataSet(F.Components[I]);
  38.       for J := 0 to Q.FieldCount - 1 do
  39.         if Q.Fields[J] is TStringField then begin
  40.           SF := TStringField(Q.Fields[J]);
  41.           SF.OnGetText := @GetText;
  42.           SF.OnSetText := @SetText;
  43.         end;
  44.     end;
  45. end;
  46. initialization
  47.   GetSetTextClass := TGetSetTextClass.Create;
  48. finalization
  49.   GetSetTextClass.Free;
  50. end.
  51.                        
复制代码
二。在连接MS Access 数据库的窗体的onCreate事件下添加以下代码,前提是引用前面一的文件。
  1. procedure tform1.formcreate(sender: tobject);
  2. begin
  3.      GetSetTextClass.AssignGetTextToQueries(Self);
  4. end;                  
复制代码
这样应该就可以了,中文记录现在应该能正确显示了。
三。添加新记录要保存成功的话,还得在保存按钮事件添加与Update有关的代码。以下例子是在DGNavigator的单击事件下判断单击的是保存按钮时的代码:
  1. procedure tform1.dbnavigator1click(sender: tobject; button: tdbnavbuttontype);
  2. begin
  3.       if button=nbPost   then
  4.       begin
  5.       sqlquery1.edit;
  6.       sqlquery1.ApplyUpdates;
  7.       sqltransaction1.CommitRetaining;
  8.       end;
  9. end;     
复制代码
                 
                  

评分

参与人数 1威望 +11 收起 理由
猫工 + 11 优秀文章,支持!n神马都是浮云

查看全部评分

回复

使用道具 举报

该用户从未签到

发表于 2011-10-28 15:09:13 | 显示全部楼层
真是可以,太谢谢了,看来还是要会E文才好啊,
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-28 16:17:23 | 显示全部楼层
优秀文章,支持!n神马都是浮云
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-11-19 22:25:36 | 显示全部楼层
WINCE 下可以用ODBC 连接吗?
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2024-4-20 15:40 , Processed in 0.055296 second(s), 13 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表