Рейтинговые книги
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 82 83 84 85 86 87 88 89 90 ... 123

При добавлении компонента на страницу 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;

var myTable : TTable;

begin

 myTable := TTable.Create(nil);

 try

  myTable.DatabaseName := 'MyDB';

  myTable.TableName := 'MyTable.db';

  mytable.IndexName := 'MyIndex';

  myTable.Open;

  {другой код}

 finally

  myTable.Free;

 end;

end

TabSet 

Изменение количества закладок в TTabSet во время выполнения программы

Delphi 1 

Вначале сделайте где-то в вашем коде следующее объявление:

TabSet1: TTabSet; { подразумевается, что это принадлежит Form1 }

Затем следующей строкой мы очищаем заголовки всех закладок:

Form1.TabSet1.Tabs.Clear;

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

Form1.TabSet1.Tabs.Add('какой-то заголовок');

Пожалуйста, помните о том, что я назначил имя в предположении, что вы имеете ссылку на юнит, где оно определено [но не исключаю возможности, что вы можете получить ссылку на закладку и через обработчика соответствующего события, что еще проще, но мы то с вами должны знать все!]. Если вам нужно сослаться на объект из другого модуля, просто добавьте к вызову имя модуля (и добавьте этот модуль в список «uses»), например так:

Unit1.Form1.TabSet1.Tabs.Add('Заголовок');

Поскольку «TabSet1.Tabs» имеет тип TStrings, вы можете использовать любой из доступных методов этого типа (AddObject, LoadFromFile и т.д.). 

Timer 

Остановка таймера на `полпути`

Delphi 1

Timer1.Enabled := False;

Timer1.Enabled := True;

Это полностью «сбрасывает» таймер, другими словами, перезапускает его.

BTW: изменение интервала (в другое значение) также производит сброс таймера.

Вы можете включать и выключать ваш таймерный компонент, устанавливая соответствующее свойство, например:

Timer1.Enabled := True; { или False, если вы хотите выключить его }

Но при этом свои 5 секунд таймер продолжает отсчитывать. Если вы хотите изменить это, присвойте ему другой интервал, например так:

Timer1.Interval := 100;

TreeView 

Поточность TreeView

Delphi 2

На пустой форме у меня располагается TTreeView. Затем я сохраняю это в файле, используя WriteComponent. Это работает как положено; я могу из DOS c помощью команды "type" посмотреть двоичный файл и увидеть его содержимое, типа строк TTreeView и имя объекта. По крайней мере файл записывается и создается впечатление его "наполненности".

Затем я освобождаю компонент TTreeView, открываю поток, делаю ReadComponent и, затем, InsertControl. И получаю исключение "TreeView1 has no parent window" (TreeView1 не имеет родительского окна).

Это происходит из-за того, что при установке определенных свойств TreeView требуется дескриптор окна элемента управления, а для этого необходимо иметь родителя. Решение заключается в создании пустого TreeView и передаче его в качестве параметра ReadComponent - вы наверняка меня спросите, почему ReadComponent необходим параметр, правильно? Смотрите дальше.

procedure TForm1.Button1Click(Sender: TObject);

var TreeView : TTreeView;

begin

 with TFileStream.Create('JUNK.STR', fmCreate) do try

  WriteComponent(TreeView1);

  TreeView1.Name := 'TreeView';

  Position := 0;

  TreeView := TTreeView.Create(Self);

  TreeView.Visible := false;

  TreeView.Parent := Self;

  ReadComponent(TreeView);

  TreeView.Top := TreeView1.Top + TreeView1.Height + 10;

  TreeView.Visible := true;

 finally

  Free;

 end;

end;

Два небольших замечания:

1. Убедитесь в отсутствии конфликта имен. Данный код делает форму владельцем второго TreeView и при ее освобождении разрушает компонент. Я просто переименовываю существующий TreeView перед загрузкой 'клона'.

2. Я установил свойство visible в false перед установкой свойства parent, этим я предотвратил показ только что созданного TreeView до момента загрузки его из потока.

 – Mike Scott

Получение доступа к узлам TreeView

Delphi 2

Небольшие хитрости для работы с узлами TreeView:

Если вы хотите производить поиск по дереву, может быть для того, чтобы найти узел, соответствующий определенному критерию, то НЕ ДЕЛАЙТЕ ЭТО ТАКИМ ОБРАЗОМ:

for i := 0 to MyTreeView.Items.Count) do begin

 if MyTreeView.Items[i].Text = 'Банзай' then break;

end;

…если вам не дорого время обработки массива узлов.

Значительно быстрее будет так:

Noddy := MyTreeView.Items[0];

Searching := true;

while (Searching) and (Noddy <> nil) do begin

 if Noddy.text = SearchTarget then begin

  Searching := False;

  MyTreeView.Selected := Noddy;

  MyTreeView.SetFocus;

 end else begin

  Noddy := Noddy.GetNext

 end;

end;

В моей системе приведенный выше код показал скорость 33 милисекунды при работе с деревом, имеющим 171 узел. Первый поиск потребовал 2.15 секунд.

Оказывается, процесс индексирования очень медленный. Я подозреваю, что при каждой индексации свойства Items, вы осуществляете линейный поиск, но это нигде не засвидетельствовано, поэтому я могу ошибаться.

Вам действительно не нужно просматривать все дерево, чтобы найти что вам нужно – получить таким образом доступ к MyTreeView.Items[170] займет много больше времени, чем получения доступа к MyTreeView.Items[1].

Как правило, для отслеживания позиции в дереве TreeView, нужно использовать временную переменную TTreeNode, а не использовать целочисленные индексы. Возможно, свойство ItemId как раз и необходимо для такого применения, но, к сожалению, я никак не могу понять абзац в электронной документации, касающийся данного свойства:

«Свойство ItemId является дескриптором TTreeNode типа HTreeItem и однозначно идентифицирует каждый элемент дерева. Используйте это свойство, если вам необходимо получить доступ к элементам дерева из внешнего по отношению к TreeView элемента управления.»

«Я разговаривал с деревьями…вот почему они ушли от меня…»

(Spike Milligan)

– Peter Kane 

Хочется выделять некоторые стpочки в TTreeView жирным или бледным. Как?

Nomadic советует:

Грхм… Господа, но если речь про bold… Матчасть учить надо 8-).

procedure SetNodeState(node: TTreeNode; Flags: Integer);

1 ... 82 83 84 85 86 87 88 89 90 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий