CoUninitialize;
end;
end;
Π Π°Π·Π½ΠΎΠ΅
`Π£ΡΡΠΎΠΉΡΠΈΠ²ΡΠ΅` Π²ΡΠΏΠ»ΡΠ²Π°ΡΡΠΈΠ΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ
ΠΠ° TabbedNotebook Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² TEdit. Π― ΠΈΠ·ΠΌΠ΅Π½ΡΡ ΡΠ²Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² TEdit Π½Π° ΠΆΠ΅Π»ΡΡΠΉ ΠΈ Π½Π°Π·Π½Π°ΡΠ°Ρ ΡΠ²ΠΎΠΉΡΡΠ²Ρ Hint ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΡΡΠΎΡΠΊΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»Π΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅Π²Π΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
ΠΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° ΡΠΎ Π²ΡΠΏΠ»ΡΠ²Π°ΡΡΠ΅ΠΉ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΎΠΉ (hintwindow) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄Π΅Π»Π°ΡΡ Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΈΠΌΡΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΊΡΡΡΠΎΡ ΠΌΡΡΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ. ΠΠΎ ΠΌΠΎΠΉ Π·Π°ΠΊΠ°Π·ΡΠΈΠΊ Ρ ΠΎΡΠ΅Ρ Π²ΠΈΠ΄Π΅ΡΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ Π²ΡΠ΅ Π²ΡΠ΅ΠΌΡ, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»Π΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠΊΡΡ.
Π― Π½Π΅ Π·Π½Π°Ρ ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΡΠΏΠ»ΡΠ²Π°ΡΡΠ΅ΠΉ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. Π― Π·Π½Π°Ρ ΡΡΠΎ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΠΊΡΠΎ ΠΌΠ½Π΅ ΠΏΠΎΠ΄ΡΠΊΠ°ΠΆΠ΅Ρ ΠΊΠ°ΠΊ?
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΌΠΎΠ΄ΡΠ»Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π½ΠΎΠ²ΡΠΉ ΡΠΈΠΏ hintwindow, TFocusHintWindow. ΠΠΎΠ³Π΄Π° Π²Ρ "ΠΏΡΠΎΡΠΈΡΠ΅" TFocusHintWindow ΠΏΠΎΡΠ²ΠΈΡΡΡΡ, ΠΎΠ½ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π½ΠΈΠΆΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΠΈΠΌΠ΅ΡΡΠ΅Π³ΠΎ ΡΠΎΠΊΡΡ. ΠΠ»Ρ ΠΏΠΎΠΊΠ°Π·Π° ΠΈ ΡΠΊΡΡΡΠΈΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄:
FocusHintWindow.Showing := True;
FocusHintWindow.Showing := False;
ΠΡΠΈΠΌΠ΅Ρ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ ΠΊ ΠΌΠΎΠ΄ΡΠ»Ρ. ΠΡΠΎ ΠΏΡΠΎΡΡΠΎ.
unit FHintWin;
{ -----------------------------------------------------------
TFocusHintWindow --
ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ TFocusHintWindow.
ΠΠ°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π²ΡΠΏΠ»ΡΠ²Π°ΡΡΡΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΡ Π½ΠΈΠΆΠ΅ Π»ΡΠ±ΠΎΠ³ΠΎ
TEdit, ΠΈΠΌΠ΅ΡΡΠ΅Π³ΠΎ ΡΠΎΠΊΡΡ. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ
ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° Windows.
unit Unit1;
interface
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, FHintWin;
type TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FocusHintWindow: TFocusHintWindow;
procedure AppIdle(Sender: TObject; var Done: Boolean);
procedure AppShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo);
end;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle := AppIdle;
Application.OnShowHint := AppShowHint;
FocusHintWindow := TFocusHintWindow.Create(Self);
end;
procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
FocusHintWindow.Showing := Screen.ActiveControl is TEdit;
end;
procedure TForm1.AppShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo);
begin
CanShow := not FocusHintWindow.Showing;
end;
end.
----------------------------------------------------------- }
interface
uses SysUtils, WinTypes, WinProcs, Classes, Controls, Forms;
type TFocusHintWindow = class(THintWindow)
private
FShowing: Boolean;
HintControl: TControl;
protected
procedure SetShowing(Value: Boolean);
function CalcHintRect(Hint: string): TRect;
procedure Appear;
procedure Disappear;
public
property Showing: Boolean read FShowing write SetShowing;
end;
implementation
function TFocusHintWindow.CalcHintRect(Hint: string): TRect;
var Buffer: array[Byte] of Char;
begin
Result := Bounds(0, 0, Screen.Width, 0);
DrawText(Canvas.Handle, StrPCopy(Buffer, Hint), -1, Result, DT_CALCRECT or DT_LEFT or DT_WORDBREAK or DT_NOPREFIX);
with HintControl, ClientOrigin do OffsetRect(Result, X, Y + Height + 6);
Inc(Result.Right, 6);
Inc(Result.Bottom, 2);
end;
procedure TFocusHintWindow.Appear;
var
Hint: string;
HintRect: TRect;
begin
if (Screen.ActiveControl = HintControl) then Exit;
HintControl := Screen.ActiveControl;
Hint := GetShortHint(HintControl.Hint);
HintRect := CalcHintRect(Hint);
ActivateHint(HintRect, Hint);
FShowing := True;
end;
procedure TFocusHintWindow.Disappear;
begin
HintControl := nil;
ShowWindow(Handle, SW_HIDE);
FShowing := False;
end;
procedure TFocusHintWindow.SetShowing(Value: Boolean);
begin
if Value then Appear else Disappear;
end;
end.
β Ed Jordan
ΠΡΠ·ΠΎΠ² 16-ΡΠ°Π·ΡΡΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈΠ· 32-ΡΠ°Π·ΡΡΠ΄Π½ΠΎΠ³ΠΎ
Andrew Pastushenko ΠΏΠΈΡΠ΅Ρ:
ΠΠΎΡΡΠ»Π°Ρ ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ² (ΠΊΠ°ΠΊ Π² "ΠΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ²"). ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π°ΡΡ ΡΡΠ°ΡΡΡ "Calling 16-bit code from 32-bit in Windows 95".
{ GetFeeSystemResources routine for 32-bit Delphi.
Works only under Windows 9x }
unit SysRes32;
interface
const
//Constants whitch specifies the type of resource to be checked
GFSR_SYSTEMRESOURCES = $0000;
GFSR_GDIRESOURCES = $0001;
GFSR_USERRESOURCES = $0002;
// 32-bit function exported from this unit
function GetFeeSystemResources(SysResource: Word): Word;
implementation
uses SysUtils, Windows;
type
//Procedural variable for testing for a nil
TGetFSR = function(ResType: Word): Word; stdcall;
//Declare our class exeptions
EThunkError = class(Exception);
EFOpenError = class(Exception);
var
User16Handle : THandle = 0;
GetFSR : TGetFSR = nil;
//Prototypes for some undocumented API
function LoadLibrary16(LibFileName: PAnsiChar): THandle; stdcall; external kernel32 index 35;
function FreeLibrary16(LibModule: THandle): THandle; stdcall; external kernel32 index 36;
function GetProcAddress16(Module: THandle; ProcName: LPCSTR): TFarProc;stdcall; external kernel32 index 37;
procedure QT_Thunk; cdecl; external 'kernel32.dll' name 'QT_Thunk';
{$StackFrames On}
function GetFeeSystemResources(SysResource: Word): Word;
var EatStackSpace: String[$3C];
begin
// Ensure buffer isn't optimised away
EatStackSpace := '';
@GetFSR:=GetProcAddress16(User16Handle, 'GETFREESYSTEMRESOURCES');
if Assigned(GetFSR) then //Test result for nil
asm
//Manually push onto the stack type of resource to be checked first
push SysResource
//Load routine address into EDX
mov edx, [GetFSR]
//Call routine
call QT_Thunk
//Assign result to the function
mov @Result, ax
end
else raise EFOpenError.Create('GetProcAddress16 failed!');
end;
initialization
//Check Platform for Windows 9x
if Win32Platform <> VER_PLATFORM_WIN32_WINDOWS then raise EThunkError.Create('Flat thunks only supported under Windows 9x');
//Load 16-bit DLL (USER.EXE)
User16Handle:= LoadLibrary16(PChar('User.exe'));
if User16Handle < 32 then raise EFOpenError.Create('LoadLibrary16 failed!');
finalization
//Release 16-bit DLL when done
if User16Handle <> 0 then FreeLibrary16(User16Handle);
end.
ΠΠ°ΠΊ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΈΠΌΠ΅Π΅ΠΌ Π»ΠΈ ΠΌΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΈΠ²Π½ΡΠ΅ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅?
Nomadic ΠΏΠΈΡΠ΅Ρ:
// Routine: check if the user has administrator provileges
// Was converted from C source by Akzhan Abdulin. Not properly tested.
type PTOKEN_GROUPS = TOKEN_GROUPS^;
function RunningAsAdministrator(): Boolean;
var
SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY;
psidAdmin: PSID;
ptg: PTOKEN_GROUPS = nil;
htkThread: Integer; { HANDLE }
cbTokenGroups: Longint; { DWORD }
iGroup: Longint; { DWORD }
bAdmin: Boolean;
begin
Result := false;
if not OpenThreadToken(GetCurrentThread(), // get security token
TOKEN_QUERY, FALSE, htkThread) then
if GetLastError() = ERROR_NO_TOKEN then begin
if not OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, htkThread) then Exit;
end else Exit;
if GetTokenInformation(htkThread, // get #of groups
TokenGroups, nil, 0, cbTokenGroups) then Exit;
if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then Exit;
ptg := PTOKEN_GROUPS(getmem(cbTokenGroups));
if not Assigned(ptg) then Exit;
if not GetTokenInformation(htkThread, // get groups
TokenGroups, ptg, cbTokenGroups, cbTokenGroups) then Exit;
if not AllocateAndInitializeSid(SystemSidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdmin) then Exit;
iGroup := 0;
while iGroup < ptg^.GroupCount do // check administrator group