То же самое справедливо и для компонента TNotebook
.
6. Как включить символ & в надпись (Caption)?
Попробуйте: &&
7. Как сделать окно (TForm) без заголовка (Caption)?
Попробуйте использовать следующий код:
constructor
TPanelForm.Create(AOwner: TComponent); { Вызов SetWindowLong API для изменения стиля окна главной формы. }
{ Берется существующий стиль и убирается флаг WS_CAPTION }
var
LStyle: Longint;
begin
inherited
Create(AOwner); BorderIcons := [];
LStyle := GetWindowLong(Handle, GWL_STYLE);
LStyle := LStyle and not
WS_CAPTION; SetWindowLong(Handle, GWL_STYLE, LStyle);
{ Перерисуем окно }
ForceRepaint;
end
; procedure
TPanelForm.ForceRepaint; var
RectWnd: TRect;
WWidth, WHeight: Integer;
begin
{ получаем размер окна }
GetWindowRect(Handle, RectWnd);
WWidth := RectWnd.Right-RectWnd.Left;
WHeight := RectWnd.Bottom-RectWnd.Top;
{ Форсируем полную перерисовку. Это должен делать InvalidateRect() }
{ но почему-то не делает : ( }
{ "сожмем" окно }
SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE);
{ восстановим окно }
SetWindowPos(Handle, HWND_TOP, 0, 0, WWidth, WHeight, SWP_NOMOVE);
end
; Можно поступить другим способом — выставить у формы свойство BorderStyle = bsNone
, и написать следующий обработчик OnPaint: procedure
TForm1.FormPaint(Sender: TObject); begin
Canvas.Brush.Style := bsClear;
Canvas.Rectangle(0, 0, Width, Height);
end
;
8. Почему некоторые компоненты типа TPanel и TEdit не имеют свойства Canvas?
Все наследники TCustomControl
имеют Canvas, однако, в большинстве случаев это свойство объявлено protected для предотвращения рисования 'чужаками' на компоненте. Наследники компонента всегда могут получить доступ к унаследованным protected свойствам (типа Canvas), но пользователь компонента — никогда. type
TCanvasPanel = class
(TPanel) public
property
Canvas; end
; Если вы хотите рисовать на компоненте, у которого нет public
свойства Canvas, то используйте, например, компонент TPaintBox: положите его на панель TPanel, сделайте Align = Client и рисуйте на TPaintBox.Canvas.
9. Почему при уничтожении компонента в методе OnClick происходит ошибка?
Допустим, вы поместили на форму кнопку, и создали метод OnClick
в котором вызываете Button1.Free. Вы видите, что это метод формы — казалось бы, какие препятствия для правильного уничтожения кнопки? На самом деле Button1.OnClick
является свойством и после запуска вашего приложения содержит адрес метода Form1.Button1Click. Именно кнопка вызывает этот метод как свой собственный. А это означает, что кнопка не может удалить себя в своем-же методе. Даже если вы попытаетесь удалить ссылку в OnClick: Button1.OnClick := nil
; Button1.Free;
то это не поможет — стек настроен на возврат в обработчик TButton
, который и вызвал OnClick. Поскольку к моменту возврата объект разрушен — возникает GPF или Access Violation.
10. Есть ли у TDBGrid события OnMouseDown, OnMouseUp и OnMouseMove?
Они есть, но не объявлены published
. Вы можете создать наследника TDBGrid и сделать их published.
11. Поиск компонента в форме по имени.
Я хочу делать текущими в форме произвольные компоненты. Как выставить фокус у конкретного компонента ясно - ListBox1.SetFocus
. А если я хочу обращаться к некоему компоненту по имени (свойство Name)? Свойство TForm.Components
— массив компонентов формы, который и нужен вам. Вы можете перемещаться по этому массиву пока не найдете компонент с нужным Name. Например: