home *** CD-ROM | disk | FTP | other *** search
/ PC World Plus! (NZ) 2001 June / HDC50.iso / Runimage / Delphi50 / Demos / Richedit / REINIT.PAS < prev    next >
Pascal/Delphi Source File  |  1999-08-11  |  4KB  |  133 lines

  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: TForm;
  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.
  133.