Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Недопонимания с TreeView [D7]


delphicoder ©   (2008-04-05 16:54:00) 

Доброго времени суток всем...

Чегото я тут задумался.. как мне взять второе родительского значение.. items[1] тобишь... вроде правильно написал.. не получилось.. на первом items[0] выполняет то что мне надо.. а второй долбит как хочет...  вобщем вот..

//--- артист
if AnsiUpperCase(inif.ReadString('Main','Tree','Artist')) = AnsiUpperCase('Artist') then
 begin
  //-- все записи
  if form1.RadioButton1.Checked then
   begin
    if form1.Table1.Active then
     form1.Table1.Active := false;
    form1.Table1.DatabaseName := ExtractFilePath(Application.Exename)+'Data';
    form1.Table1.TableName := 'K_m_data03.DB';
    if form1.Table1.Filtered then
     form1.Table1.Filtered := false;
    form1.Table1.Filter := '';
    form1.Table1.Active := true;
    form1.Table1.FindFirst;
    form1.Gauge1.MinValue := 0;
    form1.Gauge1.MaxValue := form1.Table1.RecordCount;
    form1.Gauge1.Progress := 0;
    form1.Gauge1.Visible := true;
    form1.StatusBar1.SimpleText := 'Построение дерева...';
    //--- основной цикл постоения дерева
    for i := 1 to form1.Table1.RecordCount do
     begin
      Application.ProcessMessages;
      form1.Gauge1.Progress := form1.Gauge1.Progress+1;
      myNode := form1.TreeView1.Items.Add(nil,form1.Table1.fieldbyname('Artist').AsString);
      id := form1.Table1.fieldbyname('Id').AsInteger;
      //-- список соответствий в основной таблице
      if form1.Table2.Active then
       form1.Table2.Active := false;
      form1.Table2.DatabaseName := ExtractFilePath(Application.Exename)+'Data';
      form1.Table2.TableName := 'K_m_data01.DB';
      if form1.Table2.Filtered then
       form1.Table2.Filtered := false;
      form1.Table2.Filter := '';
      form1.Table2.Active := true;
      form1.Table2.FindFirst;
      for j := 1 to form1.Table2.RecordCount do
       begin
        Application.ProcessMessages;
        if form1.Table2.FieldByName('Artist').AsInteger = Id then
         begin
           myGod := TTable.Create(nil);
           myGod.DatabaseName := ExtractFilePath(Application.Exename)+'Data';
           myGod.TableName := 'K_m_data05.DB';
           myGod.Active := true;
           myGod.Filter := 'Id = '+form1.Table2.FieldByName('Year').AsString;
           myGod.Filtered := true;
           myGod.FindFirst;
           flag_ := true;

Вот тут я смотрю основного родителя на наличие у него детей

           if form1.TreeView1.Items[i-1].Count > 0 then
если они есть тогда ищу повторы
            for k := 0 to form1.TreeView1.Items[i-1].Count-1 do
             if AnsiUpperCase(Trim(form1.TreeView1.Items[i-1].Item[k].Text)) = AnsiUpperCase(Trim(myGod.fieldbyname('Year').AsString)) then
              begin
               flag_ := false;
               break;
              end;
если повторов нет, то родителю добавляю ребенка, если повтор то ничего не добавляют
           if flag_ then
            myNode2 := form1.TreeView1.Items.AddChild(myNode,myGod.fieldbyname('Year').AsString);

           myGod.Filtered := false;
           myGod.Filter := '';
           myGod.Active := false;
           myGod.TableName := 'K_m_data04.DB';
           myGod.Active := true;
           if trim(form1.Table2.fieldbyname('Album').AsString) <> '' then
            begin
             myGod.Filter := 'Id = '+form1.Table2.fieldbyname('Album').AsString;
             myGod.Filtered := true;
             form1.TreeView1.Items.AddChild(myNode2,myGod.fieldbyname('Album').AsString);
             myGod.Filtered := false;
             myGod.Filter := '';
            end;
           myGod.Free;
         end;
        form1.Table2.FindNext;
       end;
      form1.Table2.Active := false;
      //--- конец поиска соответсвий
      form1.Table1.FindNext;
     end;
    //=== конец основного цикла
    form1.Gauge1.Visible := false;
    form1.StatusBar1.SimpleText := '';
   end;
  //-- конец все записи

 end;
