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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.019 c
15-1232519912
TUser
2009-01-21 09:38
2009.03.29
Большой адронный коллайдер и физические исследования на нем


1-1200243085
YaroslavSh
2008-01-13 19:51
2009.03.29
Как записать загрузочную область флешки?


2-1234181007
Andrewtitoff
2009-02-09 15:03
2009.03.29
как организовать цикл по датам


15-1232058752
antonn
2009-01-16 01:32
2009.03.29
использование материалов этого сайта


6-1200643073
Andrewtitoff
2008-01-18 10:57
2009.03.29
Как правильно послать файл через TcpServer &amp; TcpClient ?