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

 HTERROR: s:= 'HTERROR';

 HTTRANSPARENT: s:= 'HTTRANSPARENT';

 HTNOWHERE: s:= 'HTNOWHERE';

 HTCLIENT: s:= 'HTCLIENT';

 HTCAPTION: s:= 'HTCAPTION';

 HTSYSMENU: s:= 'HTSYSMENU';

 HTSIZE: s:= 'HTSIZE';

 HTMENU: s:= 'HTMENU';

 HTHSCROLL: s:= 'HTHSCROLL';

 HTVSCROLL: s:= 'HTVSCROLL';

 HTMINBUTTON: s:= 'HTMINBUTTON';

 HTMAXBUTTON: s:= 'HTMAXBUTTON';

 HTLEFT: s:= 'HTLEFT';

 HTRIGHT: s:= 'HTRIGHT';

 HTTOP: s := 'HTTOP';

 HTTOPLEFT: s:= 'HTTOPLEFT';

 HTTOPRIGHT: s:= 'HTTOPRIGHT';

 HTBOTTOM: s:= 'HTBOTTOM';

 HTBOTTOMLEFT: s:= 'HTBOTTOMLEFT';

 HTBOTTOMRIGHT: s:= 'HTBOTTOMRIGHT';

 HTBORDER: s:= 'HTBORDER';

 HTOBJECT: s:= 'HTOBJECT';

 HTCLOSE: s:= 'HTCLOSE';

 HTHELP: s:= 'HTHELP';

 else s:= '';

 end;

 Form1.Caption := s;

 Message.Result := 0;

end;

end.

Вопрос:

При попытке использовать метод TCanvas.StretchDraw чтобы нарисовать иконку увеличенной ее размер не изменяется. Что делать?

Ответ:

Иконки всегда рисуются размером принятым в системе по умолчанию. Чтобы показать увеличенный вид иконки скопируйте ее на bitmap, а зате используйте метод TCanvas.StretchDraw.

Пример:

procedure TForm1.Button1Click(Sender: TObject);

var TheBitmap : TBitmap;

begin

 TheBitmap := TBitmap.Create;

 TheBitmap.Width := Application.Icon.Width;

 TheBitmap.Height := Application.Icon.Height;

 TheBitmap.Canvas.Draw(0, 0, Application.Icon);

 Form1.Canvas.StretchDraw(Rect(0,0,TheBitmap.Width * 3,TheBitmap.Height * 3), TheBitmap);

 TheBitmap.Free;

end;

Вопрос:

Можно ли сделать так чтобы TStringGrid автоматически изменял ширину колонок, чтобы вместить самую длинную строчку в колонке?

Ответ: См. пример.

Пример:

procedure AutoSizeGridColumn(Grid : TStringGrid; column : integer);

var

 i : integer;

 temp : integer;

 max : integer;

begin

 max := 0;

 for i := 0 to (Grid.RowCount - 1) do begin

  temp := Grid.Canvas.TextWidth(grid.cells[column, i]);

  if temp > max then max := temp;

 end;

 Grid.ColWidths[column] := Max + Grid.GridLineWidth + 3;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

 AutoSizeGridColumn(StringGrid1, 1);

end;

Вопрос:

TTimer работает не достаточно точно. Как получить более высокую точность?

Ответ:

Таймер Windows не был создан с целью получения сверхточного хронометра. :-( Другими словами, когда Вы устанавливаете таймер на срабатывания каждые 1000 миллисекунд, он может срабатывать через интервал несколько больший чем 1000 миллисекунд. Значения меньше 55 миллисекунд никогда не будут срабатывать вовремя в Windows, поскольку это минимальная точность таймера. Можно проверять системное время и сравнивать его со временем предыдущего события таймера чтобы повысить точность.

Вопрос:

Как поместить JPEG-картинку в exe-файл и потом загрузить ее?

Ответ:

1) Создайте текстовый файл с расширением ".rc". Имя этого файла должно отличаться от имени файла-проекта или любого модуля проекта.

Файл должен содержать строку вроде: MYJPEG JPEG C:\DownLoad\MY.JPG

где:

• "MYJPEG" — имя ресурса

• "JPEG" — пользовательский тип ресурса

• "C:\DownLoad\MY.JPG" — путь к JPEG файлу.

Пусть например rc-файл называется "foo.rc"

Запустите BRCC32.exe (Borland Resource CommandLine Compiler) — программа находится в каталоге Bin Delphi/C++ Builder'а — передав ей в качестве параметра полный путь к rc-файлу. В нашем примере:

C:\DelphiPath\BIN\BRCC32.EXE C:\ProjectPath\FOO.RC

Вы получите откомпилированный ресурс — файл с расширением ".res". (в нашем случае — foo.res). Далее добавьте ресурс к своему приложению.

{Грузим ресурс}

{$R FOO.RES}

uses Jpeg;

procedure LoadJPEGFromRes(TheJPEG : string; ThePicture : TPicture);

var

 ResHandle : THandle;

 MemHandle : THandle;

 MemStream : TMemoryStream;

 ResPtr : PByte;

 ResSize : Longint;

 JPEGImage : TJPEGImage;

 begin ResHandle := FindResource(hInstance, PChar(TheJPEG), 'JPEG');

 MemHandle := LoadResource(hInstance, ResHandle);

 ResPtr := LockResource(MemHandle);

 MemStream := TMemoryStream.Create;

 JPEGImage := TJPEGImage.Create;

 ResSize := SizeOfResource(hInstance, ResHandle);

 MemStream.SetSize(ResSize);

 MemStream.Write(ResPtr^, ResSize);

 FreeResource(MemHandle);

 MemStream.Seek(0, 0);

 JPEGImage.LoadFromStream(MemStream);

 ThePicture.Assign(JPEGImage);

 JPEGImage.Free;

 MemStream.Free;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

 LoadJPEGFromRes('MYJPEG', Image1.Picture);

end;

Вопрос:

Как перехватить сообщения прокрутки в TScrollBox?

Ответ:

Следующий пример перехватывает сообщения о прокрутке компонента TScrollBox и синхронизирует обе линейки прокрутки. Сообщения прокрутки перехватываются с помощью переопределения оконной процедуры (WinProc) ScrollBox'а.

Пример:

type

{$IFDEF WIN32}

WParameter = LongInt;

{$ELSE}

WParameter = Word;

{$ENDIF}

LParameter = LongInt;

{Declare a variable to hold the window procedure we are replacing}

var OldWindowProc : Pointer;

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

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

var

 TheRangeMin : integer;

 TheRangeMax : integer;

 TheRange : integer;

begin

 if TheMessage = WM_VSCROLL then begin

  {Get the min and max range of the horizontal scroll box}

  GetScrollRange(WindowHandle, SB_HORZ, TheRangeMin, TheRangeMax);