Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.041 c
1-1129207393
Квэнди
2005-10-13 16:43
2005.11.06
Цвета в StringGrid


2-1128903401
Raziel
2005-10-10 04:16
2005.11.06
Открытие файлов


14-1129125684
Гость из прошлого
2005-10-12 18:01
2005.11.06
Помогите рассортировать языки програмирования


11-1110873009
hotes
2005-03-15 10:50
2005.11.06
Вопрос по KolOGL12


3-1127375236
Jioniro
2005-09-22 11:47
2005.11.06
Поиск по контексту с помощью SQL запроса