Форум: "KOL";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
ВнизTreeView.TVItemChild возвращает 0 вместо обещанного Child a! Найти похожие ветки
← →
Sormy (2005-02-19 00:34) [0]
property TVItemChild[ Item: THandle ]: THandle index TVGN_CHILD read TVGetItemNext;
Это в kol.pas... все правильно?
TVItemChild возвращает 0 в качестве Item Handle, при том что:property TVItemHasChildren[ Item: THandle ]: Boolean read TV_GetItemHasChildren write TV_SetItemHasChildren;
property TVItemChildCount[ Item: THandle ]: Integer read TV_GetItemChildCount;
работают нормально...
Подкажите в чем проблема... Может я что-то недопонимаю?
← →
Unknown Mystic © (2005-02-19 09:14) [1]
> Может я что-то недопонимаю?
Похоже, что так. TVItemChild[] у меня возвращает, что должен.
Задайте вопрос еще раз - более понятно и лучше, если с фрагментом кода.
← →
Sormy (2005-02-19 10:22) [2]
function GetNodeInPath(Path: string; Separator: char; TreeView: PControl):cardinal;
var
_path,x:string;
List: PStrList;
Node,h: Cardinal;
i,j: integer;
s: string;
begin
Result := 0;
if (TreeView = nil) or (TreeView.Count = 0) or (Path = "") or (Separator
= "") then
exit;
_path:=path;
List := NewStrList;
while _path<>"" do
begin
x:=parse(_path,separator);
list.Add(x);
end;
// Начинаем с нулевой ноды дерева
Node := TreeView.TVRoot;
// Проходим по всему списку уровней пути
for i := 0 to List.Count - 1 do
begin
// Ищем имя ноды на текущем уровне
while TreeView.TVItemText[Node]<>List.Items[i] do
begin
h:=TreeView.TVItemNext[Node];
if h<>0 then Node := h
else break;
end;
// Нода не найдена
if Node = 0 then break;
// Переходим на уровень ниже
if (i < List.Count - 1) and TreeView.TVItemHasChildren[node] then
begin
h:=TreeView.TVItemChild[TreeView.TVItemParent[node]];
if h<>0 then Node := h;
end;
end;
List.Free;
Result := Node;
end;
В общем, мне нужно, чтоб по полному имени директории можно было ее развернуть в DirectoryTreeView.
Данный код содержит ошибки?
← →
Unknown Mystic © (2005-02-19 16:17) [3]>> Sormy (19.02.05 10:22) [2]
> h:=TreeView.TVItemChild[TreeView.TVItemParent[node]];
А это что такое? Так в h окажется Handle первой вершины списка того же урвоня и с тем же родителем, что и в node.
← →
Sormy (2005-02-19 16:57) [4]Точно... h:=TreeView.TVItemChild[node];
:-) Это я забыл исправить на первоначальный вариант перед тем как на форум послал :-) Я уже птом начал подбирать всевозможные комбинации...
В общем, при таком: h:=TreeView.TVItemChild[node];
подходе фишка работает ТОЛЬКО до второго уровня, а дальше - 0 возвращает.
Я эту функцию взял из Delphi World"a. Она на VCL расчитана была. Я ее для KOL переписал, но она не работает и я понять не могу, почему до второго уровня все ОК, а дальше - нет...
← →
Unknown Mystic © (2005-02-21 12:43) [5]А если путь только из 2 уровней или даже из 1, то его находит?
Может передаваемая ф-ии строка с путем не правильная и в дереве просто нет такого эл-та? :)
Пройдись по ф-ии в пошаговом режиме.
← →
Sormy (2005-02-21 17:14) [6]В общем, есть дерево каталогов. При выходе путь сохраняется в ИНИшник (правильно). При старте нужно открыть путь в DirTreeView. По умолчанию там диски: A:, C:, D:, E: ... Так вот, эта функция нормально работает только при выборе любой из папок, которая находятся в корне какого-либо диска... а если идти дальше по дереву, то не срабатывает... Не находит индекс нода...
Элемент в дереве есть 100% :-)
Странно, ошибки я не вижу, хоть и текста мало...
← →
Unknown Mystic © (2005-02-21 18:37) [7]
> При выходе путь сохраняется в ИНИшник (правильно).
А считывается верно?
Если есть, убери конечный слеш(он же, как я понимаю является разделителем)
> Элемент в дереве есть 100% :-)
Ты элементы все сразу создаешь или по мере раскрытия?
← →
Sormy (2005-02-21 22:33) [8]
procedure TForm1.formMainClose(Sender: PObj; var Accept: Boolean);
var
ini:pinifile;
begin
ini:=OpenIniFile(GetStartDir+"prwplay.ini");
ini.Mode:=ifmWrite;
ini.Section:="Last Settings";
ini.ValueString("Directory Name",DirName);
ini.Free;
end;
procedure TForm1.formMainFormCreate(Sender: PObj);
var
ini:pinifile;
node:longint;
value:longint;
begin
ini:=OpenIniFile(GetStartDir+"prwplay.ini");
ini.Mode:=ifmRead;
ini.Section:="Last Settings";
DirName:=ini.ValueString("Directory Name","");
ini.Free;
//ETPD=ExcludeTrailingPathDelimiter
node:=GetNodeInPath(etpd(DirName),"\",dtvTree);
//showmsg(int2str(node),mb_ok);
dtvTree.TVExpand(node,TVE_EXPAND);
end;
function GetNodeInPath(Path: string; Separator: char; TreeView: PControl):cardinal;
var
_path,x:string;
List: PStrList;
Node,h: Cardinal;
i,j: integer;
s: string;
begin
Result := 0;
if (TreeView = nil) or (TreeView.Count = 0) or (Path = "") or (Separator
= "") then
exit;
_path:=path;
List := NewStrList;
while _path<>"" do
begin
x:=parse(_path,separator);
list.Add(x);
end;
// Начинаем с нулевой ноды дерева
Node := TreeView.TVRoot;
// Проходим по всему списку уровней пути
for i := 0 to List.Count - 1 do
begin
// Ищем имя ноды на текущем уровне
while TreeView.TVItemText[Node]<>List.Items[i] do
begin
h:=TreeView.TVItemNext[Node];
if h<>0 then Node := h
else break;
end;
// Нода не найдена
if Node = 0 then break;
// Переходим на уровень ниже
if (i < List.Count - 1) and (TreeView.TVItemHasChildren[node]) then
begin
h:=TreeView.TVItemChild[node];
if h<>0 then Node := h;
end;
end;
List.Free;
Result := Node;
end;
Считывается верно на 100%
Убран конечный слеш
Элементы создаются автоматически, т.к. это стандартный KOLDirTreeView c полем InitialPath="*" по умолчанию. Данный объект создает ноды по мере раскрытия, если я не ошибаюсь...
Ах да... Я ошибся :-) Данный листинг работает правильно до ПЕРВОГО уровня :-). Т.е. дальше выбранного диска не запоминает...
Я уже совсем замаялся :-) Абсолютным дураком себя чувствую :-)
Если List.Count = 1 то все работает нормально, но почему не работает при 2,3,4,5....????????????
← →
Unknown Mystic © (2005-02-22 13:36) [9]А ты попробуй сначала развернуть дерево до нужного уровня, а потом поискать :)
> Элементы создаются автоматически, т.к. это стандартный KOLDirTreeView
> c полем InitialPath="*" по умолчанию. Данный объект создает
> ноды по мере раскрытия, если я не ошибаюсь...
Тебе это ни о чем не говорит? А зря :) Как ты собираешься искать не существующую вершину? Перед тем как искать child"а, разверни текущую вершину - все должно наладится :)
А TVItemHasChildren[] говорит тебе "угу", потому, что KOLDirTreeView устанавливает его в True, что бы слева отображался +, хотя child"ы еще не созданы. Посмотри что тебе TVItemChildCount вернет :)
← →
Unknown Mystic © (2005-02-22 17:49) [10]И вообще, ты не пробовал просто указать нужный тебе InitialPath? :)
← →
Sormy (2005-02-22 21:52) [11]InitialPath???????????????????????? :)
Да ведь он означает корневую папку!!!!!!!!
Да и устанавливать его можно только в design-time! А так на New.... делать :-)
Неужели все правильно в плане исходного кода, но не пашет в реале?????????
← →
Sormy (2005-02-22 22:36) [12]ТОЧНО!
Дерево каталогов строится не сразу, а по мере кликанья по нему. Ваше предположение оказалось верным, и в этом проблема заключается...
В случае с начальным стартом программы, дерево сформировано только до первого уровня, поэтому дальше первого уровня она Child и не находит, т.к. они еще не созданы - они создаются только после клика по Parent"y, ну а кликов естественно и не происходило...
Теперь возникли другие вопросы:
Как сделать, чтоб дерево создавалось сразу всё, а не по мере спуска?
Как сделать, чтоб, зная индекс Нода, заставить DirTreeView построить дерево дочерних каталогов ТОЛЬКО для этого Нода, а не для всех (что будет более производительно), это надо через SendMessage реализовывать?
Подскажите, пожалуйста.
← →
Sormy (2005-02-22 23:02) [13]Вопрос снимается!!!
Я ... ммм... ступил 8)
Если добавить всего одну строчку в GetNodeInPath, то все работает
TreeView.TVExpand(node,TVE_EXPAND);
Огромное Вам, Unknown Mystic, спасибо!!!
← →
Choix (2005-03-12 15:18) [14]помогите разобраться с компонентом TreeView. Хелп в Дельфях ужасный!Про этот компонент тишина! 8(
Да и я не профи.
Может ссылочку дадите на пример работы с деревом?
(создание пунктов и подпунктов).
Заранее спасибо.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c