//--- конец артист
form1.Table1.Active := false;

Вот...

Собственно по факту получаю.. что проверка на соответстия работает только для первого родителя... т.е. у первой записи в дереве идет

апина - 2000 - бла бла бла

а у второй уже получается

варум - 2004 - бла бла бла
         - 2004 -
        - 2004

и так далее...

получается что он не переходит почемуто на вторую родительскуя запись в дереве.. хотя я фиг знает... я ж пишу

for k := 0 to form1.TreeView1.Items[i-1].Count-1 do
             if AnsiUpperCase(Trim(form1.TreeView1.Items[i-1].Item[k].Text)) = AnsiUpperCase(Trim(myGod.fieldbyname('Year').AsString)) then

т.е. в первом случае TreeView1.Items[i-1].Count-1 получается TreeView1.Items[0].Count  т.е. апина

а во втором случае TreeView1.Items[1].Count т.е. варум...

или я чета не правильно мыслю?

Подскажите пожалуйста.. горю =(

Зарание спасибо


delphicoder   (2008-04-07 05:18:00) [1]

)))))

Да нет... бог тут не причем ))) Просто получилось что так оно написолось..

На самом деле это "мойГод" от слова Год.. имхо дата, тобишь например 1999 1998 2000 от рождения Иисуха Христа ) Просто я потом уже когда в думался в смысл.. как оно читается... тогда улыбнуло... но лень было переделывать )


> Ega23 ©   (06.04.08 14:05) [8]
> смотрел текст. Не понял, а накой ляд нужно myGod?


Это третья таблица  'K_m_data05.DB', т.е. там по смылу получается активна одна таблица с нее идет считывание.. потом идет анализ второй таблицы... а "мой бог" работает с третье таблицыей, вытаскивая из нее нужное, а потом с четвертой... в общем чтото типо этого _))


> {RASkov} ©   (06.04.08 13:30) [7]
> > [6] delphicoder   (06.04.08 13:23)
> > кстате, я бы не сказал что я попал..
>
> Попал-попал :)
> У тебя это метод класса TForm1.... переменная Form1 99%
> типа TForm1
> Так если ты говоришь:
>
> > [4] delphicoder   (06.04.08 02:48)
> > Угу.. и про self знаю ...
>
> то скорее всего - наврал :) ...нагло)

Да не.. впринципи не врал ... иногда юзал... =)

А в данном случае, как применялся бы self? ) Любопытно ) Позновательно )


Anatoly Podgoretsky   (2008-04-06 15:27:00) [2]

> Ega23  (06.04.2008 14:50:11)  [11]

YourGod


Ega23   (2008-04-06 14:50:00) [3]


> Ну куда в наше время без персонального, личного бога.


Жжош, дядя Толя!  :)


{RASkov}   (2008-04-06 14:20:00) [4]

> [8] Ega23 ©   (06.04.08 14:05)

А там акромя "персонального бога" еще чего полно ненужного совсем...
У меня все "смелости нехватает прочитать код", небось вообще в три строчки можно всю эту писанину уложить.... как обычно :)


Anatoly Podgoretsky   (2008-04-06 14:14:00) [5]

Ну куда в наше время без персонального, личного бога.


Ega23   (2008-04-06 14:05:00) [6]

смотрел текст. Не понял, а накой ляд нужно myGod?


{RASkov}   (2008-04-06 13:30:00) [7]

> [6] delphicoder   (06.04.08 13:23)
> кстате, я бы не сказал что я попал..

Попал-попал :)
У тебя это метод класса TForm1.... переменная Form1 99% типа TForm1
Так если ты говоришь:

> [4] delphicoder   (06.04.08 02:48)
> Угу.. и про self знаю ...

то скорее всего - наврал :) ...нагло)


delphicoder   (2008-04-06 13:23:00) [8]


> {RASkov}

чета мне интеоресно стало )) щас выложу всю процедуру... кстате, я бы не сказал что я попал.. мне наоборот позновательно будет )

procedure TForm1.SpeedButton10Click(Sender: TObject);
var inif : TInifile;
   i,j,Id,k : integer;
   myGod : TTable;
   myNode,myNode2 : TTreeNode;
   flag_ : boolean;
