Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров
- Дата:20.06.2024
- Категория: Компьютеры и Интернет / Программирование
- Название: Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор: Валентин Озеров
- Просмотров:5
- Комментариев:0
Шрифт:
Интервал:
Закладка:
При добавлении компонента на страницу 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);
- Основы объектно-ориентированного программирования - Бертран Мейер - Прочая околокомпьтерная литература
- HR-брендинг. Как стать лучшим работодателем в России - Нина Осовицкая - Маркетинг, PR, реклама
- Аквариум. (Новое издание, исправленное и переработанное) - Виктор Суворов (Резун) - Шпионский детектив
- Как учить чужой язык? - Антон Хрипко - Справочники
- Концептуальное проектирование сложных решений - Андрей Теслинов - Психология, личное