Board logo

Subject: 当动态切换Query的DataSource时翻译组件不能正确翻译 [Print This Page]

Author: hiscaler    Time: 2005-8-3 17:06     Subject: 当动态切换Query的DataSource时翻译组件不能正确翻译

当Query的DataSource不是在设计时设置而是在程序运行时手动设置时,翻译组件不能正确翻译,不知是设计问题还是组件的问题,麻烦解答.谢谢!!!

翻译组件是按照如下方法使用的:
   新建一个DataModule,在上面放上相应的翻译组件,再设置其属性,在要翻译窗口的OnCreate事件中写上dmCommon.CnLangManagerR2.TranslateForm(Self);当Query的DataSource在设计时设置好时可以正确翻译,但当是在程序运行时手动设置时不能正确翻译,其它控件都能正常翻译.
Author: hiscaler    Time: 2005-8-11 09:51

快沉了,自己顶一下.
我的解决方式如下
procedure TfrmPersonnelBaseData.udpTbcChange();
var
  intTabIndex: Integer;
begin
  intTabIndex := tbcPersonnelBaseData.TabIndex;
  case intTabIndex of
    DiplomaOptionTabIndex:
      begin
        with dgEhOption do
        begin
          DataSource := dmCommon.dsDiplomaOption;
          Fields[0].DisplayLabel := dmCommon.CnLangManagerR2.Translate('TdmCommon.dmCommon.ZQryDiplomaOptionDiploma.DisplayLabel');
        end;
        lbledtContent.EditLabel.Caption := dgEhOption.Fields[0].DisplayLabel;
        lbledtContent.MaxLength := 10;
        lbledtDeptID.Visible := False;
        lbledtParentDeptID.Visible := False;
      end;
    DutyOptionTabIndex:
      begin
        with dgEhOption do
        begin
          DataSource := dmCommon.dsDutyOption;
          Fields[0].DisplayLabel := dmCommon.CnLangManagerR2.Translate('TdmCommon.dmCommon.ZQryDutyOptionDuty.DisplayLabel');
        end;
        lbledtContent.EditLabel.Caption := dgEhOption.Fields[0].DisplayLabel;
        lbledtContent.MaxLength := 10;
        lbledtDeptID.Visible := False;
        lbledtParentDeptID.Visible := False;
      end;
    PerStateOptionTabIndex:
      begin
        with dgEhOption do
        begin
          DataSource := dmCommon.dsPerStateOption;
          Fields[0].DisplayLabel := dmCommon.CnLangManagerR2.Translate('TdmCommon.dmCommon.ZQryPerStateOptionPersonnelState.DisplayLabel');
        end;
        lbledtContent.EditLabel.Caption := dgEhOption.Fields[0].DisplayLabel;
        lbledtContent.MaxLength := 8;
        lbledtDeptID.Visible := False;
        lbledtParentDeptID.Visible := False;
      end;
    DeptOptionTabIndex:
      begin
        with dgEhOption do
        begin
          DataSource := dmCommon.dsDeptOption;
          Fields[0].DisplayLabel := dmCommon.CnLangManagerR2.Translate('TdmCommon.dmCommon.ZQryDeptOptionDeptID.DisplayLabel');
          Fields[1].DisplayLabel := dmCommon.CnLangManagerR2.Translate('TdmCommon.dmCommon.ZQryDeptOptionDeptName.DisplayLabel');
          Fields[2].DisplayLabel := dmCommon.CnLangManagerR2.Translate('TdmCommon.dmCommon.ZQryDeptOptionParentDeptID.DisplayLabel');
        end;
        lbledtContent.EditLabel.Caption := dgEhOption.Fields[1].DisplayLabel;
        lbledtContent.MaxLength := 12;
        lbledtDeptID.Visible := True;
        lbledtParentDeptID.Visible := True;
      end;
  end;
