¦h»y¨¥®M¥ó¨Ï¥Î»¡©ú
![]()
¦w¼wµØ³nÅ餽¥q
(1).¦r¨åÀɪºÀɮ榡?
(1).¦p¦ó³]©w¬YÃþFormªº©Ò¦³¹ê¨Ò¦@¥Îªº°Ñ¼Æ?
Demo:
ColorBall¹CÀ¸Demo(¦p¦ó¨Ï¥ÎTAcroMultiScreenEye) ì½XColorBall.rar
Delphi VCL¤¸¥ó¤Î²Ä3¤è¤¸¥óDemo(¦p¦ó¨Ï¥ÎTAcroMultiReplacer) ì½XMultiLangDemo.rar
FAQ:
¹ï±M®×¦b¤£¦P°ê®a©Î¦a°Ïªº¤£¦P»y¨¥¤Uªº¨Ï¥Î´£¨Ñ¤ä´©¡A¤ÀÂ÷°õ¦æµ{¦¡»P¦h»y¨¥¹ê²{¡A«½Æ§Q¥Î¸ê®Æ¦r¨å¡A²¤Æ¶}µo¨BÆJ¡C
¸ê®Æ¦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
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:
AcroMultiLang60.dpk ¹B¦æ¥]¡A½sĶ
AcroMultiLang60_Design.dpk ³]p¥]¡A¦w¸Ë
AcroMultiDBLang60.dpk ¹B¦æ¥]¡A½sĶ
AcroMultiDBLang60_Design.dpk ³]p¥]¡A¦w¸Ë
![]()
¦h»y¨¥®M¥óµù¥U¤F¤U¦C¤@¨Ç¤¸¥ó:
¦p¦óµù¥U²Ä¤T¤è¤¸¥óªº´À´«¨ç¼Æ©O?«Ü²³æ¡A§A¥un©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
ÄÝ©Ê:
- FileName,¦r¨å¸ê®Æ¨Óì©lÀÉ®×,¥i¥H¨Ï¥Îµ´¹ï¸ô®|¡A¦pD:\DD\FormDD.abf¡F¤]¥i¥H¨Ï¥Î¬Û¹ï¸ô®|¡A¦pªG§AªºexeÀɦbD:\DD\,¨º»òFileName¥i¥H³]¬°FormDD.abf¡F¦pªG§AªºexeÀɦbD:\¡AFileName¥i¥H³]¬°DD\FormDD.abf
- DDReaderID,Ū¨ú¦r¨å¸ê®Æªº¤¸¥óÃþ§OID¡A¹w³]¬°AcroTextCSV
- DDName,¦r¨å¦WºÙ
- FieldsOption,Äæ¦ì¬M®g
- UseDefaultFields,¬O§_¨Ï¥Î¹w³]ªºÄæ¦ì¦WºÙ©M¼Æ¥Ø¡A¹w³]ÈTrue
¡@
¹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ºØÀɮ榡:
AcroTextDFM
³W«h:
²Ä¤@¦æ¬°Äæ¦ì¦WºÙ¡A¨CÓÄæ¦ì¥Î³r¸¹¤À¹j¡AÈ¥ÎÂù¤Þ¸¹¥]§¨¡F
²Ä¤G¦æ¶}©l¬°¬ö¿ý¸ê®Æ¡A¨C±ø°O¿ý¤@¦æ¡F
Âù¤Þ¸¹"Åܦ¨¨âÓ¡F
ASCII½X¤p©ó32ªºÅܦ¨#¸¹¥[¤WASCII½XÈ¡A¥B¤£¥ÎÂù¤Þ¸¹¥]§¨¡A¦p¦^¨®¡AÅܦ¨#13
¨Ò:
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",
AcroTextCSV
³W«h:
²Ä¤@¦æ¬°Äæ¦ì¦WºÙ¡A¨CÓÄæ¦ì¥Î³r¸¹¤À¹j¡AÈ¥ÎÂù¤Þ¸¹¥]§¨¡F
²Ä¤G¦æ¶}©l¬°¬ö¿ý¸ê®Æ¡A¨C±ø°O¿ý¤@¦æ¡F
Âù¤Þ¸¹"Åܦ¨¨âÓ¡F
¦^¨®Åܦ¨%c
´«¦æÅܦ¨%n
ASCAII½X0Åܦ¨%0 -----(ª`:¹s)
%Åܦ¨¨âÓ
¨Ò:
File "%s" not found!
Retry?
¡@
¿é¥Xµ²ªG¬°:
"File ""%%s"" not found!%c%nRetry?"
¡@
¦r¨åÀÉ»PdfTextDFMÃþ¦ü¡C
AcroBinary
³W«h:
³sÄòªº¦ì¤¸²Õ¬y¡A¤£¤À¦æ¡A¨ãÅ鬰:
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Äæ¦ìÈ
¦pªG¬YÓÄæ¦ìȪø«×¬°-1,ªí¥ÜNull
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¤@©wn±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
¡@
<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,QuoteCharn¥Î¹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;
»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
»PTAcroMultiFileDD¤ñ¸û¡A¨S¦³FileNameÄݩʡA¦h¤FDataSet:TDataSetÄݩʡA¦r¨å¸ê®Æ±qTDataSet¨Ó¡A¦b©¹Hashªí¶ñ¸ê®Æ«e¥²¶·¥´¶}¡C
ÄÝ©Ê:
OwnerOption:TMultiReplaceOption TAcroMultiReplacerªºOwnerªº´À´«°Ñ¼Æ
ReplaceOption ´À´«°Ñ¼Æ
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
ReplaceComs ¦UÓ¤¸¥óªº´À´«°Ñ¼Æ
UnReplaceComs ¤£´À´«ªº¤¸¥ó
AutoReplace ¬O§_¦bLoaded®É¶}©l´À´«¡A¹w³]Ȭ°True
(1).¬JµM¦³¤FReplaceComsÄÝ©Ê,¬°¦óÁÙn¦³OwnerOptionÄÝ©Ê?
¤è«K©Ê
¬Ù±¼¥Î¤á¨C¦¸³£n¦bReplaceComsùر¥[¤JTAcroMultiReplacerªºOwner
¥²n©Ê
Áöµ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...
¦¹¤¸¥ó¬OºÊµøScreen¥þ§½¤¸¥óªºOnActiveFormChange¨Æ¥ó¡A¦b¥ô¦óForm Active®É¦Û°Ê´À´«¥¦ªº¦h»y¨¥¡C¥Ñ©ó´À´«°Ñ¼Æ¨Ï¥Îªº¬OFormªºClassName©M¤¸¥óªºName¡A¦]¦¹¦UÓForm¤£¥Î¨Ï¥Î¥ô¦óªº¦h»y¨¥¤¸¥ó¡A¦pTAcroMultiReplacer¡C
ÄÝ©Ê:
- DefaultReplaceOption ¹w³]ªº´À´«°Ñ¼Æ¡A·í¦bFormReplaceDataùبS¦³§ä¨ìFormªº´À´«°Ñ¼Æ®É¡A´N¥Î¦¹°Ñ¼Æ
- ReplaceData ¦UºØFormÃþ§Oªº´À´«°Ñ¼Æ
(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:
¡@
¡@
¦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:
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ªGn¹î¬Ý¦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¶µ:
FormClassName¬°TFormColorBall,¥¦ªºReplaceForms¦³¤@¶µ¡AFormName¬°Self¡FReplaceOptionªºDDName¤]¬ODD0,SeqNo¬°0¡ACodePage¤]¯d«ÝFormCreate³]¡FReplaceComs¬°ªÅ¡A¦]¬°¨S¦³¤¸¥ón¯S®í³B²z¡FUnReplaceComsùئ³¤@ÓÈ:CoolBar_Tool,¥¦¬O¤¸¥ó¦WºÙ¡Aªí¥Ü¥¦¤£n´À´«¡A¦]¬°CollBarªºBands[0].Caption§Ú¬O¥Î¨ÓÅã¥Ü±o¤À³Ì°ªªÌªº¦W¦rªº¡A¤£¯à´À´«¡C
FormClassName¬°TFormOption,¥¦ªºReplaceForm¤]¥u¦³Self¤@¶µ¡A¦ý¨ä¤UªºUnReplaceComs¨½¥[¤F4Ó¤¸¥ó¦WºÙ:
ComboBox_IconKind ª«¥óºØ¼Æ¡A¬°¼Æ¦r¡A¤£¥Î´À´«
ComboBox_LineWidth º¡¨¬¾P±¼±ø¥óªº¤@±ø½u¤Wªº³sÄò¦PÃþª«¥ó¼Æ¥Ø¡A¬°¼Æ¦ì¡A¤£¥Î´À´«
ComboBox_NewBallCount ¨C¦¸·s¼W¥[ªºª«¥ó¼Æ¥Ø¡A¬°¼Æ¦ì¡A¤£¥Î´À´«
ComboBox_Icon ª«¥óªºÃþ§O¡A¦p¼p¨ã¡A©øÂÎ...¥¦À³¸Ó´À´«§r¡A¬°¦ó¤]¥[¤J¤£´À´«ªº¦æ¦C¡A¦]¬°TComboBox¤¸¥óªºÃö«Y¡A§Ún¦b°Ñ¼Æ°t¸mFormªºOnShowùØ¡A«ö²{¦bªº°Ñ¼ÆÅã¥Ü¡A¦p³]¥¦ªºItemIndex,¦ý·í¥¦Activateªº®ÉÔ¡A¥¦³QAcroMultiScreenEye1µo²{¤F¡A©ó¬O¥¦ªºItems³£³Q´«¦¨¤¤¤å¡A¤@¥¹×§ïItems¡AItemIndex¦Û°Ê´N³]¬°-1¤F¡A¨º´N¤£¯à¤Ï¬M²{¦bªº°Ñ¼Æ±¡ªp¤F¡C(¥ÎTAcroMultiReplacer¨S¦³¦¹°ÝÃD¡A¦]¬°´À´«¤ñOnShow¦)¡C¦]¦¹§Ú³oùؤ£¯à´«¥¦¡A¦Ó¬O¦bOnShow´À´«¡A¦p:
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;
FormClassName¬°TFormAbout,ReplaceDats¥[¤J¤FSelf¤¸¥ó¡A¨S¦³¯S®íªº³B²z
¦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;
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®æ¦¡¸ê®Æªº¤¸¥ó«á¡An½Õ¥Î¥þ§½¤¸¥ó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