На TabbedNotebook у меня есть множество компонентов TEdit. Я изменяю цвет компонентов TEdit на желтый и назначаю свойству Hint компонента строчку предупреждения, если поле редактирования содержит неверные данные.
Поведение окна со всплывающей подсказкой (hintwindow) позволяет делать его видимым только тогда, когда курсор мыши находится в области элемента управления. Но мой заказчик хочет видеть подсказки все время, пока поле редактирования имеет фокус.
Я не знаю как изменить поведение всплывающей подсказки, заданное по умолчанию. Я знаю что это возможно, но кто мне подскажет как?
Ниже приведен модуль, содержащий новый тип hintwindow, TFocusHintWindow. Когда вы "просите" TFocusHintWindow появиться, он появляется ниже элемента управления, имеющего фокус. Для показа и скрытия достаточно следующих команд:
FocusHintWindow.Showing := True;
FocusHintWindow.Showing := False;
Пример того, как это можно использовать, содержится в комментариях к модулю. Это просто.
unitFHintWin;
{ -----------------------------------------------------------
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
usesSysUtils, WinTypes, WinProcs, Classes, Controls, Forms;
typeTFocusHintWindow = class(THintWindow)
private
FShowing: Boolean;
HintControl: TControl;
protected
procedureSetShowing(Value: Boolean);
functionCalcHintRect(Hint: string): TRect;
procedureAppear;
procedureDisappear;
public
propertyShowing: Boolean readFShowing writeSetShowing;
end;
implementation
functionTFocusHintWindow.CalcHintRect(Hint: string): TRect;
varBuffer: array[Byte] ofChar;
begin
Result := Bounds(0, 0, Screen.Width, 0);
DrawText(Canvas.Handle, StrPCopy(Buffer, Hint), -1, Result, DT_CALCRECT orDT_LEFT orDT_WORDBREAK orDT_NOPREFIX);
withHintControl, ClientOrigin doOffsetRect(Result, X, Y + Height + 6);
Inc(Result.Right, 6);
Inc(Result.Bottom, 2);
end;
procedureTFocusHintWindow.Appear;
var
Hint: string;
HintRect: TRect;
begin
if(Screen.ActiveControl = HintControl) thenExit;
HintControl := Screen.ActiveControl;
Hint := GetShortHint(HintControl.Hint);
HintRect := CalcHintRect(Hint);
ActivateHint(HintRect, Hint);
FShowing := True;
end;
procedureTFocusHintWindow.Disappear;
begin
HintControl := nil;
ShowWindow(Handle, SW_HIDE);
FShowing := False;
end;
procedureTFocusHintWindow.SetShowing(Value: Boolean);
begin
ifValue thenAppear elseDisappear;
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 }
unitSysRes32;
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
functionGetFeeSystemResources(SysResource: Word): Word;
implementation
usesSysUtils, Windows;
type
//Procedural variable for testing for a nil
TGetFSR = function(ResType: Word): Word; stdcall;
Читать дальше