¦h»y¨¥®M¥ó¨Ï¥Î»¡©ú

¦w¼wµØ³nÅ餽¥q

www.acroprise.com.tw

a049@acroprise.com.cn


¥Ø¿ý:

  1. ¦h»y¨¥®M¥óªº¥Øªº?

  2. ¦h»y¨¥®M¥óªº¤u§@­ì²z?

  3. ¦h»y¨¥®M¥óªºµ²ºc?

  4. ¦p¦óµù¥U²Ä¤T¤è¤¸¥óªº´À´«¨ç¼Æ?

  5. ¦p¦ó¨Ï¥ÎTAcroMultiFileDD?

(1).¦r¨åÀɪºÀɮ榡?

(2).¬°¦ó­n¥ÎDDNameÄݩʨÓÃѧO?

(3).¦p¦óÀò±o¨CºØ®æ¦¡ªº¦r¨åÀÉ?

(4).¦b¦ó®É³]©wTAcroMultiFileDDªºFileName?

(5).¦p¦ó¹LÂo¶i¤JHashªíªº¦r¨å¸ê®Æ?

  1. ¦p¦ó¨Ï¥ÎTAcroMultiStreamDD?

  2. ¦p¦ó¨Ï¥ÎTAcroMultiDBDD?

  3. ¦p¦ó¨Ï¥ÎTAcroMultiReplacer?

(1).¬JµM¦³¤FReplaceComsÄÝ©Ê,¬°¦óÁÙ­n¦³OwnerOptionÄÝ©Ê?

(2).¬°¦ó¤£§âReplaceOptionªºSeqNo¹w³]­È©w¬°0?

  1. ¦p¦ó¨Ï¥ÎTAcroMultiScreenEye?

(1).¦p¦ó³]©w¬YÃþFormªº©Ò¦³¹ê¨Ò¦@¥Îªº°Ñ¼Æ?

(2).¦p¦ó³]©w¬YÃþForm¤£´À´«?

(3).¬°¦ó¤¸¥ó¤£¦Û¤v¦bConstructor©ÎLoaded¥hHook ScreenªºOnActiveFormChange¨Æ¥ó¡A¦Ó­n¥Î¤á¥h½Õ¥ÎHookScreenEvent?

 


Demo:

  1. ColorBall¹CÀ¸Demo(¦p¦ó¨Ï¥ÎTAcroMultiScreenEye)    ­ì½XColorBall.rar

  2. Delphi VCL¤¸¥ó¤Î²Ä3¤è¤¸¥óDemo(¦p¦ó¨Ï¥ÎTAcroMultiReplacer)    ­ì½XMultiLangDemo.rar

  3. ²Ä3¤è¤¸¥óDemo(±Ä¥ÎDev Express¤¸¥ó)


 

FAQ:


  1. ¦h»y¨¥®M¥óªº¥Øªº?

    ¹ï±M®×¦b¤£¦P°ê®a©Î¦a°Ïªº¤£¦P»y¨¥¤Uªº¨Ï¥Î´£¨Ñ¤ä´©¡A¤ÀÂ÷°õ¦æµ{¦¡»P¦h»y¨¥¹ê²{¡A­«½Æ§Q¥Î¸ê®Æ¦r¨å¡A²¤Æ¶}µo¨BÆJ¡C

  1. ¦h»y¨¥®M¥óªº¤u§@­ì²z?

    ¸ê®Æ¦r¨å´£¨Ñ­ì»y»P¦h°ê¤å¦rªº¬M®g¡A¦h»y¨¥®M¥ó¦bµ{¦¡¹B¦æ®É±qÀÉ©Î¸ê®Æ®w¸ü¤J¸ê®Æ¦r¨å¨ìHashªí¡A¥H´£¨Ñ³Ì§Öªº·j´M³t«×¡F¦A¸ü¤J¤¸¥óÃþ§Oªº´À´«¨ç¼Æ¡F³Ì«á®Ú¾Ú­n´À´«¦h»y¨¥ªº¤¸¥óªºÃþ§O¡A§ä¨ì¥¦ªº´À´«¨ç¼Æ¡A´À´«±¼¸Ó¤¸¥óªº¦U³¡¤Àªº¤å¦r¡C    

  1. ¦h»y¨¥®M¥óªºµ²ºc?

    TCustomMultiDD¬O¸ê®Æ¦r¨å¤¸¥ó¡A¨ä¤UÄ~©Ó¤FTAcroMultiFileDD,TAcroMultiDBDD©MTAcroMultiStreamDD,TAcroMultiFileDD¬O±qÀÉÀò±o¦r¨å¸ê®Æ¡ATAcroMultiDBDD¬O±q¸ê®ÆªíÀò±o¦r¨å¸ê®Æ¡A¥¦­Ì³£±q¥~³¡Àò±o¦r¨å¸ê®Æ¡A¦ÓTAcroMultiStreamDD¬O±q¤º³¡Àò±o¦r¨å¸ê®Æ¡A³]­p®É´N¿é¤J¤F¦r¨å¸ê®Æ¡A½s͍ì¤Fexe¤¤¡CÄÝ©ÊDDName:string¨ÓÃѧO¸ê®Æ¦r¨å¡C¥þ§½¤¸¥óAcroDDStorage:TAcroMultiDDStorageºÞ²z©Ò¦³ªºTCustomMultiDD¤¸¥ó¡A«OÃÒ¥¦­ÌªºDDName°ß¤@¡C

    ¥þ§½¤¸¥óAcroClassMethodStorage:TMultiClassMethodStorage«O¦sµù¥UªºÃþ§Oªº´À´«¨ç¼Æ¡A«öÃþ§OªºÄ~©ÓÃö«Y¡A²Õ´¦¨¾ð§Îµ²ºc¡C¦h»y¨¥®M¥ó¹w¥ýµù¥U¤FDelphi¼Ð·Ç¤¸¥óªº´À´«¨ç¼Æ¡A¦pTCustomControl¡ATMenu¡ATCustomTreeViewµ¥¡C¥¦ªº¥\¯à¬O¬°Ãþ§O§ä¨ì¦å½t³Ìªñªº´À´«¨ç¼Æ¡C

    TAcroMultiReplacer¤¸¥ó°O¿ý¦U­Ó¤¸¥óªº´À´«°Ñ¼Æ¡A¦bLoaded®É¥Î¤¸¥óªºÃþ§O¨ìAcroClassMethodStorage§ä¥¦¦å½t³Ìªñªº´À´«¨ç¼Æ¡A¦Û°Ê´À´«¤¸¥óªº¦h»y¨¥¤å¦r¡C

    ®M¥ó¥]§t4­ÓPackage:

  1. ¦p¦óµù¥U²Ä¤T¤è¤¸¥óªº´À´«¨ç¼Æ?

    ¦h»y¨¥®M¥óµù¥U¤F¤U¦C¤@¨Ç¤¸¥ó:

   

 

    ¦p¦óµù¥U²Ä¤T¤è¤¸¥óªº´À´«¨ç¼Æ©O?«Ü²³æ¡A§A¥u­n©w¸q¤@­Ó¤U­±Ãþ«¬ªºProcedure¡A

 

