Часто задаваемые вопросы по Delphi

Как узнать, находится ли дискета в дисководе?

type
TDriveState(DS_NO_DISK, DS_UNFORMATTED_DISK,
DS_EMPTY_DISK, DS_DISK_WITH_FILES);
function DriveState(DrvLetter: Char): TDriveState;
var
Mask: String[6];
SearchRec: TSearchRec;
oldMode: Cardinal;
ReturnCode: Integer;
begin
oldMode: = SetErrorMode(SEM_FAILCRITICALERRORS);
Mask:= '?:\*.*';
Mask[1] := DrvLetter;
{$I-} { отключить обработку исключительных ситуаций }
ReturnCode := FindFirst(Mask, faAnyfile, SearchRec);
FindClose(SearchRec);
{$I+}
case ReturnCode of
{ как минимум один файл был найден }
0: Result := DS_DISK_WITH_FILES;
{ файлов не найдено и дискета в порядке }
-18: Result := DS_EMPTY_DISK;
{ DS_NO_DISK для DOS, ERROR_NOT_READY для WinNT, ERROR_PATH_NOT_FOUND для Win 3.1 }
-21, -3: Result := DS_NO_DISK;
else
{ дискета лежит в дисководе но она не форматировнная }
Result := DS_UNFORMATTED_DISK;
end;
SetErrorMode(oldMode);
end; { DriveState }



Как выводить формуляр в центр экрана?

   Часто встречающийся вопрос начинающего программиста. Чтобы вывести формуляр в центре экрана необходимо (в самом простом случае) изменить свойство формы Position. Значение должно быть установленно в poScreenCenter. Причем это можно делать как в Object Inspector, так и во время работы программы.



Порядок, в котором обрабатываются события при загрузке формы

    OnCreate
    OnShow
    OnPaint
    OnActivate
    OnResize
    OnPaint

Ето может быть важно например для того чтобы координировать некоторые акции по управлению положением формы и т.п.



Как сделать возможным передвижение формы если пользователь щелкнул в форму вне пространства заголовка?

  В следующем примере показано как можно передвигать форму если пользователь "захватил" Client-пространство. Наиболее простое решение - "обмануть" Windows и Client-пространство выдать за заголовок окна.

unit DragMain;
interface
uses
SysUtils, WinTypes, WinProcs, Messages,
Classes, Graphics, Controls, Forms, Dialogs, StdCrtls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure ButtonClick(Sender: TObject);
private
procedure WMNCHitTest(var M: TWMNCHitTest);
message wm_NCCHitTest;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1. WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
if M.Result = htClient then
M.Result := htCaption;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
end.



Как эффективно организовать объявление глобальных переменных?

  Один из эффективных способов организации глобальных переменных - создать отдельный Unit и в Interface-части объявить все необходимые переменные (и, естесственно, константы ежели таковые имеются). Если теперь в других модулях записать этот Unit в uses раздел, то все глобальные переменные можно использовать в рамках целого проекта (или проектов).



Как установить минимальные размеры формуляра?

  Если свойство BorderStyle установленно в значение bsSizeable, то размер формуляра можно уменьшать или увеличивать. Иногда, чтобы показывать все необходимые элементы на форме, необходимо установить минимальные размеры формуляра? Следующая процедура позволяет ограничить размеры формуляра.

type
TForm1 = class(TForm)
procedure wmGetMinMaxInfo(var Msg : TMessage); message wm_GetMinMaxInfo;
procedure TForm1.wmGetMinMaxInfo(var Msg : TMessage);
begin
PMinMaxInfo(Msg.lParam)^.ptMinTrackSize.X := 600;
PMinMaxInfo(Msg.lParam)^.ptMinTrackSize.Y := 350;
end;



Как перейти к указанной записи в БД?

Демонстрация перехода к указанной записи через задание номера записи.

function TBDEDirect.GoToRecord(RecNo: LongInt): Boolean;
var
RecCount: LongInt;
Bookmark: TBookmark;
Res: DBIResult;
begin
Result := False;
if CheckDatabase then
begin
if
RecNo < 1 then
RecNo := 1;
RecCount := GetRecordCount;
if RecNo > RecCount then
RecNo := RecCount;
Res := DbiSetToRecordNo(FDataLink.DataSource.DataSet.Handle,
RecNo);
if Res = 0 then
begin
Bookmark := StrAlloc(GetBookmarkSize);
DbiGetBookmark(FDataLink.DataSource.DataSet.Handle,
Bookmark);
FDataLink.DataSource.DataSet.GoToBookmark(Bookmark);
FDataLink.DataSource.DataSet.FreeBookmark(Bookmark);
Result := True;
end
else
Check(Res);
end;
end;



Как вызвать подсказку к подсказке?

В Delphi-приложении можно вызвать помощь в пользовании системой помощи следующим образом:

Application.HelpCommand(Help_HelpOnHelp, 0);



Как вывести главное окно справочной системы?

  В 16-битных версиях справочной системы необходимо было вызывать начальное (главное) окно помощи с параметром HELP_CONTENTS в комманде HelpCommand. В 32-битном варианте это осуществляется следующим образом:

Application.HelpCommand(HELP_FINDER, 0);

Примечание: Для того, чтобы показывались "книжки" (или главные темы) - необходимо создать .CNT-файл.



Как скрыть свойства объекта?

   В иерархии VCL в большинстве случаев существует уровень объектов-"предшественников" (TCustomXXXX), в которых многие свойства скрыты. Для унаследованных от таких "предшественников" объектов можно "открывать" на выбор те или иные свойства. А как можно сокрыть свойства, которые объявлены в published-области от Object Inspector'а, но при этом оставить возможность доступа во время работы программы? Решение состоит в объявлении свойства "по новой" в public-области. В примере скрытым будет у объекта TMyControl свойство Height.

TMyControl = class(TWinControl)
protected
procedure
SetHeight(Value: Integer);
function GetHeight: Integer;
public
property
Height: Integer read GetHeight write SetHeight;
end;
procedure TMyControl.SetHeight(Value: Integer);
begin
inherited
Height := Value;
end;
function TMyControl.GetHeight;
begin
Result := inherited Height;
end;




 

Рейтинг@Mail.ru          Rambler's Top100

X-ZiBiT