root / ReInit.pas @ 3
Historique | Voir | Annoter | Télécharger (3,553 ko)
1 |
unit reinit;
|
---|---|
2 |
|
3 |
interface
|
4 |
|
5 |
uses
|
6 |
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms; |
7 |
|
8 |
procedure ReinitializeForms;
|
9 |
function LoadNewResourceModule(Locale: LCID): Longint;
|
10 |
|
11 |
implementation
|
12 |
|
13 |
type
|
14 |
TAsInheritedReader = class(TReader)
|
15 |
public
|
16 |
procedure ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer); override; |
17 |
end;
|
18 |
|
19 |
procedure TAsInheritedReader.ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer); |
20 |
begin
|
21 |
inherited ReadPrefix(Flags, AChildPos);
|
22 |
Include(Flags, ffInherited); |
23 |
end;
|
24 |
|
25 |
function SetResourceHInstance(NewInstance: Longint): Longint;
|
26 |
var
|
27 |
CurModule: PLibModule; |
28 |
begin
|
29 |
CurModule := LibModuleList; |
30 |
Result := 0;
|
31 |
while CurModule <> nil do |
32 |
begin
|
33 |
if CurModule.Instance = HInstance then |
34 |
begin
|
35 |
if CurModule.ResInstance <> CurModule.Instance then |
36 |
FreeLibrary(CurModule.ResInstance); |
37 |
CurModule.ResInstance := NewInstance; |
38 |
Result := NewInstance; |
39 |
Exit; |
40 |
end;
|
41 |
CurModule := CurModule.Next; |
42 |
end;
|
43 |
end;
|
44 |
|
45 |
function LoadNewResourceModule(Locale: LCID): Longint;
|
46 |
var
|
47 |
FileName: array [0..260] of char; |
48 |
P: PChar; |
49 |
LocaleName: array[0..4] of Char; |
50 |
NewInst: Longint; |
51 |
begin
|
52 |
GetModuleFileName(HInstance, FileName, SizeOf(FileName)); |
53 |
GetLocaleInfo(Locale, LOCALE_SABBREVLANGNAME, LocaleName, SizeOf(LocaleName)); |
54 |
P := PChar(@FileName) + lstrlen(FileName); |
55 |
while (P^ <> '.') and (P <> @FileName) do Dec(P); |
56 |
NewInst := 0;
|
57 |
Result := 0;
|
58 |
if P <> @FileName then |
59 |
begin
|
60 |
Inc(P); |
61 |
if LocaleName[0] <> #0 then |
62 |
begin
|
63 |
// Then look for a potential language/country translation
|
64 |
lstrcpy(P, LocaleName); |
65 |
NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);
|
66 |
if NewInst = 0 then |
67 |
begin
|
68 |
// Finally look for a language only translation
|
69 |
LocaleName[2] := #0; |
70 |
lstrcpy(P, LocaleName); |
71 |
NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);
|
72 |
end;
|
73 |
end;
|
74 |
end;
|
75 |
if NewInst <> 0 then |
76 |
Result := SetResourceHInstance(NewInst) |
77 |
end;
|
78 |
|
79 |
function InternalReloadComponentRes(const ResName: string; HInst: THandle; var Instance: TComponent): Boolean; |
80 |
var
|
81 |
HRsrc: THandle; |
82 |
ResStream: TResourceStream; |
83 |
AsInheritedReader: TAsInheritedReader; |
84 |
begin { avoid possible EResNotFound exception } |
85 |
if HInst = 0 then HInst := HInstance; |
86 |
HRsrc := FindResource(HInst, PChar(ResName), RT_RCDATA); |
87 |
Result := HRsrc <> 0;
|
88 |
if not Result then Exit; |
89 |
ResStream := TResourceStream.Create(HInst, ResName, RT_RCDATA); |
90 |
try
|
91 |
AsInheritedReader := TAsInheritedReader.Create(ResStream, 4096);
|
92 |
try
|
93 |
Instance := AsInheritedReader.ReadRootComponent(Instance); |
94 |
finally
|
95 |
AsInheritedReader.Free; |
96 |
end;
|
97 |
finally
|
98 |
ResStream.Free; |
99 |
end;
|
100 |
Result := True; |
101 |
end;
|
102 |
|
103 |
function ReloadInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;
|
104 |
|
105 |
function InitComponent(ClassType: TClass): Boolean;
|
106 |
begin
|
107 |
Result := False; |
108 |
if (ClassType = TComponent) or (ClassType = RootAncestor) then Exit; |
109 |
Result := InitComponent(ClassType.ClassParent); |
110 |
Result := InternalReloadComponentRes(ClassType.ClassName, FindResourceHInstance( |
111 |
FindClassHInstance(ClassType)), Instance) or Result;
|
112 |
end;
|
113 |
|
114 |
begin
|
115 |
Result := InitComponent(Instance.ClassType); |
116 |
end;
|
117 |
|
118 |
procedure ReinitializeForms;
|
119 |
var
|
120 |
Count: Integer; |
121 |
I: Integer; |
122 |
Form: TTntForm; |
123 |
begin
|
124 |
Count := Screen.FormCount; |
125 |
for I := 0 to Count - 1 do |
126 |
begin
|
127 |
Form := Screen.Forms[I]; |
128 |
ReloadInheritedComponent(Form, TForm); |
129 |
end;
|
130 |
end;
|
131 |
|
132 |
end.
|