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

Вниз

Недопонимания с TreeView   Найти похожие ветки 

 
delphicoder   (2008-04-05 16:54) [0]

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

Чегото я тут задумался.. как мне взять второе родительского значение.. 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-05 17:04) [1]

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

           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, почему не перебиралась?

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


 
VirEx ©   (2008-04-05 21:27) [2]

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

   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,...)
и т.д.
иначе, если тебе нужно будет чтонибудь изменить, например имя формы - тебе придется штудировать весь исходник чтобы менять, притом не факт что после этого всё будет работать нормально.


 
{RASkov} ©   (2008-04-05 21:32) [3]

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

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


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

))

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

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

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

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


 
{RASkov} ©   (2008-04-06 10:50) [5]

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

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


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


> {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;
//--- &#224;&#240;&#242;&#232;&#241;&#242;
if AnsiUpperCase(inif.ReadString("Main","Tree","Artist")) = AnsiUpperCase("Artist") then
 begin
  //-- &#226;&#241;&#229; &#231;&#224;&#239;&#232;&#241;&#232;
  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 := "&#207;&#238;&#241;&#242;&#238;&#240;&#238;&#229;&#237;&#232;&#229; &#228;&#229;&#240;&#224;&#226;&#224;...";
    //--- &#238;&#241;&#237;&#238;&#226;&#237;&#238;&#233; &#246;&#232;&#234;&#235; &#239;&#238;&#241;&#242;&#238;&#229;&#237;&#232;&#255; &#228;&#229;&#240;&#229;&#226;&#224;
    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;
      //-- &#238;&#239;&#232;&#241;&#234; &#241;&#238;&#238;&#242;&#226;&#229;&#242;&#241;&#242;&#226;&#232;&#233; &#226; &#238;&#241;&#237;&#238;&#226;&#237;&#238;&#233; &#242;&#224;&#225;&#235;&#232;&#246;&#229;
      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;
      //--- &#234;&#238;&#237;&#229;&#246; &#239;&#238;&#232;&#241;&#234;&#224; &#241;&#238;&#238;&#241;&#242;&#226;&#229;&#242;&#226;&#232;&#233;
      form1.Table1.FindNext;
     end;
    //=== &#234;&#238;&#237;&#229;&#246; &#238;&#241;&#237;&#238;&#226;&#237;&#238;&#227;&#238; &#246;&#232;&#234;&#235;&#224;
    form1.Gauge1.Visible := false;
    form1.StatusBar1.SimpleText := "";
    form1.Table1.Active := false;
   end;
  //-- &#234;&#238;&#237;&#229;&#246; &#226;&#241;&#229; &#231;&#224;&#239;&#232;&#241;&#232;
  //--- &#202;&#238;&#236;&#239;&#238;&#231;&#232;&#246;&#232;&#255;

  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 := "&#207;&#238;&#241;&#242;&#238;&#240;&#238;&#229;&#237;&#232;&#229; &#228;&#229;&#240;&#224;&#226;&#224;...";
    //--- &#238;&#241;&#237;&#238;&#226;&#237;&#238;&#233; &#246;&#232;&#234;&#235; &#239;&#238;&#241;&#242;&#238;&#229;&#237;&#232;&#255; &#228;&#229;&#240;&#229;&#226;&#224;
    for i := 1 to form1.Table1.RecordCount do
     begin
      Application.ProcessMessages;

     end;
    //=== &#234;&#238;&#237;&#229;&#246; &#238;&#241;&#237;&#238;&#226;&#237;&#238;&#227;&#238; &#246;&#232;&#234;&#235;&#224;
    form1.Gauge1.Visible := false;
    form1.StatusBar1.SimpleText := "";
    form1.Table1.Active := false;
   end;
  //---- &#234;&#238;&#237;&#229;&#246; &#234;&#238;&#236;&#239;&#238;&#231;&#232;&#246;&#232;&#255;

 end;
//--- &#234;&#238;&#237;&#229;&#246; &#224;&#240;&#242;&#232;&#241;&#242;

inif.Free;
end;


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

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

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

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

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


 
Ega23 ©   (2008-04-06 14:05) [8]

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


 
Anatoly Podgoretsky ©   (2008-04-06 14:14) [9]

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


 
{RASkov} ©   (2008-04-06 14:20) [10]

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

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


 
Ega23 ©   (2008-04-06 14:50) [11]


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


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


 
Anatoly Podgoretsky ©   (2008-04-06 15:27) [12]

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

YourGod


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

)))))

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

На самом деле это "мойГод" от слова Год.. имхо дата, тобишь например 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? ) Любопытно ) Позновательно )



Страницы: 1 вся ветка

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

Наверх




Память: 0.54 MB
Время: 0.015 c
2-1207510572
cyber-pilot
2008-04-06 23:36
2008.05.04
Работа с файлами


2-1207587747
assassin8899
2008-04-07 21:02
2008.05.04
добавление в DBGrid


2-1207499830
savyhinst
2008-04-06 20:37
2008.05.04
BPL


2-1207412150
Dr.Andrew
2008-04-05 20:15
2008.05.04
Почему не работает конструкция case of и как решить проблему?


3-1196670098
Натуля
2007-12-03 11:21
2008.05.04
SQL Server - ADO Connection - Delphi