Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

Демонстрационный код

Следующий код с приведенными обработчиками событий является «отрывком» из большого проекта с компонентами TTimer, TTabbedNotebook (с множеством страниц) и большим разнообразием визуальных элементов управления на каждой странице компонента. (Позже мы подчеркнем преимущества кода, приведенного ниже, перед его добавлением в ваш проект) Приведенный код должен располагаться соответственно в обработчиках событий OnTimer компонента TTimer и OnChange компонента TTabbedNotebook. Вот каким должен быть ваш новый код:

<Модуль с объявленными в нем TTabbedNotebook и TTimer>

Implementation

Type TSurfaceWin = class(TWinControl);

procedure TForm1.Timer1Timer(Sender: TObject);

begin

 {Данный
код заменяет заголовок формы на системную информацию,

 содержащую в процентах free SYSTEM, GDI, &USER для windows.}

 caption := 'SYSTEM: ' +

inttostr(getfreesystemresources(GFSR_SYSTEMRESOURCES)) + ' GDI: ' +

inttostr(getfreesystemresources(GFSR_GDIRESOURCES)) + ' USER: ' +

inttostr(getfreesystemresources(GFSR_USERRESOURCES));

end;

procedure TForm1.TabbedNotebook1Change(Sender: TObject; NewTab: Integer; var AllowChange: Boolean);

begin

 {LockWindowUpdate запрещает перерисовку данного окна}

 LockWindowUpdate(handle);

 {Причина использования TSurfaceWin в том, что вызов DestroyHandle в TWinControl объявлен как абстрактный, поэтому данный вызов возможен только его потомками, реализовавшими данную процедуру. Следующая строка читает индекс текущей страницы TabbedNotebook и разрушает ее дескриптор при перемещении на другую страницу. ПРИМЕЧАНИЕ: Даже если мы уничтожаем дескриптор, Windows помнит страничный объект и переназначает/создает новый при нажатии на другой закладке. }

 TSurfaceWin(TabbedNotebook1.pages.objects[tabbedNotebook1.pageindex]).DestroyHandle;

 {Выключаем блокировку формы, чтобы любой элемент управления мог перерисовывать себя}

 LockWindowUpdate(0);

end;

Доступ к страницам Tabbednotebook

Delphi 1

При добавлении компонентов во время выполнения программы, вам необходимо присвоить для каждого компонента свойству parent (контейнер) _страницу_ компонента notebook, а не сам notebook.

Вы можете сделать это следующим образом (пример дан для кнопки):

MyButton := TButton.Create(Form1); {как обычно…}

MyButton.Parent := TTabPage(TabbedNotebook1.Pages.Objects[n]);

{ <== где 'n' – индекс желаемой страницы ==> }

Свойство notebook 'Pages' имеет тип StringList и содержит

список заголовков и объектов 'TTabPage'.

Я сам пользовался этой техникой несколько месяцев. Не могу вспомнить где я сам раздобыл эту информацию, но в документации про это ничего не сказано. Может кто-нибудь знает, где об этом написано?

При добавлении компонента на страницу TabbedNotebook во время выполнения приложения, указатель на желаемую страницу для свойства Parent нового компонента должен быть назначен перед тем, как он будет реально показан. Способ получить доступ ко всем страницам TTabbedNotebook во время выполнения программы – с помощью свойства-массива Objects свойства TabbedNotebook Pages. Другими словами, страничные компоненты хранятся как объекты, присоединенные к имени страницы в списке строк свойства Pages. В следующим коде показано создание кнопки на второй странице компонента TabbedNotebook1:

var NewButton : TButton;

begin

 NewButton := TButton.Create(Self);

 NewButton.Parent := TWinControl(TabbedNotebook1.Pages.Objects[1])

 …

Вот как страница TNotebook может быть использована в качестве родителя для вновь создаваемого на ней компонента:

NewButton.Parent := TWinControl(Notebook1.Pages.Objects[1])

Вот как страница (закладка) TTabSet может быть использована в качестве родителя для вновь создаваемого на ней компонента:

NewButton.Parent := TWinControl(TabSet1.Tabs.Objects[1])
 

TabControl 

Над какой закладкой курсор?

YoungHacker советует:

Получение позиции мышиного курсора для TabControl над какой закладкой находится курсор.

function Form1.ItemAtPos(TabControlHandle : HWND; X, Y : Integer) : Integer;

var

 HitTestInfo : TTCHitTestInfo;

 HitIndex : Integer;

begin

 HitTestInfo.pt.x := X;

 HitTestInfo.pt.y := Y;

 HitTestInfo.flags := 0;

 HitIndex := SendMessage(TabControlHandle, TCM_HITTEST, 0, Longint(@HitTestInfo));

 Result := HitIndex;

end;
 

Table 

Создание таблицы в модуле

Delphi 3 

Объект TTable может быть создан с владельцем, а может и без оного. Поскольку вы объявляете его локально в процедуре, то владелец в этом случае не требуется. Если владелец не задан, то забота об освобождении объекта ложится на вас. В противном случае объект освобождается владельцем всякий раз, когда освобождается сам владелец. Имеет смысл? Чтобы создать таблицу без владельца, сделайте следующее:

procedure CreateATableInAUnit;

Поделиться с друзьями: