Выбрать главу

 procedure FormCreate(Sender: TObject);

 procedure FormDestroy(Sender: TObject);

private

 {Private declarations}

public

 {Public declarations}

 CaretBm : TBitmap;

 CaretBmBk : TBitmap;

 OldEditsWindowProc : Pointer;

end;

var Form1: TForm1;

implementation

{$R *.DFM}

type

{$IFDEF WIN32}

 WParameter = LongInt;

{$ELSE}

 WParameter = Word;

{$ENDIF}

LParameter = LongInt;

{New windows procedure for the edit control}

function NewWindowProc(WindowHandle : hWnd; TheMessage : WParameter; ParamW : WParameter; ParamL : LParameter) : LongInt

{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}

begin

 {Call the old edit controls windows procedure}

 NewWindowProc := CallWindowProc(Form1.OldEditsWindowProc, WindowHandle, TheMessage, ParamW, ParamL);

 if TheMessage = WM_SETFOCUS then begin

  CreateCaret(WindowHandle, Form1.CaretBm.Handle, 0, 0);

  ShowCaret(WindowHandle);

 end;

 if TheMessage = WM_KILLFOCUS then begin

  HideCaret(WindowHandle);

  DestroyCaret;

 end;

 if TheMessage = WM_KEYDOWN then begin

  if ParamW = VK_BACK then CreateCaret(WindowHandle, Form1.CaretBmBk.Handle, 0, 0)

  else CreateCaret(WindowHandle, Form1.CaretBm.Handle, 0, 0);

  ShowCaret(WindowHandle);

 end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

 {Create a smiling bitmap using the wingdings font}

 CaretBm := TBitmap.Create;

 CaretBm.Canvas.Font.Name := 'WingDings';

 CaretBm.Canvas.Font.Height := Edit1.Font.Height;

 CaretBm.Canvas.Font.Color := clWhite;

 CaretBm.Width := CaretBm.Canvas.TextWidth('J') + 2;

 CaretBm.Height := CaretBm.Canvas.TextHeight('J') + 2;

 CaretBm.Canvas.Brush.Color := clBlue;

 CaretBm.Canvas.FillRect(Rect(0, 0, CaretBm.Width, CaretBm.Height));

 CaretBm.Canvas.TextOut(1, 1, 'J');

 {Create a frowming bitmap using the wingdings font}

 CaretBmBk := TBitmap.Create;

 CaretBmBk.Canvas.Font.Name := 'WingDings';

 CaretBmBk.Canvas.Font.Height := Edit1.Font.Height;

 CaretBmBk.Canvas.Font.Color := clWhite;

 CaretBmBk.Width := CaretBmBk.Canvas.TextWidth('L') + 2;

 CaretBmBk.Height := CaretBmBk.Canvas.TextHeight('L') + 2;

 CaretBmBk.Canvas.Brush.Color := clBlue;

 CaretBmBk.Canvas.FillRect(Rect(0,0, CaretBmBk.Width, CaretBmBk.Height));

 CaretBmBk.Canvas.TextOut(1, 1, 'L');

 {Hook the edit controls window procedure}

 OldEditsWindowProc := Pointer(SetWindowLong(Edit1.Handle,GWL_WNDPROC, LongInt(@NewWindowProc)));

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

 {Unhook the edit controls window procedure and clean up}

 SetWindowLong(Edit1.Handle,GWL_WNDPROC, LongInt(OldEditsWindowProc));

 CaretBm.Free;

 CaretBmBk.Free;

end;

Вопрос:

При использовании модулей доступа к BDE (DbiTypes, DbiProcs, DbiErrs), любая попытка вызвать процедуру abort выдает ошибку при компиляции при вызове метода abort "Statement expected, but expression of type 'Integer' found". Я пытался найти DbiTypes.pas, DbiProcs.pas и DbiErrs.pas чтобы разобраться но не нашел этих файлов. Где расположены эти файлы и как обойти ошибку?

Ответ:

Модули DbiTypes, DbiProcs, DbiErrs это псевдонимы модуля "BDE", обьявлены в Projects→Options→Directories/Conditionals→Unit Aliases. Исходник модуля DBE находится в каталоге "doc" и называется "BDE.INT". В этом файле обьявленна константа ABORT со значением -2. Так как Вы хотите использовать процедуру Abort(), которая обьявлена в модуле SysUtils, Вам нужно добавить префикс SysUtils перед вызовом процедуры Abort.

Пример:

SysUtils.Abort;

Вопрос:

Почему при изменении цвета букв StatusBar'а ничего не происходит?

Ответ:

Status bar — стандартный элемент управления Windows, и соответственно цвет его букв — значение clBtnText которое изменяется с помощью настроек в Control Panel. Этот цвет черный по умолчанию и может изменяться в зависимости от выбранной цветовой схемы. Другие стандартные элемент управления Windows, например кнопки, также имеют цвет букв, настраиваемый из ControlPanel. StatusBar и его панели имеют свойство "owner-draw", позволяющее Вам использовать любой цвет букв.

Пример:

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Paneclass="underline" TStatusPanel; const Rect: TRect);

begin

 if Panel = StatusBar.Panels[0] then begin

  StatusBar.Canvas.Font.Color := clRed;

  StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, 'Panel - 0')

 end else begin

  StatusBar.Canvas.Font.Color := clGreen;

  StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, 'Panel - 1');

 end;

end;

Вопрос:

Как сделать многострочную надпись на TBitBtn?

Ответ:

Выводите текст надписи непосредственно на "glyph" TBitBtn'а. См. пример.

Пример:

procedure TForm1.FormCreate(Sender: TObject);

var

 R : TRect;

 N : Integer;

 Buff : array[0..255] of Char;

begin

 with BitBtn1 do begin

  Caption := 'A really really long caption';

  Glyph.Canvas.Font := Self.Font;

  Glyph.Width := Width - 6;

  Glyph.Height := Height - 6;

  R := Bounds(0, 0, Glyph.Width, 0);

  StrPCopy(Buff, Caption);

  Caption := '';

  DrawText(Glyph.Canvas.Handle,Buff,StrLen(Buff),R, DT_CENTER or DT_WORDBREAK or DT_CALCRECT);

  OffsetRect(R,(Glyph.Width - R.Right) div 2, (Glyph.Height - R.Bottom) div 2);

  DrawText(Glyph.Canvas.Handle,Buff,StrLen(Buff),R, DT_CENTER or DT_WORDBREAK);

 end;

end;

Вопрос:

Как изменить стиль шрифта RichEdit нажатиями соответствующих комбинаций клавиш? (например включить курсив по нажатию Ctrl + I)

Ответ:

В примере стили шрифта меняются по нажатию след. комбинаций клавиш

• Ctrl + B — вкл/выкл жирного шрифта

• Ctrl + I — вкл/выкл наклонного шрифта