end;
各样有什么好的解决方式的话,请回帖.
还有一个问题,想请问大家一下,Cnlangmanger的Translate和TranslateString有什么区别吗???
Author: zjy    Time: 2005-8-13 09:54

多语组件包是 Passion 写的,我让他来瞅瞅。
Author: Passion    Time: 2005-8-13 11:08

能否详细描述一下“当Query的DataSource在设计时设置好时可以正确翻译,但当是在程序运行时手动设置时不能正确翻译”的具体现象?包括生成的有关Query的翻译条目字符串内容。
Author: hiscaler    Time: 2005-8-13 21:52

  拖一个DBGrid到窗体上,再建一个DataModule,在其中放上相应的多语翻译控件,设置其相应属性,放几个DataSource和ADOQuery(设置相应的属性),当将DBGrid1的DataSource属性设置为ds1时,在窗体的OnCreate写上代码TranslateFrom(Self)时可以翻译窗体及DBGrid标题等内容,但当我在另外一个窗体From2中放一个DBGrid2,在设计时不设置其DataSource属性,而是在程序中根据相应的选择来手动切换DataSource时,会出现翻译不了的情况。即使在From2中的OnCreate事件中将切换DataSource写在TranslateFrom(Self)前也不会切换,但窗体中的Button和Lable等其它控件会翻译的,只是DBGrid的标题不翻译。生成的多语文条目应该是没有问题的,因为即使我将默认的一个多语言条目(From2中DBGrid标题的条目)的内容(‘=’后面的内容)随便改为其它的字符系统也不会翻译。也就是说翻译根本没有对DBGrid2起作用一样。不知道是什么原因,不知道是由于我没有设置好的原因还是怎么的,麻烦你们了。Thank U!!!
Author: Passion    Time: 2005-8-13 22:33

请问datasource和ADOQuery等是放在datamodule里头还是在窗体上?
Author: Passion    Time: 2005-8-13 22:55

查明白了。datasource和Query是放datamodule上的时候,本来是需要TranslateComponent(DataModule1)才能翻译Query中的Field的DisplayLabel。不过多语包在处理Datamodule的时候是有个Bug,在生成翻译字符串的时候正常,但在翻译的时候出现了字符串判断不正确的问题,导致了即使调用了TranslateComponent(DataModule1)对TDataModule翻译也仍然不正确。
此问题已修正,您可以在CVS上获取最新的源码来测试一下。
对于此Bug造成的不便,深表歉意。
Author: hiscaler    Time: 2005-8-14 09:17

  我去下载试一下,麻烦了,谢谢!!!
Author: hiscaler    Time: 2005-8-14 11:09     Subject: 引发了一个问题

  测试了一下,发现一个问题,在窗体上放上一个DBGRID控件,设置DataSource,当没有用多语言翻译控件时,可以正常显示(DBGrid中的内容),用了多语言翻译控件后,程序开启时DBGrid中的内容可以显示,但当切换到另外一种语言后,DBGRID中会失去数据,用如下语句后又可以显示了。Why?
    with dm.qryInStockList do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT * FROM InStockList');
      opEN;
    end;
Author: hiscaler    Time: 2005-8-19 21:30

顶一下,快沉了!!!
Author: Passion    Time: 2005-8-20 08:28

失效的原因大概是因为SQL属性被翻译器重新赋值的缘故,您可以实验一下,给一个已经Open的TQuery的SQL属性重新赋值会导致这个TQuery关闭。
您在各个语言的语言文件中删除SQL条目即可。
我们也考虑生成字符串时跳过某些特定属性。
Author: Passion    Time: 2005-8-20 08:36

不过翻译的时候,如果TQuery不关闭,是没法给FieldName翻译而重新赋值的,SQL属性的翻译赋值刚好歪打正着做到了关闭这一点。
所以推荐翻译前关闭TDataSet,翻译后再打开。
或者也不翻译FieldName等在TQuery打开期间无法赋值的属性,这可以通过删除字符串中的对应条目来做到。




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0