TMultiLanguageProc=procedure(ATable:IDataLocate;AComponent:TObject;ACodePage,ASeqNo:string;AFont:TFont);


µM«á½Õ¥ÎAcroClassMethodStorage¥þ§½¤¸¥óªºRegisterClassMethodµù¥U§Y¥i¡A¦p:

¡@

unit dxClassMethod;
interface
uses
  AcroMultiClassMethod;
implementation
uses
  Graphics,dxTL,dxTLClms;

procedure Proc_TCustomdxTreeListControl(ATable: IDataLocate; AComponent: TObject;
ACodePage,ASeqNo: string;AFont:TFont);

  procedure ReplaceNode(ANode:TdxTreeListNode);
  var
    i:integer;
  begin
    for i:=0 to TCustomdxTreeListControl(AComponent).ColumnCount-1 do
    if VarIsStr(ANode.Values[i]) then
      ANode.Values[i]:=GetDisplayValue(ATable,ANode.Values[i],ACodePage,ASeqNo);
    for i:=0 to ANode.Count-1 do ReplaceNode(ANode.Items[i]);
  end;
var
  i,j:integer;
  AColumn:TdxTreeListPickColumn;
begin
  TCustomdxTreeListControl(AComponent).BeginUpdate;
  try
    for i:=0 to TCustomdxTreeListControl(AComponent).Bands.Count-1 do
    begin
      TCustomdxTreeListControl(AComponent).Bands[i].Caption:=
        GetDisplayValue(ATable,TCustomdxTreeListControl(AComponent).Bands[i].Caption,ACodePage,ASeqNo);
    end;
    for i:=0 to TCustomdxTreeListControl(AComponent).ColumnCount-1 do
    begin
      TCustomdxTreeListControl(AComponent).Columns[i].Caption:=
        GetDisplayValue(ATable,TCustomdxTreeListControl(AComponent).Columns[i].Caption,ACodePage,ASeqNo);
      if TCustomdxTreeListControl(AComponent).Columns[i] is TdxTreeListPickColumn then
      begin
        AColumn:=TdxTreeListPickColumn(TCustomdxTreeListControl(AComponent).Columns[i]);
        for j:=0 to AColumn.Items.Count-1 do
          AColumn.Items[j]:=GetDisplayValue(ATable,AColumn.Items[j],ACodePage,ASeqNo);
      end;
    end;
    for i:=0 to TCustomdxTreeListControl(AComponent).Count-1 do
      ReplaceNode(TCustomdxTreeListControl(AComponent).Items[i]);
  finally
    TCustomdxTreeListControl(AComponent).EndUpdate;
  end;
end;

initialization
  AcroClassMethodStorage.RegisterClassMethod(TCustomdxTreeListControl,Proc_TCustomdxTreeListControl);
finalization
  AcroClassMethodStorage.UnRegisterClassMethod(TCustomdxTreeListControl);
end.

