Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit reinit;
- interface
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms;
- procedure ReinitializeForms;
- function LoadNewResourceModule(Locale: LCID): Longint;
- {
- procedure TMainForm.SwitchLanguage(Sender: TObject);
- var
- Name : String;
- Size : Integer;
- begin
- // TComponent(Sender).Tag could be like:
- // ENGLISH = (SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;
- // FRENCH = (SUBLANG_FRENCH shl 10) or LANG_FRENCH;
- // GERMAN = (SUBLANG_GERMAN shl 10) or LANG_GERMAN;
- if LoadNewResourceModule(TComponent(Sender).Tag) <> 0 then
- begin
- Name := FontName.Text;
- Size := StrToInt(FontSize.Text);
- ReinitializeForms;
- LanguageEnglish.Checked := (LanguageEnglish = Sender);
- LanguageFrench.Checked := (LanguageFrench = Sender);
- LanguageGerman.Checked := (LanguageGerman = Sender);
- CurrText.Name := Name;
- CurrText.Size := Size;
- SelectionChange(Self);
- FontName.SelLength := 0;
- SetupRuler;
- if Visible then Editor.SetFocus;
- end;
- end;
- }
- implementation
- type
- TAsInheritedReader = class(TReader)
- public
- procedure ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer); override;
- end;
- procedure TAsInheritedReader.ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer);
- begin
- inherited ReadPrefix(Flags, AChildPos);
- Include(Flags, ffInherited);
- end;
- function SetResourceHInstance(NewInstance: Longint): Longint;
- var
- CurModule: PLibModule;
- begin
- CurModule := LibModuleList;
- Result := 0;
- while CurModule <> nil do
- begin
- if CurModule.Instance = HInstance then
- begin
- if CurModule.ResInstance <> CurModule.Instance then
- FreeLibrary(CurModule.ResInstance);
- CurModule.ResInstance := NewInstance;
- Result := NewInstance;
- Exit;
- end;
- CurModule := CurModule.Next;
- end;
- end;
- function LoadNewResourceModule(Locale: LCID): Longint;
- var
- FileName: array [0..260] of char;
- P: PChar;
- LocaleName: array[0..4] of Char;
- NewInst: Longint;
- begin
- GetModuleFileName(HInstance, FileName, SizeOf(FileName));
- GetLocaleInfo(Locale, LOCALE_SABBREVLANGNAME, LocaleName, SizeOf(LocaleName));
- P := PChar(@FileName) + lstrlen(FileName);
- while (P^ <> '.') and (P <> @FileName) do Dec(P);
- NewInst := 0;
- Result := 0;
- if P <> @FileName then
- begin
- Inc(P);
- if LocaleName[0] <> #0 then
- begin
- // Then look for a potential language/country translation
- lstrcpy(P, LocaleName);
- NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);
- if NewInst = 0 then
- begin
- // Finally look for a language only translation
- LocaleName[2] := #0;
- lstrcpy(P, LocaleName);
- NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);
- end;
- end;
- end;
- if NewInst <> 0 then
- Result := SetResourceHInstance(NewInst)
- end;
- function InternalReloadComponentRes(const ResName: string; HInst: THandle; var Instance: TComponent): Boolean;
- var
- HRsrc: THandle;
- ResStream: TResourceStream;
- AsInheritedReader: TAsInheritedReader;
- begin { avoid possible EResNotFound exception }
- if HInst = 0 then HInst := HInstance;
- HRsrc := FindResource(HInst, PChar(ResName), RT_RCDATA);
- Result := HRsrc <> 0;
- if not Result then Exit;
- ResStream := TResourceStream.Create(HInst, ResName, RT_RCDATA);
- try
- AsInheritedReader := TAsInheritedReader.Create(ResStream, 4096);
- try
- Instance := AsInheritedReader.ReadRootComponent(Instance);
- finally
- AsInheritedReader.Free;
- end;
- finally
- ResStream.Free;
- end;
- Result := True;
- end;
- function ReloadInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;
- function InitComponent(ClassType: TClass): Boolean;
- begin
- Result := False;
- if (ClassType = TComponent) or (ClassType = RootAncestor) then Exit;
- Result := InitComponent(ClassType.ClassParent);
- Result := InternalReloadComponentRes(ClassType.ClassName, FindResourceHInstance(
- FindClassHInstance(ClassType)), Instance) or Result;
- end;
- begin
- Result := InitComponent(Instance.ClassType);
- end;
- procedure ReinitializeForms;
- var
- Count: Integer;
- I: Integer;
- Form: TForm;
- begin
- Count := Screen.FormCount;
- for I := 0 to Count - 1 do
- begin
- Form := Screen.Forms[I];
- ReloadInheritedComponent(Form, TForm);
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement