![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Недопонимания с 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, почему не перебиралась?
Проде по смыслу правильно было...