{*****************************************************************************} { } { Tnt Delphi Unicode Controls } { http://www.tntware.com/delphicontrols/unicode/ } { Version: 2.3.0 } { } { Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } { } {*****************************************************************************} unit TntForms; {$INCLUDE TntCompilers.inc} interface uses Classes, Windows, Messages, Controls, Forms, TntControls; type {TNT-WARN TScrollBox} TTntScrollBox = class(TScrollBox{TNT-ALLOW TScrollBox}) private FWMSizeCallCount: Integer; function IsHintStored: Boolean; function GetHint: WideString; procedure SetHint(const Value: WideString); procedure WMSize(var Message: TWMSize); message WM_SIZE; protected procedure CreateWindowHandle(const Params: TCreateParams); override; procedure DefineProperties(Filer: TFiler); override; function GetActionLinkClass: TControlActionLinkClass; override; procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; published property Hint: WideString read GetHint write SetHint stored IsHintStored; end; {TNT-WARN TCustomFrame} TTntCustomFrame = class(TCustomFrame{TNT-ALLOW TCustomFrame}) private function IsHintStored: Boolean; function GetHint: WideString; procedure SetHint(const Value: WideString); protected procedure CreateWindowHandle(const Params: TCreateParams); override; procedure DefineProperties(Filer: TFiler); override; function GetActionLinkClass: TControlActionLinkClass; override; procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; published property Hint: WideString read GetHint write SetHint stored IsHintStored; end; {TNT-WARN TFrame} TTntFrame = class(TTntCustomFrame) published property Align; property Anchors; property AutoScroll; property AutoSize; property BiDiMode; property Constraints; property DockSite; property DragCursor; property DragKind; property DragMode; property Enabled; property Color nodefault; property Ctl3D; property Font; {$IFDEF COMPILER_10_UP} property Padding; {$ENDIF} {$IFDEF COMPILER_7_UP} property ParentBackground default True; {$ENDIF} property ParentBiDiMode; property ParentColor; property ParentCtl3D; property ParentFont; property ParentShowHint; property PopupMenu; property ShowHint; property TabOrder; property TabStop; property Visible; {$IFDEF COMPILER_9_UP} property OnAlignInsertBefore; property OnAlignPosition; {$ENDIF} property OnCanResize; property OnClick; property OnConstrainedResize; property OnContextPopup; property OnDblClick; property OnDockDrop; property OnDockOver; property OnDragDrop; property OnDragOver; property OnEndDock; property OnEndDrag; property OnEnter; property OnExit; property OnGetSiteInfo; {$IFDEF COMPILER_9_UP} property OnMouseActivate; {$ENDIF} property OnMouseDown; {$IFDEF COMPILER_10_UP} property OnMouseEnter; property OnMouseLeave; {$ENDIF} property OnMouseMove; property OnMouseUp; property OnMouseWheel; property OnMouseWheelDown; property OnMouseWheelUp; property OnResize; property OnStartDock; property OnStartDrag; property OnUnDock; end; {TNT-WARN TForm} TTntForm = class(TForm{TNT-ALLOW TForm}) private function GetCaption: TWideCaption; procedure SetCaption(const Value: TWideCaption); function GetHint: WideString; procedure SetHint(const Value: WideString); function IsCaptionStored: Boolean; function IsHintStored: Boolean; procedure WMMenuSelect(var Message: TWMMenuSelect); message WM_MENUSELECT; procedure CMBiDiModeChanged(var Message: TMessage); message CM_BIDIMODECHANGED; procedure WMWindowPosChanging(var Message: TMessage); message WM_WINDOWPOSCHANGING; protected procedure UpdateActions; override; procedure CreateWindowHandle(const Params: TCreateParams); override; procedure DestroyWindowHandle; override; procedure DefineProperties(Filer: TFiler); override; function GetActionLinkClass: TControlActionLinkClass; override; procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; function CreateDockManager: IDockManager; override; public constructor Create(AOwner: TComponent); override; procedure DefaultHandler(var Message); override; published property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; property Hint: WideString read GetHint write SetHint stored IsHintStored; end; TTntApplication = class(TComponent) private FMainFormChecked: Boolean; FHint: WideString; FTntAppIdleEventControl: TControl; FSettingChangeTime: Cardinal; FTitle: WideString; function GetHint: WideString; procedure SetAnsiAppHint(const Value: AnsiString); procedure SetHint(const Value: WideString); function GetExeName: WideString; function IsDlgMsg(var Msg: TMsg): Boolean; procedure DoIdle; function GetTitle: WideString; procedure SetTitle(const Value: WideString); procedure SetAnsiApplicationTitle(const Value: AnsiString); function ApplicationMouseControlHint: WideString; protected function WndProc(var Message: TMessage): Boolean; function ProcessMessage(var Msg: TMsg): Boolean; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property Hint: WideString read GetHint write SetHint; property ExeName: WideString read GetExeName; property SettingChangeTime: Cardinal read FSettingChangeTime; property Title: WideString read GetTitle write SetTitle; end; {TNT-WARN IsAccel} function IsWideCharAccel(CharCode: Word; const Caption: WideString): Boolean; {TNT-WARN PeekMessage} {TNT-WARN PeekMessageA} {TNT-WARN PeekMessageW} procedure EnableManualPeekMessageWithRemove; procedure DisableManualPeekMessageWithRemove; type TFormProc = procedure (Form: TForm{TNT-ALLOW TForm}); var TntApplication: TTntApplication; procedure InitTntEnvironment; implementation uses SysUtils, Consts, RTLConsts, Menus, FlatSB, StdActns, Graphics, TntSystem, TntSysUtils, TntMenus, TntActnList, TntStdActns, TntClasses; function IsWideCharAccel(CharCode: Word; const Caption: WideString): Boolean; var W: WideChar; begin W := KeyUnicode(CharCode); Result := WideSameText(W, WideGetHotKey(Caption)); end; { TTntScrollBox } procedure TTntScrollBox.CreateWindowHandle(const Params: TCreateParams); begin CreateUnicodeHandle(Self, Params, ''); end; procedure TTntScrollBox.DefineProperties(Filer: TFiler); begin inherited; TntPersistent_AfterInherited_DefineProperties(Filer, Self); end; function TTntScrollBox.IsHintStored: Boolean; begin Result := TntControl_IsHintStored(Self); end; function TTntScrollBox.GetHint: WideString; begin Result := TntControl_GetHint(Self); end; procedure TTntScrollBox.SetHint(const Value: WideString); begin TntControl_SetHint(Self, Value); end; procedure TTntScrollBox.ActionChange(Sender: TObject; CheckDefaults: Boolean); begin TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); inherited; end; function TTntScrollBox.GetActionLinkClass: TControlActionLinkClass; begin Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); end; procedure TTntScrollBox.WMSize(var Message: TWMSize); begin Inc(FWMSizeCallCount); try if FWMSizeCallCount < 32 then { Infinite recursion was encountered on Win 9x. } inherited; finally Dec(FWMSizeCallCount); end; end; { TTntCustomFrame } procedure TTntCustomFrame.CreateWindowHandle(const Params: TCreateParams); begin CreateUnicodeHandle(Self, Params, ''); end; procedure TTntCustomFrame.DefineProperties(Filer: TFiler); begin inherited; TntPersistent_AfterInherited_DefineProperties(Filer, Self); end; function TTntCustomFrame.IsHintStored: Boolean; begin Result := TntControl_IsHintStored(Self); end; function TTntCustomFrame.GetHint: WideString; begin Result := TntControl_GetHint(Self); end; procedure TTntCustomFrame.SetHint(const Value: WideString); begin TntControl_SetHint(Self, Value); end; procedure TTntCustomFrame.ActionChange(Sender: TObject; CheckDefaults: Boolean); begin TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); inherited; end; function TTntCustomFrame.GetActionLinkClass: TControlActionLinkClass; begin Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); end; { TTntForm } constructor TTntForm.Create(AOwner: TComponent); begin // standard construction technique (look at TForm.Create) GlobalNameSpace.BeginWrite; try CreateNew(AOwner); if (ClassType <> TTntForm) and not (csDesigning in ComponentState) then begin Include(FFormState, fsCreating); try if not InitInheritedComponent(Self, TTntForm) then raise EResNotFound.CreateFmt(SResNotFound, [ClassName]); finally Exclude(FFormState, fsCreating); end; if OldCreateOrder then DoCreate; end; finally GlobalNameSpace.EndWrite; end; end; procedure TTntForm.CreateWindowHandle(const Params: TCreateParams); var NewParams: TCreateParams; WideWinClassName: WideString; begin if (not Win32PlatformIsUnicode) then inherited else if (FormStyle = fsMDIChild) and not (csDesigning in ComponentState) then begin if (Application.MainForm = nil) or (Application.MainForm.ClientHandle = 0) then raise EInvalidOperation.Create(SNoMDIForm); RegisterUnicodeClass(Params, WideWinClassName); DefWndProc := @DefMDIChildProcW; WindowHandle := CreateMDIWindowW(PWideChar(WideWinClassName), nil, Params.style, Params.X, Params.Y, Params.Width, Params.Height, Application.MainForm.ClientHandle, hInstance, Longint(Params.Param)); if WindowHandle = 0 then RaiseLastOSError; SubClassUnicodeControl(Self, Params.Caption); Include(FFormState, fsCreatedMDIChild); end else begin NewParams := Params; NewParams.ExStyle := NewParams.ExStyle and not WS_EX_LAYERED; CreateUnicodeHandle(Self, NewParams, ''); Exclude(FFormState, fsCreatedMDIChild); end; if AlphaBlend then begin // toggle AlphaBlend to force update AlphaBlend := False; AlphaBlend := True; end else if TransparentColor then begin // toggle TransparentColor to force update TransparentColor := False; TransparentColor := True; end; end; procedure TTntForm.DestroyWindowHandle; begin if Win32PlatformIsUnicode then UninitializeFlatSB(Handle); { Bug in VCL: Without this there might be a resource leak. } inherited; end; procedure TTntForm.DefineProperties(Filer: TFiler); begin inherited; TntPersistent_AfterInherited_DefineProperties(Filer, Self); end; procedure TTntForm.DefaultHandler(var Message); begin if (ClientHandle <> 0) and (Win32PlatformIsUnicode) then begin with TMessage(Message) do begin if (Msg = WM_SIZE) then Result := DefWindowProcW(Handle, Msg, wParam, lParam) else Result := DefFrameProcW(Handle, ClientHandle, Msg, wParam, lParam); if (Msg = WM_DESTROY) then Perform(TNT_WM_DESTROY, 0, 0); { This ensures that the control is Unsubclassed. } end; end else inherited DefaultHandler(Message); end; function TTntForm.IsCaptionStored: Boolean; begin Result := TntControl_IsCaptionStored(Self); end; function TTntForm.GetCaption: TWideCaption; begin Result := TntControl_GetText(Self) end; procedure TTntForm.SetCaption(const Value: TWideCaption); begin TntControl_SetText(Self, Value) end; function TTntForm.IsHintStored: Boolean; begin Result := TntControl_IsHintStored(Self); end; function TTntForm.GetHint: WideString; begin Result := TntControl_GetHint(Self) end; procedure TTntForm.SetHint(const Value: WideString); begin TntControl_SetHint(Self, Value); end; procedure TTntForm.ActionChange(Sender: TObject; CheckDefaults: Boolean); begin TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); inherited; end; function TTntForm.GetActionLinkClass: TControlActionLinkClass; begin Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); end; procedure TTntForm.WMMenuSelect(var Message: TWMMenuSelect); var MenuItem: TMenuItem{TNT-ALLOW TMenuItem}; ID: Integer; FindKind: TFindItemKind; begin if Menu <> nil then with Message do begin MenuItem := nil; if (MenuFlag <> $FFFF) or (IDItem <> 0) then begin FindKind := fkCommand; ID := IDItem; if MenuFlag and MF_POPUP <> 0 then begin FindKind := fkHandle; ID := Integer(GetSubMenu(Menu, ID)); end; MenuItem := Self.Menu.FindItem(ID, FindKind); end; if MenuItem <> nil then TntApplication.Hint := WideGetLongHint(WideGetMenuItemHint(MenuItem)) else TntApplication.Hint := ''; end; end; procedure TTntForm.UpdateActions; begin inherited; TntApplication.DoIdle; end; procedure TTntForm.CMBiDiModeChanged(var Message: TMessage); var Loop: Integer; begin inherited; for Loop := 0 to ComponentCount - 1 do if Components[Loop] is TMenu then FixMenuBiDiProblem(TMenu(Components[Loop])); end; procedure TTntForm.WMWindowPosChanging(var Message: TMessage); begin inherited; // This message *sometimes* means that the Menu.BiDiMode changed. FixMenuBiDiProblem(Menu); end; function TTntForm.CreateDockManager: IDockManager; begin if (DockManager = nil) and DockSite and UseDockManager then HandleNeeded; // force TNT subclassing to occur first Result := inherited CreateDockManager; end; { TTntApplication } constructor TTntApplication.Create(AOwner: TComponent); begin inherited; Application.HookMainWindow(WndProc); FSettingChangeTime := GetTickCount; TntSysUtils._SettingChangeTime := GetTickCount; end; destructor TTntApplication.Destroy; begin FreeAndNil(FTntAppIdleEventControl); Application.UnhookMainWindow(WndProc); inherited; end; function TTntApplication.GetHint: WideString; begin // check to see if the hint has already been set on application.idle if Application.Hint = AnsiString(ApplicationMouseControlHint) then FHint := ApplicationMouseControlHint; // get the synced string Result := GetSyncedWideString(FHint, Application.Hint) end; procedure TTntApplication.SetAnsiAppHint(const Value: AnsiString); begin Application.Hint := Value; end; procedure TTntApplication.SetHint(const Value: WideString); begin SetSyncedWideString(Value, FHint, Application.Hint, SetAnsiAppHint); end; function TTntApplication.GetExeName: WideString; begin Result := WideParamStr(0); end; function TTntApplication.GetTitle: WideString; begin if (Application.Handle <> 0) and Win32PlatformIsUnicode then begin SetLength(Result, DefWindowProcW(Application.Handle, WM_GETTEXTLENGTH, 0, 0) + 1); DefWindowProcW(Application.Handle, WM_GETTEXT, Length(Result), Integer(PWideChar(Result))); SetLength(Result, Length(Result) - 1); end else Result := GetSyncedWideString(FTitle, Application.Title); end; procedure TTntApplication.SetAnsiApplicationTitle(const Value: AnsiString); begin Application.Title := Value; end; procedure TTntApplication.SetTitle(const Value: WideString); begin if (Application.Handle <> 0) and Win32PlatformIsUnicode then begin if (GetTitle <> Value) or (FTitle <> '') then begin DefWindowProcW(Application.Handle, WM_SETTEXT, 0, lParam(PWideChar(Value))); FTitle := ''; end end else SetSyncedWideString(Value, FTitle, Application.Title, SetAnsiApplicationTitle); end; {$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 type THackApplication = class(TComponent) protected FxxxxxxxxxHandle: HWnd; FxxxxxxxxxBiDiMode: TBiDiMode; FxxxxxxxxxBiDiKeyboard: AnsiString; FxxxxxxxxxNonBiDiKeyboard: AnsiString; FxxxxxxxxxObjectInstance: Pointer; FxxxxxxxxxMainForm: TForm{TNT-ALLOW TForm}; FMouseControl: TControl; end; {$ENDIF} {$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 type THackApplication = class(TComponent) protected FxxxxxxxxxHandle: HWnd; FxxxxxxxxxBiDiMode: TBiDiMode; FxxxxxxxxxBiDiKeyboard: AnsiString; FxxxxxxxxxNonBiDiKeyboard: AnsiString; FxxxxxxxxxObjectInstance: Pointer; FxxxxxxxxxMainForm: TForm{TNT-ALLOW TForm}; FMouseControl: TControl; end; {$ENDIF} {$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 type THackApplication = class(TComponent) protected FxxxxxxxxxHandle: HWnd; FxxxxxxxxxBiDiMode: TBiDiMode; FxxxxxxxxxBiDiKeyboard: AnsiString; FxxxxxxxxxNonBiDiKeyboard: AnsiString; FxxxxxxxxxObjectInstance: Pointer; FxxxxxxxxxMainForm: TForm{TNT-ALLOW TForm}; FMouseControl: TControl; end; {$ENDIF} {$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 type THackApplication = class(TComponent) protected FxxxxxxxxxHandle: HWnd; FxxxxxxxxxBiDiMode: TBiDiMode; FxxxxxxxxxBiDiKeyboard: AnsiString; FxxxxxxxxxNonBiDiKeyboard: AnsiString; FxxxxxxxxxObjectInstance: Pointer; FxxxxxxxxxMainForm: TForm{TNT-ALLOW TForm}; FMouseControl: TControl; end; {$ENDIF} function TTntApplication.ApplicationMouseControlHint: WideString; var MouseControl: TControl; begin MouseControl := THackApplication(Application).FMouseControl; Result := WideGetLongHint(WideGetHint(MouseControl)); end; procedure TTntApplication.DoIdle; begin // update TntApplication.Hint only when Ansi encodings are the same... (otherwise there are problems with action menus) if Application.Hint = AnsiString(ApplicationMouseControlHint) then Hint := ApplicationMouseControlHint; end; function TTntApplication.IsDlgMsg(var Msg: TMsg): Boolean; begin Result := False; if (Application.DialogHandle <> 0) then begin if IsWindowUnicode(Application.DialogHandle) then Result := IsDialogMessageW(Application.DialogHandle, Msg) else Result := IsDialogMessageA(Application.DialogHandle, Msg); end; end; type TTntAppIdleEventControl = class(TControl) protected procedure OnIdle(Sender: TObject); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; constructor TTntAppIdleEventControl.Create(AOwner: TComponent); begin inherited; ParentFont := False; { This allows Parent (Application) to be in another module. } Parent := Application.MainForm; Visible := True; Action := TTntAction.Create(Self); Action.OnExecute := OnIdle; Action.OnUpdate := OnIdle; TntApplication.FTntAppIdleEventControl := Self; end; destructor TTntAppIdleEventControl.Destroy; begin if TntApplication <> nil then TntApplication.FTntAppIdleEventControl := nil; inherited; end; procedure TTntAppIdleEventControl.OnIdle(Sender: TObject); begin TntApplication.DoIdle; end; function TTntApplication.ProcessMessage(var Msg: TMsg): Boolean; var Handled: Boolean; begin Result := False; // Check Main Form if (not FMainFormChecked) and (Application.MainForm <> nil) then begin if not (Application.MainForm is TTntForm) then begin // This control will help ensure that DoIdle is called TTntAppIdleEventControl.Create(Application.MainForm); end; FMainFormChecked := True; end; // Check for Unicode char messages if (Msg.message = WM_CHAR) and (Msg.wParam > Integer(High(AnsiChar))) and IsWindowUnicode(Msg.hwnd) and ((Application.DialogHandle = 0) or IsWindowUnicode(Application.DialogHandle)) then begin Result := True; // more than 8-bit WM_CHAR destined for Unicode window Handled := False; if Assigned(Application.OnMessage) then Application.OnMessage(Msg, Handled); Application.CancelHint; // dispatch msg if not a dialog message if (not Handled) and (not IsDlgMsg(Msg)) then DispatchMessageW(Msg); end; end; function TTntApplication.WndProc(var Message: TMessage): Boolean; var BasicAction: TBasicAction; begin Result := False; { not handled } if (Message.Msg = WM_SETTINGCHANGE) then begin FSettingChangeTime := GetTickCount; TntSysUtils._SettingChangeTime := FSettingChangeTime; end; if (Message.Msg = WM_CREATE) and (FTitle <> '') then begin SetTitle(FTitle); FTitle := ''; end; if (Message.Msg = CM_ACTIONEXECUTE) then begin BasicAction := TBasicAction(Message.LParam); if (BasicAction.ClassType = THintAction{TNT-ALLOW THintAction}) and (THintAction{TNT-ALLOW THintAction}(BasicAction).Hint = AnsiString(Hint)) then begin Result := True; Message.Result := 1; with TTntHintAction.Create(Self) do begin Hint := Self.Hint; try Execute; finally Free; end; end; end; end; end; //=========================================================================== // The NT GetMessage Hook is needed to support entering Unicode // characters directly from the keyboard (bypassing the IME). // Special thanks go to Francisco Leong for developing this solution. // // Example: // 1. Install "Turkic" language support. // 2. Add "Azeri (Latin)" as an input locale. // 3. In an EDIT, enter Shift+I. (You should see a capital "I" with dot.) // 4. In an EDIT, enter single quote (US Keyboard). (You should see an upturned "e".) // var ManualPeekMessageWithRemove: Integer = 0; procedure EnableManualPeekMessageWithRemove; begin Inc(ManualPeekMessageWithRemove); end; procedure DisableManualPeekMessageWithRemove; begin if (ManualPeekMessageWithRemove > 0) then Dec(ManualPeekMessageWithRemove); end; var NTGetMessageHook: HHOOK; function GetMessageForNT(Code: Integer; wParam: Integer; lParam: Integer): LRESULT; stdcall; var ThisMsg: PMSG; begin if (Code >= 0) and (wParam = PM_REMOVE) and (ManualPeekMessageWithRemove = 0) then begin ThisMsg := PMSG(lParam); if (TntApplication <> nil) and TntApplication.ProcessMessage(ThisMsg^) then ThisMsg.message := WM_NULL; { clear for further processing } end; Result := CallNextHookEx(NTGetMessageHook, Code, wParam, lParam); end; procedure CreateGetMessageHookForNT; begin Assert(Win32Platform = VER_PLATFORM_WIN32_NT); NTGetMessageHook := SetWindowsHookExW(WH_GETMESSAGE, GetMessageForNT, 0, GetCurrentThreadID); if NTGetMessageHook = 0 then RaiseLastOSError; end; //--------------------------------------------------------------------------------------------- // Tnt Environment Setup //--------------------------------------------------------------------------------------------- procedure InitTntEnvironment; function GetDefaultFont: WideString; function RunningUnderIDE: Boolean; begin Result := ModuleIsPackage and ( WideSameText(WideExtractFileName(WideGetModuleFileName(0)), 'bds.exe') or WideSameText(WideExtractFileName(WideGetModuleFileName(0)), 'delphi32.exe') or WideSameText(WideExtractFileName(WideGetModuleFileName(0)), 'bcb.exe')); end; function GetProfileStr(const Section, Key, Default: AnsiString; MaxLen: Integer): AnsiString; var Len: Integer; begin SetLength(Result, MaxLen + 1); Len := GetProfileString(PAnsiChar(Section), PAnsiChar(Key), PAnsiChar(Default), PAnsiChar(Result), Length(Result)); SetLength(Result, Len); end; procedure SetProfileStr(const Section, Key, Value: AnsiString); var DummyResult: Cardinal; begin try Win32Check(WriteProfileString(PAnsiChar(Section), PAnsiChar(Key), PAnsiChar(Value))); if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then WriteProfileString(nil, nil, nil); {this flushes the WIN.INI cache} SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PAnsiChar(Section)), SMTO_NORMAL, 250, DummyResult); except on E: Exception do begin E.Message := 'Couldn''t create font substitutes.' + CRLF + E.Message; Application.HandleException(nil); end; end; end; var ShellDlgFontName_1: WideString; ShellDlgFontName_2: WideString; begin ShellDlgFontName_1 := GetProfileStr('FontSubstitutes', 'MS Shell Dlg', '', LF_FACESIZE); if ShellDlgFontName_1 = '' then begin ShellDlgFontName_1 := 'MS Sans Serif'; SetProfileStr('FontSubstitutes', 'MS Shell Dlg', ShellDlgFontName_1); end; ShellDlgFontName_2 := GetProfileStr('FontSubstitutes', 'MS Shell Dlg 2', '', LF_FACESIZE); if ShellDlgFontName_2 = '' then begin if Screen.Fonts.IndexOf('Tahoma') <> -1 then ShellDlgFontName_2 := 'Tahoma' else ShellDlgFontName_2 := ShellDlgFontName_1; SetProfileStr('FontSubstitutes', 'MS Shell Dlg 2', ShellDlgFontName_2); end; if RunningUnderIDE then begin Result := 'MS Shell Dlg 2' {Delphi is running} end else Result := ShellDlgFontName_2; end; begin // Tnt Environment Setup InstallTntSystemUpdates; DefFontData.Name := GetDefaultFont; Forms.HintWindowClass := TntControls.TTntHintWindow; end; initialization TntApplication := TTntApplication.Create(nil); if Win32Platform = VER_PLATFORM_WIN32_NT then CreateGetMessageHookForNT; finalization if NTGetMessageHook <> 0 then begin UnhookWindowsHookEx(NTGetMessageHook) // no Win32Check, fails in too many cases, and doesn't matter end; FreeAndNil(TntApplication); end.