begin
inif := TInifile.Create(ExtractFilePath(Application.ExeName)+'Katag.ini');
form1.TreeView1.Items.Clear;
form1.CheckListBox1.Items.Clear;
form1.ListBox2.Items.Clear;
form1.GroupBox2.Visible := false;
//--- àðòèñò
if AnsiUpperCase(inif.ReadString('Main','Tree','Artist')) = AnsiUpperCase('Artist') then
 begin
  //-- âñå çàïèñè
  if form1.RadioButton1.Checked then
   begin
    if form1.Table1.Active then
     form1.Table1.Active := false;
    form1.Table1.DatabaseName := ExtractFilePath(Application.Exename)+'Data';
    form1.Table1.TableName := 'K_m_data03.DB';
    if form1.Table1.Filtered then
     form1.Table1.Filtered := false;
    form1.Table1.Filter := '';
    form1.Table1.Active := true;
    form1.Table1.FindFirst;
    form1.Gauge1.MinValue := 0;
    form1.Gauge1.MaxValue := form1.Table1.RecordCount;
    form1.Gauge1.Progress := 0;
    form1.Gauge1.Visible := true;
    form1.StatusBar1.SimpleText := 'Ïîñòîðîåíèå äåðàâà...';
    //--- îñíîâíîé öèêë ïîñòîåíèÿ äåðåâà
    for i := 1 to form1.Table1.RecordCount do
     begin
      Application.ProcessMessages;
      form1.Gauge1.Progress := form1.Gauge1.Progress+1;
      myNode := form1.TreeView1.Items.Add(nil,form1.Table1.fieldbyname('Artist').AsString);
      id := form1.Table1.fieldbyname('Id').AsInteger;
      //-- îïèñê ñîîòâåòñòâèé â îñíîâíîé òàáëèöå
      if form1.Table2.Active then
       form1.Table2.Active := false;
      form1.Table2.DatabaseName := ExtractFilePath(Application.Exename)+'Data';
      form1.Table2.TableName := 'K_m_data01.DB';
      if form1.Table2.Filtered then
       form1.Table2.Filtered := false;
      form1.Table2.Filter := '';
      form1.Table2.Active := true;
      form1.Table2.FindFirst;
      for j := 1 to form1.Table2.RecordCount do
       begin
        Application.ProcessMessages;
        if form1.Table2.FieldByName('Artist').AsInteger = Id then
         begin
           myGod := TTable.Create(nil);
           myGod.DatabaseName := ExtractFilePath(Application.Exename)+'Data';
           myGod.TableName := 'K_m_data05.DB';
           myGod.Active := true;
           myGod.Filter := 'Id = '+form1.Table2.FieldByName('Year').AsString;
           myGod.Filtered := true;
           myGod.FindFirst;
           flag_ := true;
           if myNode.Count > 0 then
           for k := 0 to myNode.Count-1 do
            if AnsiUpperCase(Trim(myNode.Item[k].Text)) = AnsiUpperCase(Trim(myGod.fieldbyname('Year').AsString)) then
              begin
               flag_ := false;
               break;
              end;
           if flag_ then
             myNode2 := form1.TreeView1.Items.AddChild(myNode,myGod.fieldbyname('Year').AsString);
           myGod.Filtered := false;
           myGod.Filter := '';
           myGod.Active := false;
           myGod.TableName := 'K_m_data04.DB';
           myGod.Active := true;
           if trim(form1.Table2.fieldbyname('Album').AsString) '' then
            begin
             myGod.Filter := 'Id = '+form1.Table2.fieldbyname('Album').AsString;
             myGod.Filtered := true;
             flag_ := true;
             if myNode2.Count > 0 then
             for k := 0 to myNode2.Count-1 do
              if AnsiUpperCase(Trim(myNode2.Item[k].Text)) = AnsiUpperCase(Trim(myGod.fieldbyname('Album').AsString)) then
                begin
                 flag_ := false;
                 break;
                end;
             if flag_ then
               form1.TreeView1.Items.AddChild(myNode2,myGod.fieldbyname('Album').AsString);
             myGod.Filtered := false;
             myGod.Filter := '';
            end;
           myGod.Free;
         end;
        form1.Table2.FindNext;
       end;
      form1.Table2.Active := false;
      //--- êîíåö ïîèñêà ñîîñòâåòâèé
      form1.Table1.FindNext;
     end;
    //=== êîíåö îñíîâíîãî öèêëà
    form1.Gauge1.Visible := false;
    form1.StatusBar1.SimpleText := '';
    form1.Table1.Active := false;
   end;
  //-- êîíåö âñå çàïèñè
  //--- Êîìïîçèöèÿ

  if form1.RadioButton2.Checked then
   begin
    if form1.Table1.Active then
     form1.Table1.Active := false;
    form1.Table1.DatabaseName := ExtractFilePath(Application.Exename)+'Data';
    form1.Table1.TableName := 'K_m_data01.DB';
    if form1.Table1.Filtered then
     form1.Table1.Filtered := false;
    form1.Table1.Filter := '';
    form1.Table1.Active := true;
    form1.Table1.FindFirst;
    form1.Gauge1.MinValue := 0;
    form1.Gauge1.MaxValue := form1.Table1.RecordCount;
    form1.Gauge1.Progress := 0;
    form1.Gauge1.Visible := true;
    form1.StatusBar1.SimpleText := 'Ïîñòîðîåíèå äåðàâà...';
    //--- îñíîâíîé öèêë ïîñòîåíèÿ äåðåâà
    for i := 1 to form1.Table1.RecordCount do
     begin
      Application.ProcessMessages;

     end;
    //=== êîíåö îñíîâíîãî öèêëà
    form1.Gauge1.Visible := false;
    form1.StatusBar1.SimpleText := '';
    form1.Table1.Active := false;
   end;
  //---- êîíåö êîìïîçèöèÿ

 end;
