Часто задаваемые вопросы по 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;
|