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

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

   К сожалению при создании окна приложения ни в одном из первых событий (OnCreate, OnShow, OnActivate) нет доступа к свойству Visible. Использование функции ShowWindow с параметром SW_HIDE в OnActivate-событии решает проблему (но при этом не избежать кратковременного мерцания окна перед "исчезновением"):

procedure TForm1.OnActivate(Sender: TObject);
begin
ShowWindow(Handle, SW_HIDE);
end;

чтобы сделать окно опять видимым необходимо вызвать ту же функцию, но уже с другим параметром:

ShowWindow(Handle, SW_SHOW);

Если Вам лень пользовать API-функции или неприятно видеть мерцание, то есть другой, весьма интересный способ сокрыть окно приложения от любопытствующих глаз:

procedure TForm1.OnCreate(Sender: TObject);
begin
Left := Screen.Width;
end;



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

   Для этого необходимо перехватить сообщение "WM_QUERYOPEN". Для этого необходимо объявить соответствующую процедуру в private-области.

{ объявление процедуры в классе TMainForm }
procedure WMQueryOpen(var Msg: TWMQueryOpen); message WM_QUERYOPEN;
{ ... и ее реализация }
procedure TMainForm.WMQueryOpen(var Msg: TWMQueryOpen);
begin
Msg.Result := 0;
end;



Как ускорить навигацию по исходному тексту?

Весьма удобно при работе с текстами больше двух-трех страниц использовать метки (bookmarks).

   Чтобы установить подобную метку - необходимо нажать компбинацию клавиш: CTRL+SHIFT+Число, где "Число" находится в пределах от 0 до 9. После этого можно с любого места "прыгнуть" на эту метку. Для этого необходимо нажать комбинацию CTRL+Число.

Примечание: Чтобы убрать метку - необходимо второй раз нажать CTRL+SHIFT+Число, а чтобы передвинуть метку на другое место - необходимо нажать ту же комбинацию в необходимом месте.



INI-файлы (чтение/запись)

function ReadIni(ASection, AString : String) : String;
var
sIniFile: TIniFile;
sPath : String[60];
const
S = 'xyz'; { стандартная строка для выдачи ошибок чтения }
begin
GetDir(0,sPath);
sIniFile := TIniFile.Create(sPath + '\Name.INI');
Result := sIniFile.ReadString(ASection, AString, S); { [Section] String=Value }
sIniFile.Free;
end;
procedure WriteIni(ASection, AString, AValue : String);
var
sIniFile: TIniFile;
sPath : String[60];
begin
GetDir(0,sPath);
sIniFile := TIniFile.Create(sPath + '\Name.INI');
sIniFile.WriteString(ASection, AString, AValue);; { [Section] String=Value }
sIniFile.Free;
end;
{ReadSection считывает все пункты указанной секции - т.е. ключи перед знаком "=" ReadSectionValues полностью считывает все строки указанной секции, т.е. Punkt=xyz }



Как создать Ini-файл в директории программы?

   По умолчанию ini-файл создается в Windows-директории (например: TIniFile.Create('FOO.INI' )), что приводит к "захламлению" оной. Более (эко-)логично (за исключением случаев, когда программа делается для CD-ROM) если ini-файл создается в той же директории что и главная программа. Это достигается с помощью одной строки:

IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0),'.INI'));



Поля в Memo-компоненте

   С помощью API-функции SendMessage можно задать поля в Memo-компоненте. Если необходимо, например, сделать отступ в 20 пикселей слева то можно это сделать следующим образом:

var Rect: TRect;
begin
SendMessage( Memo1.Handle, EM_GETRECT, 0, LongInt(@Rect));
Rect.Left:= 20;
SendMessage(Memo1.Handle, EM_SETRECT, 0, LongInt(@Rect));
Memo1.Refresh;
end;



Как "быструю подсказку" (Hints) сделать многострочной?

   Необходимо создать соответствующую компоненту которая показывает "быструю подсказку" (Hints) с более чем одной строкой.
   Компонента наследуется от TComponent и называется TMHint. Hint-текст можно задавать следующим образом:
   "Строка 1@Строка 2@Строка 3". Символ '@' используется как разделитель строк. Если Вам нравится другой символ - измените свойство Separator. Свойство Active указывает на активность (TRUE) или неактивность (FALSE) "многострочности".

unit MHint;
interface
uses
SysUtils, WinTypes, WinProcs, Messages,
Classes, Graphics, Controls, Forms, Dialogs;
type
TMHint = class(TComponent)
private
ScreenSize: Integer;
FActive: Boolean;
FSeparator: Char;
FOnShowHint: TShowHintEvent;
protected
procedure SetActive(Value: Boolean);
procedure SetSeparator(Value: char);
procedure NewHintInfo(var HintStr: string;
var CanShow: Boolean;
var HintInfo: THintInfo);
public
constructor Create(AOwner: TComponent); override;
published
property Active: Boolean
read FActive write SetActive;
property Separator: Char
read FSeparator write SetSeparator;
end;
procedure Register;
implementation
constructor TMHint.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FActive := True;
FSeparator := '@';
Application.OnShowHint := NewHintInfo;
ScreenSize := GetSystemMetrics(SM_CYSCREEN);
end;
procedure TMHint.SetActive(Value: Boolean);
begin
FActive := Value;
end;
procedure TMHint.SetSeparator(Value: Char);
begin
FSeparator := Value;
end;
procedure TMHint.NewHintInfo(var HintStr: string;
var CanShow: Boolean;
var HintInfo: THintInfo);
var
I: Byte;
begin
if FActive then
begin
I := Pos(FSeparator, HintStr);
while I > 0 do
begin
HintStr[I] := #13;
I := Pos(FSeparator, HintStr);
end;
if HintInfo.HintPos.Y+10 > ScreenSize then
HintInfo.HintPos.Y := ScreenSize-11;
end;
end;
procedure Register;
begin
RegisterComponents('MyComponents', [TMHint]);
end;
end.



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

   Модальные формуляры довольно часто выгоднее (с точки зрения использования памяти) временно создавать, и после того, как формуляр был вызван, отработан и закрыт, - освободить его из памяти. В противном случае Delphi-приложение может быть настоящим "пожирателем памяти". Примерно так может выглядеть вызов такого формуляра:

ModalForm := TModalForm.Create(Self);
try
ModalForm.ShowModal;
finally
ModalForm.Free;
end;




 

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

X-ZiBiT