//--- êîíåö àðòèñò

inif.Free;
end;


{RASkov}   (2008-04-06 10:50:00) [9]

> [4] delphicoder   (06.04.08 02:48)
> в данном случае это к чему конкретно было сказано?

то что приведено в [0] - код, покажи заголовок данной процедуры(метода)...
И если ето метод формы, то тут ты и попал :)


delphicoder   (2008-04-06 02:48:00) [10]

))

Угу.. знаю я про with

но дружится с ним чета не хочется... ) Я конечно понимаю что использования with целесообразней.. но всеж )

Угу.. и про self знаю ... а кстате... в данном случае это к чему конкретно было сказано? )

Ну... может и есть в третьих и в четвертых... и тд и тп ) кто знает..


{RASkov}   (2008-04-05 21:32:00) [11]

> [2] VirEx ©   (05.04.08 21:27)

Во первых автору нужно подружится с оператором with,
во вторых... жаль не видно заголовков процедур, но всеж во вторых наверняка автор не знает про self
в третьих - я код не смотрел, но почему-то уверен, что там есть и в четвертых и в пятых и т.д. и т.п. :)


VirEx   (2008-04-05 21:27:00) [12]

Большой совет, хотя наверно глупый совет но всёже:

   form1.Table1.TableName := 'K_m_data03.DB';
   if form1.Table1.Filtered then
    form1.Table1.Filtered := false;
   form1.Table1.Filter := '';
   form1.Table1.Active := true;
   form1.Table1.FindFirst;
   form1.Gauge1.MinValue := 0;
   form1.Gauge1.MaxValue := form1.Table1.RecordCount;
   form1.Gauge1.Progress := 0;
   form1.Gauge1.Visible := true;

это очень плохо, постарайся логически выделить такие операции в отдельные куски, оформи это в виде функций и процедур, и вызывай одной строкой:
PlaySound()
SortSound(sArtist,...)
и т.д.
иначе, если тебе нужно будет чтонибудь изменить, например имя формы - тебе придется штудировать весь исходник чтобы менять, притом не факт что после этого всё будет работать нормально.


delphicoder   (2008-04-05 17:04:00) [13]

Все, разобрался )

           if myNode.Count > 0 then
           for k := 0 to myNode.Count-1 do
            if AnsiUpperCase(Trim(myNode.Item[k].Text)) = AnsiUpperCase(Trim(myGod.fieldbyname('Year').AsString)) then
              begin
               flag_ := false;
               break;
              end;

А вот всеж интересно... а если не использовать переменую myNode, почему не перебиралась?

Проде по смыслу правильно было...


Наверх

Титульная страница Поиск, карта сайта Написать письмо