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