Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-1125777895
SamProf
2005-09-04 00:04
2005.11.06
Управлять активным Editom не на своей форме!


4-1125491487
Black Krok
2005-08-31 16:31
2005.11.06
Исчерпание ресурсов Windows


3-1127469418
WG
2005-09-23 13:56
2005.11.06
Можно ли запретить DBGrid создавать запись ?


14-1129586099
beglec
2005-10-18 01:54
2005.11.06
www.delphimaster.ru - лучший способ поднять настроение.


2-1129269846
Fynjy1984
2005-10-14 10:04
2005.11.06
Секундомер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский