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

Как различаются между собой Paint-события: Invalidate, Update и Refresh?

Invalidate      весь объект перерисовывается заново; обычно перерисовывается только часть бывшая перед этим закрытой
Update незамедлительная перерисовка
Refresh Invalidate + Update


Как сделать отступ в 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;



Системные сообщения (сокращения)

BM - ButtonMode
BN - Button
BS - ButtonStyle
CB - ComboBox
CBN - Combo Box Notifications
CBS - ComboBoxStyle
EM - EditMessage
ES - EditStyle
FM - FileManager
LB - ListBox
LBN - ListBox Notifications
LBS - ListBoxStyle
MB - MessageButton (Typen)
PS - PenStyle
SB - ScrollBar
SBS - ScrollBarStyle
SM - SystemMetrics
SPI - SystemParametersInfo
WM - WindowMessage
WS - WindowStyle



Как можно опросить различные параметры системы, например количество свободных ресурсов?

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

Variable := GetFreeSystemResources(GFSR_SYSTEMRESOURCES);

Другие функции опроса параметров системы (описаны в системе помощи): GetWinFlags, SystemParametersInfo, GetDeviceCaps и GetFreeSpace.

Для 32-bit систем необходимо вызывать GetSystemMetrics, GetSystemInfo и SystemParametersInfo.



Как управлять табуляцией в Memo-компоненте?

   Для этого необходимо поставить свойство "WantTabs" в "True". Теперь для управления штртной табуляции необходимо вызвать API-функцию SendMessage. В последнем параметре функция ожидает указатель на массив с элементами типа Word, в котором указаны позиции в единицах экрана. Для примера вызов функции с указанием двух позиций табуляции:

procedure TForm1.FormCreate(Sender:TObject);
const
Tabs: array[0..1] of Word = (4, 8);
begin
SendMessage(Memo1.Handle, EM_SetTabStops, 2, LongInt(@Tabs));
end;



Как вывести окно перед другими окнами не выводя наверх родительское окно?

   Если это не мешает общему ходу программы, то одно из самых простых решений - использование рабочего стола (Desktop) как родительское окно. Для этого необходимо перекрыть CreateParams подчиненного окна следующим образом:

...
private
procedure CreateParams(var Params: TCreateParams); override;
...
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent := GetDesktopWindow;
end;




 

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

X-ZiBiT