Форум: "Начинающим";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
ВнизXML vs TreeView Найти похожие ветки
← →
trsteep © (2009-02-04 22:45) [0]Пытаюсь по клику на ноде TreeView загрузить дополнительные параметры.
Тут же вопрос какое событие срабатывает только при клике на нод, а не просто клик?
В дереве существуют папки и конечные объекты
Конечные объекты содержат Название самого надо, название и версию...
TProgram = class
Folder : Boolean; //Папка?
Name, //Название В дереве и нода
ver : String; //Версия
end;
....
Считываем каждый нод, добавляем его в TreeView....
var ProgramData: TProgram;
.....
try
ProgramData := TProgram.Create;
tmpTreeNode := TreeNodes.AddChild( TreeNode , tmpNode.NodeName );
//Какие параметры вносим?
if tmpNode.Attributes["Folder"]=false then
begin //Заполняем параметры
ProgramData.Folder := false;
ProgramData.FullName := tmpNode.Attributes["FullName"];
ProgramData.ver := tmpNode.Attributes["Version"];
ProgramData.LicenceType := tmpNode.Attributes["LicenceType"];
ProgramData.Comment := tmpNode.Attributes["Comment"];
ProgramData.Default := tmpNode.Attributes["Default"];
ProgramData.PathToProgram := tmpNode.Attributes["PathToProgram"];
ProgramData.WWW := tmpNode.Attributes["WWW"];
ProgramData.PathToInstall := tmpNode.Attributes["PathToInstall"];
ProgramData.InstallScript := tmpNode.Attributes["InstallScript"];
end
else ProgramData.Folder := true;
//Переносим параметры
tmpTreeNode.Data := ProgramData;
finally
//Очищяем
ProgramData.Free;
end;
....
как потом при клике загрузить?
пробовал:try
ProgramData := TProgram.Create;
if ProgramData( TreeView.Selected.Data ).Folder=false then
begin
Showmessage( TreeView.Selected.Text +#13
{+ ProgramData(TreeView.Selected.Data).FullName}
);
end;
finally
ProgramData.Free;
end;
Не компилит: [Pascal Warning] UnitMain.pas(149): W1036 Variable "ProgramData" might not have been initialized
если использовать TProgram(TreeView.Selected.Data ).Folder;
вылетает с ошибкой,...
Как правильно читать?
← →
TRSteep © (2009-02-04 22:58) [1]Нодов планируется около 100-1000.
возможно есть более хороший способ - буду рад услышать ;)
Спасибо заранее за ответ!
← →
Германн © (2009-02-05 01:06) [2]
> Не компилит: [Pascal Warning]
Warning это всего лишь предупреждение, что возможно алгоритм недостаточно продуман и в рантайме в будущем возможно появление "непонятных" ошибок. Компиляция при этом походит нормально.
> если использовать TProgram(TreeView.Selected.Data ).Folder;
>
> вылетает с ошибкой,...
>
С КАКОЙ/B> ошибкой? На какой строке кода при работе под отладчиком?
Ей-богу надоело! Неужели нельзя задать вопрос нормально?
P.S. И кстати при чём тут XML?
← →
Amoeba © (2009-02-05 03:46) [3]
> [Pascal Warning] UnitMain.pas(149): W1036 Variable "ProgramData"
> might not have been initialized
>
Поставьте ProgramData := TProgram.Create; перед try, и все будет путем. Именно на это и намекает компилятор.
← →
anonims (2009-02-05 09:08) [4]//Переносим параметры
tmpTreeNode.Data := ProgramData;
finally
//Очищяем
ProgramData.Free;
в результате имеем в Data ссылку на уничтоженный (Free) объект
Free здесь лишнее.
← →
TRSteep © (2009-02-05 12:13) [5]
> На какой строке кода при работе под отладчиком?
на строчке if ProgramData( TreeView.Selected.Data ).Folder=false
[Pascal Error] UnitMain.pas(162): E2066 Missing operator or semicolon
> P.S. И кстати при чём тут XML?
Ну загржаем с xml, потом надо же сохранить в xml. может есть проще способы...
> Free здесь лишнее.
спасибо.
еще не подскажите насчет:
какое событие срабатывает только при клике на нод, а не просто клик?
← →
ЮЮ © (2009-02-05 12:40) [6]
> какое событие срабатывает только при клике на нод, а не
> просто клик?
Если при таком клике удалось сменить нод, то OnChange, естественно. А если попали по свернуть/развернуть - то OnCollapsed / OnExpanded
А если нажать F1, то и про остальные 13 можно прочесь.
← →
Плохиш © (2009-02-05 13:25) [7]
> TRSteep © (05.02.09 12:13) [5]
>
>
> > На какой строке кода при работе под отладчиком?
>
> на строчке if ProgramData( TreeView.Selected.Data ).Folder=false
> [Pascal Error] UnitMain.pas(162): E2066 Missing operator
> or semicolon
Тебе перевести или сам словарь достанешь?
← →
TRSteep © (2009-02-05 13:38) [8]
> ЮЮ ©
Спасибо. У меня справки нет по делфи... только MSDN
← →
Anatoly Podgoretsky © (2009-02-05 13:41) [9]> TRSteep (05.02.2009 13:38:08) [8]
Как ты так лопухнулся?
← →
TRSteep © (2009-02-05 13:52) [10]
> Тебе перевести или сам словарь достанешь?
А как узнать какой оператор нужен?
> Как ты так лопухнулся?
прислали такой дистриб....
← →
Плохиш © (2009-02-05 13:58) [11]
> прислали такой дистриб....
Не ври, это не дистриб, а мусор с соседней пиратской помойки.
← →
TRSteep © (2009-02-05 14:40) [12]
> Не ври, это не дистриб, а мусор с соседней пиратской помойки.
такой прислали когда раздавали триалки 2009го...
он пощемуто поцарапан чуток.....
← →
TRSteep © (2009-02-05 17:07) [13]
> на строчке if ProgramData( TreeView.Selected.Data ).Folder=false>
>[Pascal Error] UnitMain.pas(162): E2066 Missing operator
> or semicolon
так где можно посмотреть как правильно написать?
← →
Плохиш © (2009-02-05 17:47) [14]
> TRSteep © (05.02.09 17:07) [13]
>
>
> > на строчке if ProgramData( TreeView.Selected.Data ).Folder=false>
> >[Pascal Error] UnitMain.pas(162): E2066 Missing operator
> > or semicolon
>
> так где можно посмотреть как правильно написать?
Это ты чаво здеся написал? Давай рассказывай по словам, по буквам, что зачем и почему и что ждёшь от этой строчки.
← →
TRSteep © (2009-02-05 18:04) [15]я хочу прочитать значение Folder из класса TProgram, у выделенного TTreeNode из атрибута (или как правильно будет не знаю) Data.
← →
Плохиш © (2009-02-05 18:10) [16]Я просил прокомментировать каждое слово в твоей писульке с надеждой, что ты сам поймёшь. Но, видно, не судьба.
← →
TRSteep © (2009-02-05 18:41) [17]неужели сложно дать одну строчку кода или ссылку на статью где можно прочитать про то как работать с атрибутом Data у нода, а лучше про все дерево
← →
Palladin © (2009-02-05 18:42) [18]Неужели сложно изучить раздел Type Casting документации. Или хотя бы поискать в гугле на тему "приведение типов (delphi|pascal)"
ведь "ProgramData( TreeView.Selected.Data ).Folder" ты ж с какого то хрена написал... или сам придумал?
← →
Palladin © (2009-02-05 18:44) [19]Хотя судя по тому, что ты тупо не можешь прокомментировать свои действия, как тебя просит Плохиш, то этот кусок кода пришел к тебе свыше и ты по наитию божьему его употребил. А объяснить не можешь.
← →
TRSteep © (2009-02-05 19:00) [20]логика ProgramData имеет поле folder, но как ему передать выделенный объект?
пока додумал только до такого....
потомучто в книге про data только одна строчка текста....
в примере что нашел по TTreeNode.Data была только запись, чтение не нашел - вот пытаюсь реализовать.
Знаний ровно столько сколько дали в универе + читаю книгу Архангельского.
но то что прочитаешь не вбивается в голову пока на практике не примениш. вот пытаюсь применить...
← →
Palladin © (2009-02-05 19:30) [21]
> TRSteep © (05.02.09 19:00) [20]
Логика ясна, и то что ты сделать хочешь, тоже понятно, тебя не об этом просят. Тебя просят код, строчку за строчкой, прокомментируй, что ты делаешь в каждой строке?
← →
TRSteep © (2009-02-05 20:12) [22]я не совсем понимаю - но вот:....
...
TProgram = class //создаем класс
Folder : Boolean; //проверяем это Папка?
Name, //Название В дереве и нода
ver : String; //Версия программы
end;
....
Считываем каждый нод, добавляем его в TreeView
....
var ProgramData: TProgram;
.....
try
ProgramData := TProgram.Create; //незнаю как называется но так надо для классов :)
tmpTreeNode := TreeNodes.AddChild( TreeNode , tmpNode.NodeName ); //добавляем потомка и берем его для внесения параметров
//Какие параметры вносим?
if tmpNode.Attributes["Folder"]=false then //если потомок имеет атрибут папка - фолсе - т.е. это конечный лист
begin //Заполняем параметры класса
ProgramData.Folder := false; //не папка
ProgramData.FullName := tmpNode.Attributes["FullName"]; //заносим имя
ProgramData.ver := tmpNode.Attributes["Version"];// заносим версию
end
else ProgramData.Folder := true; //если папка пишет папка тру
//Переносим параметры класса в дату нода
tmpTreeNode.Data := ProgramData;
finally
//Очищяем
ProgramData.Free;
end;
....
как потом при клике загрузить?
пробовал:
try
ProgramData := TProgram.Create;//опять таки для классов надо
if ProgramData( TreeView.Selected.Data ).Folder=false then//если это не папка
begin //показываем сообщение где выводим имя, которое содержится в дате нода, это для тестирование - смогу вывести имя -) смогу занести имя в TEdit, пока закоментировал, потомучто не компилецо....
Showmessage( TreeView.Selected.Text +#13
{+ ProgramData(TreeView.Selected.Data).FullName}
);
end;
finally
ProgramData.Free;// очищаем
end;
← →
Johnmen © (2009-02-05 21:27) [23]
> как потом при клике загрузить?
А нечего загружать-то, ничего уже нету, ведь ProgramData.Free;
:)
← →
TRSteep © (2009-02-05 22:44) [24]
> А нечего загружать-то, ничего уже нету, ведь ProgramData.
> Free;
а когдаtmpTreeNode.Data := ProgramData;
разве у Нода в Data не сохраняется?
← →
Amoeba © (2009-02-05 23:59) [25]
> TRSteep © (05.02.09 22:44) [24]
>
>
> > А нечего загружать-то, ничего уже нету, ведь ProgramData.
>
> > Free;
>
> а когда tmpTreeNode.Data := ProgramData;
> разве у Нода в Data не сохраняется?
С какой стати? После
ProgramData.Free;
tmpTreeNode.Data указывает неизвестно на что. Пора бы знать базовые элементарные вещи.
← →
девушка (2009-02-06 14:58) [26]Я бы на месте компилятора тоже не приняла бы эту строчку:
if ProgramData( TreeView.Selected.Data ).Folder=false
if TprogramData(...).Folder=false <--- тип, а не переменная, (непереводимая игра слов)
← →
Johnmen © (2009-02-06 15:03) [27]
> девушка (06.02.09 14:58) [26]
Ага, не переменная, а вычисленная константа. А не тип. В данном контексте.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.108 c