Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ Delphi. ВСрсия 1.4.3 ΠΎΡ‚ 1.1.2001Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 62

Автор Π’Π°Π»Π΅Π½Ρ‚ΠΈΠ½ ΠžΠ·Π΅Ρ€ΠΎΠ²

  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