¡@

    ¬°¦ó­n½Õ¥ÎUnRegisterClassMethod¨Ó¨ø¸ü´À´«¨ç¼Æ©O?¨º¬O¬°bpl Plug&Playªº¨t²Î¦Ò¼{ªº¡C°²³]¨t²Îªº¥Dµ{§Ç¨S¦³¥Î¨ìTCustomdxTreeListControl¤¸¥ó¡A¥¦¤£¥²¦b¥Dµ{§Ç¤Þ¥ÎdxClassMethod³æ¤¸¨Óµù¥UTCustomdxTreeListControl¤¸¥óªº´À´«¨ç¼Æ¡A¦ý¨t²Îªº¤@­Óbpl,¦p¤@­Ó­q³æªºorder.bpl,¥]¤F¤@­Ó­q³æ§@·~¡A¥Î¨ì¤FTCustomdxTreeListControl¤U­±ªº¤¸¥ó¡A¦pTdxTreeList¡A³o­Óbpl´N»Ý­n¤Þ¥ÎdxClassMethod³æ¤¸¡F¦]¬°order.bpl¬O¥Dµ{§Ç¸ü¤Jªº(LoadPackage)¡A¥Î§¹«á¡A¥i¯à¥Dµ{§Ç·|§â¥¦¨ø¸ü(UnLoadPakage),¦pªG³o®É¤£¨ø¸ü¦¹¤¸¥óªº´À´«¨ç¼Æ¡A¦A¨Ï¥ÎProc_TCustomdxTreeListControl¨ç¼Æ®É´N·|³X°Ý¨ìµL®Ä¦ì§}¡C

    ¦pªGÃþ§O¬OTControl(¥]§t¥¦ªº«á¥N¡A¤U¦P)¡A´À´«¨ç¼Æùؤ£¥Î´À´«Hint©MFontÄݩʡA¤º³¡¤w¸g´À´«¤F¡C

  1. ¦p¦ó¨Ï¥ÎTAcroMultiFileDD?

ÄÝ©Ê:

(1).¦r¨åÀɪºÀɮ榡?

¡@

    ¹w³]ªº¦r¨å¸ê®Æ¦³5­ÓÄæ¦ì:

 

    DDKey    ­ì»y

    CodePage    »y¨¥ÃѧO½X

    SeqNo    ¦h·Nµü§Ç¸¹

    DisplayValue    ­ì»y½Ķµü

    CatalogID    ¤À²ÕÃѧO½X¡A½s¿è¦r¨å¸ê®Æ®É¥Î¡A¹ê»Ú¦b´À´«¬d¸ß®É¨S¥Î

 

    «e3­ÓÄæ¦ì©M¬°¤@­ÓPrimary Key¡F

 

    ¦³¤TºØÀɮ榡:

³W«h:

¨Ò:

File "%s" not found!

Retry?

¡@

¿é¥Xµ²ªG¬°:

"File ""%s"" not found!"#13#10"Retry?"

¡@

¦r¨åÀÉ:

"DDKEY","CODEPAGE","SEQNO","DISPLAYVALUE","CATALOGID",
"&Lock","950","0","º¿¡~","100",
"&Lock","936","0","吩w","100",
"&Lock","1252","0","&Lock","100",
"Log&out","950","0","Ï÷“|","100",
"Log&out","936","0","µn¥X","100",
"Log&out","1252","0","Log&out","100",
"&Forms","950","0","¶^«å","100",
"&Forms","936","0","µøµ¡","100",
"&Forms","1252","0","&Forms","100",
"&Calculator","950","0","ð@¿Å³º","100",
"&Calculator","936","0","­pºâ¾¹","100",
"&Calculator","1252","0","&Calculator","100",
"&Paint","950","0","’ó?²£","100",
"&Paint","936","0","¤pµe®a","100",
"&Paint","1252","0","&Paint","100",
"&NotePAD","950","0","Â~£u?","100",
"&NotePAD","936","0","°O¨Æ¥»","100",
"&NotePAD","1252","0","&NotePAD","100",
"&Help","950","0","þ”¾","100",
"&Help","936","0","À°§U","100",
"&Help","1252","0","&Help","100",
"&About","950","0","»Ô–K","100",
"&About","936","0","Ãö©ó","100",
"&About","1252","0","&About","100",
"Cascade","950","0","ù¤ÛX","100",
"Cascade","936","0","¼hÅ|","100",
"Cascade","1252","0","Cascade","100",

³W«h:

¨Ò:

File "%s" not found!

Retry?

¡@

¿é¥Xµ²ªG¬°:

"File ""%%s"" not found!%c%nRetry?"

¡@

¦r¨åÀÉ»PdfTextDFMÃþ¦ü¡C

³W«h:

4¦ì¤¸²Õ¡Ainteger    Äæ¦ì¼ÆM

4¦ì¤¸²Õ¡Ainteger    ²Ä1Äæ¦ì¦WºÙªø«×L1

L1¦ì¤¸²Õ¡Astring    ²Ä1Äæ¦ì¦WºÙ

4¦ì¤¸²Õ¡Ainteger    ²Ä2Äæ¦ì¦WºÙªø«×L2

L2¦ì¤¸²Õ¡Astring    ²Ä2Äæ¦ì¦WºÙ

......

4¦ì¤¸²Õ¡Ainteger    ²ÄMÄæ¦ì¦WºÙªø«×Lm

Lm¦ì¤¸²Õ¡Astring    ²ÄMÄæ¦ì¦WºÙ

4¦ì¤¸²Õ¡Ainteger    °O¿ý¼ÆN

