Остановка таймера на `полпути`
Timer1.Enabled := False;
Timer1.Enabled := True;
Это полностью «сбрасывает» таймер, другими словами, перезапускает его.
BTW: изменение интервала (в другое значение) также производит сброс таймера.
Вы можете включать и выключать ваш таймерный компонент, устанавливая соответствующее свойство, например:
Timer1.Enabled := True; { или False, если вы хотите выключить его }
Но при этом свои 5 секунд таймер продолжает отсчитывать. Если вы хотите изменить это, присвойте ему другой интервал, например так:
Timer1.Interval := 100;
На пустой форме у меня располагается TTreeView. Затем я сохраняю это в файле, используя WriteComponent. Это работает как положено; я могу из DOS c помощью команды "type" посмотреть двоичный файл и увидеть его содержимое, типа строк TTreeView и имя объекта. По крайней мере файл записывается и создается впечатление его "наполненности".
Затем я освобождаю компонент TTreeView, открываю поток, делаю ReadComponent и, затем, InsertControl. И получаю исключение "TreeView1 has no parent window" (TreeView1 не имеет родительского окна).
Это происходит из-за того, что при установке определенных свойств TreeView требуется дескриптор окна элемента управления, а для этого необходимо иметь родителя. Решение заключается в создании пустого TreeView и передаче его в качестве параметра ReadComponent - вы наверняка меня спросите, почему ReadComponent необходим параметр, правильно? Смотрите дальше.
procedureTForm1.Button1Click(Sender: TObject);
varTreeView : TTreeView;
begin
withTFileStream.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
Небольшие хитрости для работы с узлами TreeView:
Если вы хотите производить поиск по дереву, может быть для того, чтобы найти узел, соответствующий определенному критерию, то НЕ ДЕЛАЙТЕ ЭТО ТАКИМ ОБРАЗОМ:
fori := 0 toMyTreeView.Items.Count) do begin
ifMyTreeView.Items[i].Text = 'Банзай' thenbreak;
end;
…если вам не дорого время обработки массива узлов.
Значительно быстрее будет так:
Noddy := MyTreeView.Items[0];
Searching := true;
while(Searching) and(Noddy <> nil) do begin
ifNoddy.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 элемента управления.»
«Я разговаривал с деревьями…вот почему они ушли от меня…»
Читать дальше