4¦ì¤¸²Õ¡Ainteger    ²Ä1±ø°O¿ý²Ä1Äæ¦ì­Èªø«×L1_1

L1_1¦ì¤¸²Õ¡Astring  ²Ä1±ø°O¿ý²Ä1Äæ¦ì­È

4¦ì¤¸²Õ¡Ainteger    ²Ä1±ø°O¿ý²Ä2Äæ¦ì­Èªø«×L1_2

L1_2¦ì¤¸²Õ¡Astring  ²Ä1±ø°O¿ý²Ä2Äæ¦ì­È

......

4¦ì¤¸²Õ¡Ainteger    ²Ä1±ø°O¿ý²ÄMÄæ¦ì­Èªø«×L1_m

L1_m¦ì¤¸²Õ¡Astring  ²Ä1±ø°O¿ý²ÄMÄæ¦ì­È

......

......

4¦ì¤¸²Õ¡Ainteger    ²ÄN±ø°O¿ý²ÄMÄæ¦ì­Èªø«×Ln_m

Ln_m¦ì¤¸²Õ¡Astring  ²ÄN±ø°O¿ý²ÄMÄæ¦ì­È

(2).¬°¦ó­n¥ÎDDNameÄݩʨÓÃѧO?

    

    TAcroMultiReplacer¬°¦ó¤£ª½±µ³s±µ¨ì¦r¨åTCustomMultiDD¡A¦Ó­n¥ÎOwnerOption.ReplaceOption.DDName¨Ó¶¡±µ³s±µ?

    ³o¤]¬Obpl Plug&Playªº¨t²Î»Ý­nªº¡A¦]¬°¾ã­Ó¨t²Î¬O¤À³Î¦¨¤F«Ü¦hªºbpl¤p¨t²Î¡Aµ¹¤£¦Pªºµ{¦¡®v¨Ó¼g¡F¸ê®Æ¦r¨å¬O¾ã­Ó¨t²Îªº¡A¥i¯à¦³¤@­Ó¨ì´X­Ó¡A¦ý¤£¥i¯à¨C­Óbpl¤@­Ó¡A«Ü¦hªºbpl¦@¥Î¤@¥»¦r¨å¡C¦pªGª½±µ³s±µTcustomMultiDD,­n¨D§â¨t²Îªº¦r¨å©ñ¨ì¤@­Ó¤½¥Îªºbpl,µM«á¨C­Óbpl¤l¨t²Î¨Ó¤Þ¥Î³o­Ó¤½¥Îªºbpl,³o´N¼W¥[¤F¨t²Îªº½¢¦X«×¡C(·íµM¡A¥Ñ©ó¤½¥Î¥þ§½°Ñ¼Æªº­ì¦]¡A¦@¥Îbpl¬O¥i¯à¦s¦bªº)

    ¦Ó¥ÎDDName¨Ó¶¡±µ³s±µ¡A´N¤£·|¦b³o­Ó¦a¤è¼W¥[¨t²Îªº½¢¦X«×¡C

    ³]­p®É¡AÄݩʽs¿è¾¹¦C¥X¤F©Ò¦³³Ð«ØªºTCustomMultiDDªºDDName¡A¤è«K¬°TReplaceOption.DDName¬D¿ï¡A

¦ý¤£¬O¤@©w­n±q¦Cªí¿ï¨ú¡A¦pªG¥Î¤á¬O¦b¤l¨t²Î¡A¥i¯à³]­p®ÉTCustomMultiDDÁÙ¨S¦³³Ð«Ø(¦pªGTCustomMultiDD¬O©ñ¦b¸ê®Æ¼Ò²Õ¡A¥i¯à¸ê®Æ¼Ò²ÕÁÙ¨S¥´¶})¡AÄݩʽs¿è¾¹´NµLªk¦C¥X¡A¥Î¤á¥i¥Hª½±µ¿é¤J¡C

 

(3).¦p¦óÀò±o¨CºØ®æ¦¡ªº¦r¨åÀÉ?

¡@

    <1>.¥ý¦b¸ê®Æ®w«Ø¥ß¦r¨å¸ê®Æªí¡A¦pFormDD,¥]§t¹w³]ªº5­ÓÄæ¦ì:

¡@

if exists (select * from sysobjects where id = object_id(N'[dbo].[FORMDD]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[FORMDD]
GO

CREATE TABLE [dbo].[FORMDD] (
[DDKEY] [varchar] (50) NOT NULL ,
[CODEPAGE] [int] NOT NULL ,
[SEQNO] [int] NOT NULL ,
[DISPLAYVALUE] [varchar] (50) NOT NULL ,
[CATALOGID] [varchar] (40) NOT NULL 
)
GO

ALTER TABLE [dbo].[FORMDD] WITH NOCHECK ADD 
CONSTRAINT [PK_FORMDD] PRIMARY KEY CLUSTERED 
(
[DDKEY],
[CODEPAGE],
[SEQNO]
) ON [PRIMARY] 
GO

    <2>.¥Î¥»¤½¥q´£¨Ñªº¦r¨å½s¿è¤u¨ãDDManager½s¿è¸ê®Æ¡AµM«á¥i¥H¿é¥X¦¨¥ô¤@ºØ®æ¦¡ªºÀÉ¡F

 

    <3>.¦pªG¥Î¤á¦³²{¦¨ªº¦r¨å¡A¥Ñ©óÄæ¦ìªº®t²§¡A¤£¯à¨Ï¥ÎDDManager,¥Î¤á¥i¥H¥ý¥ÎTTable,TQuery©ÎTADOTable,TADOQueryµ¥¥´¶}¦r¨å¡A½Õ¥ÎAcroMultiDBDDWriter.pasªºSaveDataSetToXXFile§â¦r¨å¸ê®Æ¿é¥X¨ìÀÉ¡C(ª`·N:ASplitor,QuoteChar­n¥Î¹w³]­È)

 

procedure SaveDataSetToTextFile(ATable:TDataSet;AFile:string;
  EncodeStrFun:TEncodeStrFun;AProc:TProgressProc;const ASplitor:Char=',';
  const AQuoteChar:Char='"');

procedure SaveDataSetToBinaryFile(ATable:TDataSet;AFile:string;AProc:TProgressProc);

(4).¦b¦ó®É³]©wTAcroMultiFileDDªºFileName?

¡@

    ¦bOnBeforeBuildDD¨Æ¥ó,¦¹¨Æ¥ó¬O¦b§â¦r¨å¸ê®Æ©ñ¤JHashªí«eIJµo¡C

 

(5).¦p¦ó¹LÂo¶i¤JHashªíªº¦r¨å¸ê®Æ?

¡@

    ¦bOnBuildingDD¨Æ¥ó¡A¦p:

¡@

procedure TFormMain.AcroMultiFileDD1BuildingDD(Sender: TObject; ADDKey,
ACodePage, ASeqNo: String; var Accept: Boolean);
begin
  Accept:=ACodePage='936';
end;

  1. ¦p¦ó¨Ï¥ÎTAcroMultiStreamDD?

    »PTAcroMultiFileDD¤ñ¸û¡A¨S¦³FileNameÄݩʡA¦h¤FDictionary:TMultiDictionaryÄݩʡA§Y¦r¨å¸ê®Æ¤£±q¥~³¡¨Ó¡A¦Ó¬O³]­p®É´N«Ø¦n¤F¸ê®Æ¡C¾A¥Î©ó¤£·Q¥~±a¦r¨åÀɪº¨t²Î¡A¥H¤Î¤º³¡­n¨Ï¥Î¦h»y¨¥ªºbpl¡A¦p¤@¨ÇDesign TimeªºBplªº¼u¥X¦¡½s¿è¾¹¡C

    ¥Î¤á¥i¥H¦b³]­p®É¥Î¦¹¤¸¥óªº¤¸¥ó½s¿è¾¹´£¨ÑªºLoad dictionary from file...¥\¯àªí§â¦r¨å¸ü¤J¡C

  1. ¦p¦ó¨Ï¥ÎTAcroMultiDBDD?

    »PTAcroMultiFileDD¤ñ¸û¡A¨S¦³FileNameÄݩʡA¦h¤FDataSet:TDataSetÄݩʡA¦r¨å¸ê®Æ±qTDataSet¨Ó¡A¦b©¹Hashªí¶ñ¸ê®Æ«e¥²¶·¥´¶}¡C

  1. ¦p¦ó¨Ï¥ÎTAcroMultiReplacer?

ÄÝ©Ê:

  • CodePage    ­n´À´«¦¨ªº»y¨¥ªºÃѧO½X

  • DDName    ¥Î­þ¥»¦r¨å¨Ó´À´«

  • SeqNo    ¦h·Nµü§Ç¸¹

  • Font    ­n´À´«¦¨ªº¦rÅé

  • ReplaceSelf    ¬O§_´À´«¥»¨­¡A¹w³]True

  • ReplaceOwned    ¬O§_´À´«¥¦ªºComponents¡A¹w³]True

  • ReplaceSon    ¦pªG¥¦¬OTWinControl¡A¬O§_´À´«¥¦ªºControls¡A¹w³]True

  • ReplaceFont    ¬O§_´À´«¦rÅé¡A¹w³]False

(1).¬JµM¦³¤FReplaceComsÄÝ©Ê,¬°¦óÁÙ­n¦³OwnerOptionÄÝ©Ê?

    ¬Ù±¼¥Î¤á¨C¦¸³£­n¦bReplaceComsùØ­±¥[¤JTAcroMultiReplacerªºOwner

    ÁöµM¥Î¤á¥i¥H¦bReplaceComsùØ­±¥[¤JTAcroMultiReplacerªºOwner¡A¦pForm1,¦ý¬O¥Î¤á¦b¹ê»Ú³Ð«ØTForm1ªº¹ê¨Ò®É¡A¹ê¨Òªº¦WºÙ¤£¤@©w³£¬°Form1¡A¦p:

var

  F1,F2:TForm1;

begin

  F1:=TForm1.Create(Application);    //F1ªº¦WºÙ¬°Form1

  F2:=TForm1.Create(Application);    //F2ªº¦WºÙ¬°Form1_1

end;

¦]¦¹¡ATAcroMultiReplacer¤£¯à´À´«F2ªº¦h»y¨¥¡C

(2).¬°¦ó¤£§âReplaceOptionªºSeqNo¹w³]­È©w¬°0?

¡@

    SeqNoÄݩʪºÃþ«¬¬Ostring,·í¦bConstructor¹w³]¥¦ªº­È¬°0«á¡A¥Î¤á¦pªG¦b³]­p®É§â¥¦­×§ï¦¨ªÅ(¥L¥i¯à¤£»Ý­n¤@µü¦h·N)¡ADelphi¤£·|¦bFormªºDFMÀÉ«O¦sSeqNoÄÝ©Ê(ÄݩʫO¦sªº±ø¥ó¬O:«D¹w³]­È¥BProeprtyªº©w¸qªºStored­È¬°true¡CstringÃþ«¬¤£¯à¦bProperty©w¸q¹w³]­È¡A¥¦ªº¹w³]­È´N¬OªÅ)¡C¦]¦¹·í¥Î¤á¤U¦¸¥´¶}¦¹Form®É¡ASeqNoªº­ÈÁÙ¬O0¡C

    ¨º¬°¦ó¤£§âSeqNoÄݩʪºÃþ«¬³]¬°integer©O?¬°³q¥Î©Ê­p¡A¥Î¤á¦³¦Û¤vªº³ß¦n¡A±i¤T³ßÅw§âÄæ¦ìSeqNo©w¬°integer¡A1,2,3...§õ¥|³ßÅw©w¬°string¡AA,B,C...¦pªG§Ú­Ì§âReplaceOption.SeqNo³]¬°integerÄݩʡA´N¤£¯àÂà´«§õ¥|ªºA,B,C...

  1. ¦p¦ó¨Ï¥ÎTAcroMultiScreenEye?

    ¦¹¤¸¥ó¬OºÊµøScreen¥þ§½¤¸¥óªºOnActiveFormChange¨Æ¥ó¡A¦b¥ô¦óForm Active®É¦Û°Ê´À´«¥¦ªº¦h»y¨¥¡C¥Ñ©ó´À´«°Ñ¼Æ¨Ï¥Îªº¬OFormªºClassName©M¤¸¥óªºName¡A¦]¦¹¦U­ÓForm¤£¥Î¨Ï¥Î¥ô¦óªº¦h»y¨¥¤¸¥ó¡A¦pTAcroMultiReplacer¡C

ÄÝ©Ê:

(1).¦p¦ó³]©w¬YÃþFormªº©Ò¦³¹ê¨Ò¦@¥Îªº°Ñ¼Æ?

¡@

    TForm1ªº¹ê¨Ò¦WºÙ¦³Form1,Form1_1,Form1_2...¡AÃø¹D³£­n¤@­Ó­Ó¥[¤J¶Ü?

    ¤£¥²¡A§A§âTMultiReplaceDatum.ComName³]¬°Self´N¦æ¤F¡A¦p:

 

    ·í§A¹ï¬Y­Ó¹ê¨Ò¦³¤£¦Pªº´À´«°Ñ¼Æ®É¡A¥i¥H¦A¥[¤J¹ê¨Òªº¦WºÙ¡A¦p:

¡@

(2).¦p¦ó³]©w¬YÃþForm¤£´À´«?

¡@

    ¦bReplaceDataùØ¥[¤J¦¹FormÃþ§O¡A¦bTMultiFormReplaceDatum.ReplaceFormsùØ¥[¤J¦¹Ãþ§OªºSelf¹ê¨Ò¡AReplaceOptionªºReplaceSelf,ReplaceOwned,ReplaceSon³£³]¬°false,ReplaceComsùØ­±¤@­Ó¤¸¥ó¤]¨S¦³¡C

 

(3).¬°¦ó¤¸¥ó¤£¦Û¤v¦bConstructor©ÎLoaded¥hHook ScreenªºOnActiveFormChange¨Æ¥ó¡A¦Ó­n¥Î¤á¥h½Õ¥ÎHookScreenEvent?

¡@

    ¬°¦w¥þ­p¡A¦]¬°¦h¦¸Hook¨Æ¥ó«á¡A¦bUnHook®É³Ì«á¥i¯à¤£¯à¥¿½T«ì´_¨Æ¥óªº­ì»ª¡A¦p:


var
  Old:TNotifyEvent;
procedure TCom.MyCreate(Sender:TObject);
begin
  if Assigned(Old) then Old(Sender);
  ....Replace Lanaguage....
end;


procedure TCom.Hook;
begin
  Old:=Form1.OnCreate;
  Form1.OnCreate:=ACreate;
end;


procedure TCom.UnHook;
begin
  Form1.OnCreate:=Old;
  Old:=nil;
end;

¦pªGA¤¸¥óHook¤FForm1ªºOnCreate¡A§âForm1­ì¨Óªº¨Æ¥ó«O¦s¦bA.Old,B¤¸¥ó¤S¨ÓHook¤FForm1ªºOnCreate,´N§âA.MyCreate«O¦s¨ì¤FB.Old,¦pªGB¥ýUnHook,A¦AUnHook,¨S°ÝÃD¡A³Ì«áForm1ªºOnCreateÁÙ¬O¥¦­ì¨Óªº¡F¦ý¦pªGA¥ýUnHook¡AB¦AUnHook©O¡H³Ì«áForm1.OnCreate´N¬OA.MyCreate¡C
    ¦]¦¹¡AHook/UnHookªº¶¶§Ç¥²¶·«ö°ïÅ|ªº¤è¦¡¨Ó¶i¦æ¡A¥ý¶i«á¥X¡A¦ýDelphi¨Ã¨S¦³³o¼Ë¤@­Ó¾÷¨î¨ÓÅý¤j®a¿í¦u¡C¦]¦¹§âHookªº°Ê§@¯dµ¹¥Î¤á¡A¥Î¤á¥i¥H¦bFormªºCreate¨Æ¥ó¡A½Õ¥ÎTAcroMultiScreenEye.HookScreenEvent¤èªk¶}©lºÊµø¡A¦bDestroy¨Æ¥ó¡A½Õ¥ÎTAcroMultiScreenEye.UnHookScreenEvent°±¤îºÊµø¡C


Demo:

  1. ColorBall¹CÀ¸Demo(¦p¦ó¨Ï¥ÎTAcroMultiScreenEye)    ­ì½XColorBall.rar

    ³o¬O¤@­Ó¤pªºª«¥ó±Æ¦C¹CÀ¸¡A¬Û¦Pªºª«¥ó¦b¤@±ø½u¤W¹F¨ì¤@©wªº¼Æ¥Ø´N·|®ø¥¢¡AµM«á¼W¥[¤À­È¡A§_«h·|¦A¦h¥X´X­Óª«¥ó¡Aª½¨ì®æ¤l¶ëº¡¡C

    ¥DForm¤W©ñ¤F¨â­Ó¦h»y¨¥¤¸¥ó¡A¤@­ÓAcroMultiStreamDD1:TAcroMultiStreamDD,¤@­ÓAcroMultiScreenEye1:TAcroMultiScreenEye¡C

    AcroMultiStreamDD1ªºDDName¬°DD0,³]­p®É´N§â²ÁcÅé¨âºØ»y¨¥ªº¸ê®Æ©ñ¦bAcroMultiStreamDD1ªºDictionaryÄÝ©ÊùؤF¡A¦pªG­n¹î¬Ý¦r¨å¤º®e¡A¥i¥H¥kÁ䳿À»¦¹¤¸¥ó¡A¿ï¾ÜSave Dictionary to File...§â¦r¨å¤º®e¿é¥X¨ìÀÉ¡C³o¼Ë,´N¤£¥Î¥~±a¦r¨åÀÉ¡A«K©ó³oºØ¤p¹CÀ¸ªº¤Àµo¡C

    AcroMultiScreenEye1ªºDefaultReplaceOption.DDName³]¬°DD0,DefaultReplaceOption.SeqNo³]¬°0¡ADD0,DefaultReplaceOption.CodePage¯d¨ìFormCreateùØ«ö§@·~¨t²Îªº»y¨¥¨Ó³]¡FReplaceNotRegistered³]¬°false,ªí¥Ü¤£¹ï¨S¦³¥[¨ìReplaceDataùتºForm´À´«¦h»y¨¥¡A¦p¤@¨Ç°T®§¤è¶ô¡A¥Ñ©ó¬O¥ÎªºAPI¨ç¼ÆMessageBox,¥¦¤W­±ªº«ö¶sµ¥¥»¨­¬O§@·~¨t²Îªº»y¨¥¤å¦r¡A¤£¥²´À´«¡CReplaceDataùØ­±¥[¤F3¶µ:

procedure TFormOption.FormShow(Sender: TObject);
begin
  AcroDDStorage.ReplaceComLanguage('DD0',ComboBox_Icon,InttoStr(GetACP),'0',nil,true,false,false,false);
  ComboBox_Icon.ItemIndex:=StrToInt(FOption.IconSystem);
  ComboBox_LineWidth.ItemIndex:=FOption.LineWidth-2;
  ComboBox_IconKind.ItemIndex:=FOption.IconKind-2;
  CheckBox_Animate.Checked:=FOption.Animate;
  ComboBox_NewBallCount.ItemIndex:=FOption.NewBallCount-1;
  CheckBox_PlaySound.Checked:=FOption.PlaySound;
end;

    ¦b¥DFormªºOnCreate¨Æ¥ó¡A½Õ¥Î¤FAcroMultiScreenEye1ªºHookScreenEvent¶}©lºÊµøScreenªºOnActiveFormChange¨Æ¥ó¡A¨Ã³]¤F¦U­ÓReplaceOptionªºCodePage,

procedure TFormColorBall.FormCreate(Sender: TObject);
var
  i,j,k:integer;
  ARD:TMultiReplaceDatum;
  ARF:TMultiReplaceForm;
begin
  AcroMultiScreenEye1.HookScreenEvent;
  AcroMultiScreenEye1.DefaultReplaceOption.CodePage:=InttoStr(GetACP);
  for i:=0 to AcroMultiScreenEye1.ReplaceData.Count-1 do
  begin
    ARD:=AcroMultiScreenEye1.ReplaceData.Items[i];
    for j:=0 to ARD.ReplaceForms.Count-1 do
    begin
      ARF:=ARD.ReplaceForms.Items[j];
      ARF.ReplaceOption.CodePage:=InttoStr(GetACP);
      for k:=0 to ARF.ReplaceComs.Count-1 do
        ARF.ReplaceComs.Items[k].ReplaceOption.CodePage:=InttoStr(GetACP);
    end;
  end;
end;

  1. Delphi VCL¤¸¥ó¤Î²Ä3¤è¤¸¥óDemo(¦p¦ó¨Ï¥ÎTAcroMultiReplacer)    ­ì½XMultiLangDemo.rar

    ¨ä¤¤ªºDemo3rParty.pas¬O¥Î©ó²Ä3¤è¤¸¥ódev expressªº¡A¦pªG¥Î¤á¨S¦³¡A¥i¥H±qdpr¤¤²¾¥X¡A¨Ã²¾¥XdxClassMethod.pas


FAQ:

(1).AcroMultiDD.pas³æ¤¸¡ATCustomMultiDD¤¸¥ó

function GetDisplayValue(ADDKey,ACodePage,ASeqNo:string):string;

(2).AcroMultiDD.pas³æ¤¸¡ATAcroMultiDDStorage¤¸¥ó¡A¦p¥þ§½ªºAcroDDStorage¤¸¥ó

function GetDisplayValue(ADDName,ADDKey,ACodePage,ASeqNo:string):string;

(3).AcroMultiClassMethod.pas³æ¤¸ªº¥þ§½function

function GetDisplayValue(ATable:IDataLocate;ADDKey,ACodePage,ASeqNo:string):string;

 

ATable°Ñ¼Æ¥i¥H¶ÇTCustomMultiDD¤¸¥ó¡A¦]¬°¥¦¹ê§@¤FIDataLocate¤¶­±

³]­p®É¡A

(1).¥i¥H¦bTAcroMultiReplacer.ReplaceComsùØ¥[¤J¡F

(2).¥i¥H¦bTAcroMultiScreenEye.ReplaceDataùØ¥[¤J¡F

 

¹B¦æ®É¡A

(1).TCustomMultiDD¤¸¥ó

procedure ReplaceComLanguage(ACom:TObject;ACodePage,ASeqNo:string;AFont:TFont;ReplaceSelf,ReplaceOwned,ReplaceSon,ReplaceFont:Boolean);

 

(2).TAcroMultiDDStorage¤¸¥ó,¦p¥þ§½ªºAcroDDStorage¤¸¥ó

procedure ReplaceComLanguage(ADDName:string;ACom:TObject;ACodePage,ASeqNo:string;AFont:TFont;ReplaceSelf,ReplaceOwned,ReplaceSon,ReplaceFont:Boolean);

    ¸ê®Æ¦r¨åªºDDKey©MDisplayValueÄæ¦ì¬O¥²¶·ªº¡A¥i¥H¤£¥ÎCodePage¡ASeqNo©MCatalogIDÄæ¦ì¡C¦pªG§AªºÄæ¦ì¦WºÙ©Î¼Æ¥Ø¤£»P¥»¤½¥q¹w³]ªº¤@­P¡A½Ð§âTCustomMultiDDªºUseDefaultFields³]¬°False,¨Ã¦bFieldsOptionÄÝ©ÊùØ«ü©w¨º4­ÓÄæ¦ìªº¦WºÙ¡A¦pªGÄæ¦ì¦WºÙ¬°ªÅ¡Aªí¥Ü¤£¨Ï¥Î¦¹Äæ¦ì¡C

    ¥Î¤á¥i¥H±qTCustomStreamDDReader¤¸¥óÄ~©Ó¡A¨ÓŪ¨ú¦Û¤vªº¸ê®Æ¬y¡F¤]¥i¥H±qTCustomTextStreamDDReader¤¸¥óÄ~©Ó¡A½Æ¼gfunction DecodeStr(const Source:string):string;override;¨ÓŪ¨ú¤å¥»®æ¦¡ªº¦r¨å¸ê®Æ¡C

    ¥Î¤á¼g¦n¤FŪ¨ú¦Û¤v®æ¦¡¸ê®Æªº¤¸¥ó«á¡A­n½Õ¥Î¥þ§½¤¸¥óAcroDDReaderStorage:TAcroMultiStreamDDReaderStorage;ªºprocedure RegisterDDReader(AReaderID:string;AReader:TCustomStreamDDReaderClass);¤èªk¨Óµù¥U¡A¦p¦b³æ¤¸ªºinitialization³¡¤À:

AcroDDReaderStorage.RegisterDDReader('AcroBinary',TBinaryStreamDDReader);

AReaderID¬O¤¸¥ó¼ÐÃÑ¡A³]­p®ÉÄݩʽs¿è¾¹·|¬°TCustomMultiReaderDDªºDDReaderIDÄݩʦC¥X¥þ³¡µù¥U¤Fªº¦r¨åŪ¨ú¤¸¥óªº¼ÐÃѦr¦ê¡A¦pªG¥Î¤áªº¤¸¥ó¬O¦b¹B¦æ®É¤~µù¥U¡AÄݩʽs¿è¾¹´NµLªk¦C¥X¡A¥Î¤á¥i¥Hª½±µ¿é¤J¡C


2003.2