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

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

TreeView Цветные строки [D7, XP]


Страницы:   1 2 3

kirat ©   (2011-05-25 12:29:00) 

Подскажите пожалуйста как сделать цветные строки при их создании?
....
public
   izm:integer;
 end;
.....

procedure TForm1.Button1Click(Sender: TObject);
var
node:TTreeNode;
begin
izm:=1;
node:=TreeView1.Items.AddChild(nil,'sdf');
izm:=0;
node:=TreeView1.Items.AddChild(nil,'sdsdfsdf');
izm:=1;
node:=TreeView1.Items.AddChild(node,'sdfsdfs');
izm:=0;
node:=TreeView1.Items.AddChild(nil,'sdfsdf,');
izm:=0;
node:=TreeView1.Items.AddChild(node,'sdf');
izm:=0;
node:=TreeView1.Items.AddChild(node,'sdf');

end;

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
 Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if izm =1 then Sender.Canvas.Font.Color:= clRed;
end;


Kirat   (2011-05-27 14:28:00) [1]

Тьфу. А я то думаю, то ли лыжи не едут то ли...
Спасибо!


VirEx   (2011-05-27 14:20:00) [2]

>kirat ©   (27.05.11 14:14) [45]

см. [39], это абстракция, в дельфи этого нет, просто для наглядности взял из проекта для андроида java классы и методы
переделайте для себя


kirat   (2011-05-27 14:14:00) [3]

Ну я SQL знаю, и довольно не плохо! Но не могу понять db.rawQuery.
Я выборку делаю так:
QueryGroup.Close;
QueryGroup.SQL.Clear;
QueryGroup.SQL.Add('SELECT NAME, ID_ARTICLES_GROUP, PARENT_ID_ARTICLES_GROUP, DEL FROM GROUP');
QueryGroup.Open;


VirEx   (2011-05-27 12:06:00) [4]

>Kirat ©   (27.05.11 11:56) [43]
> Не могу понять "db.rawQuery('Select title,id from table;');" Вот єто что?


это выбор двух полей: заголовок title и уникальный идентификатор id


Kirat   (2011-05-27 11:56:00) [5]

Не могу понять "db.rawQuery('Select title,id from table;');" Вот єто что?


Ega23   (2011-05-27 10:36:00) [6]


> Олег, ну ты же при этом не отрисовывал все ноды :)


Ну не FullExpand, конечно, но что-то отрисовывалось.


Dennis I. Komarov   (2011-05-27 09:38:00) [7]


> Ega23 ©   (26.05.11 20:04) [38]
> > Конечно да, эдак так штук 10000 нодов :) Юзеры расстреляют.
> Я как-то давно TDBTreeView писал. Дерево на ~ 2000 узлов
> строилось около полутора секунд (включая время отработки
> ХП на удалённом сервере БД)

Олег, ну ты же при этом не отрисовывал все ноды :)


virex(work)   (2011-05-27 06:41:00) [8]

и еще, в процедуре удаления помеченных нодов
if not Assigned(itm) then continue;
лучше удалить ноду, т.к. она в любом случае "не рабочая" без объекта TMyItem

if not Assigned(itm) then begin
 Application.ProcessMessages;
 TreeView.Items.BeginUpdate;
 try
   TreeView.Items.Delete(i);
 finally
   TreeView.Items.EndUpdate;
 end;//try
 continue;
end;


virex(work)   (2011-05-27 06:34:00) [9]


// делаем объект с нужными свойствами
type
TMyItem=class
public
  isDelete:Boolean;
  id:String;
end;
-----

//добавляем в дерево объекты
var
itm:TMyItem;
i:Integer;
title:String;
cursor:TCursor;
begin
//делаем выборку нужных записей из базы
cursor=db.rawQuery('Select title,id from table;');
cursor.moveToFirst(); //перемещаемся на первую запись
for i:=0 to cursor.getCount-1  do begin
//здесь в цикле желательно проверять, существует ли запись которую мы хотим извлечь из базы
//возможно она уже удалена из другого экземпляра программы, другим юзером

title:=cursor.getString(0);
node:=TreeView1.Items.AddChild(nil,title);
itm:=TMyItem.Create();
itm.isDelete:=false; //не удалять
itm.id:=cursor.getString(1);//берем из базы значение ключевого поля по которому будем удалять
node.Data := itm;
cursor.moveToNext(); //следующая запись
end;//for
end;
-----

//процедура удаления помеченных нодов
var
i:integer;
itm:TMyItem;
begin
for i := TreeView1.items.Count - 1 downto 0 do begin
itm:=TMyItem(TreeView1.items[i].Data);
if not Assigned(itm) then continue;//если объекта нет - пропускаем... break или continue? точно не помню как пропустить выполнение текущей итерации в цикле

//помечен на удаление?
if itm.isDelete then
 //удаляем запись в таблице
 if db.ExecSQL(format('Delete from table where id="%s";',itm.id)) then begin
  //вобще лучше удалять в отдельном потоке, но для простоты, чтобы не "замерзало" окно
  Application.ProcessMessages;
  //для плавной перересовки дерева
  TreeView.Items.BeginUpdate;
  try
  //тут удаляем ноду
  TreeView.Items.Delete(i); //вроде так удаляется?
  //точно не помню, вроде объект нужно вручную удалять, если так, тогда
   try
    itm.Free;
   finally
   end;
  finally
   TreeView.Items.EndUpdate;
  end;//try
 end;//if db.ExecSQL
end;//for
end;


p/s/ объекты db:TDataBase и cursor:TCursor абстрактные классы, для примера (db.ExecSQL, db.rawQuery, cursor.moveToFirst(), cursor.moveToNext(), cursor.getString(0) - это из java для android :) )


Ega23   (2011-05-26 20:04:00) [10]


> Конечно да, эдак так штук 10000 нодов :) Юзеры расстреляют.


Я как-то давно TDBTreeView писал. Дерево на ~ 2000 узлов строилось около полутора секунд (включая время отработки ХП на удалённом сервере БД)


Kirat   (2011-05-26 18:26:00) [11]

при 1000 значений пол секунды примерно. Что максимуму (теореотически) может быть 300. Правда хотелось бы быстрее


Amoeba_   (2011-05-26 17:46:00) [12]


> Юзеры расстреляют...

Не успеют. От икоты сам помрет.


Dennis I. Komarov   (2011-05-26 17:38:00) [13]


> Kirat ©   (26.05.11 16:58) [31]
> Понял! Лучше перерисовать.

Конечно да, эдак так штук 10000 нодов :) Юзеры расстреляют...


Ega23   (2011-05-26 17:22:00) [14]


> а, ну так ежели баз пользуют несколько экземпляров программы,
>  должнен быть реализован механизм оповещающий об изменении
> таблицы дабы обновить дерево


Нажал "Обновить" - обновилось.
Нажал "Удалить" - выполнилось Delete from table where id=
Ну а если уже удалено - ничего страшного.


VirEx   (2011-05-26 17:22:00) [15]

>Kirat ©   (26.05.11 16:20) [29]

o_O


VirEx   (2011-05-26 17:20:00) [16]

>Dennis I. Komarov ©   (26.05.11 15:31) [28]

а, ну так ежели баз пользуют несколько экземпляров программы, должнен быть реализован механизм оповещающий об изменении таблицы дабы обновить дерево


Kirat   (2011-05-26 16:58:00) [17]

Понял! Лучше перерисовать.


Dennis I. Komarov   (2011-05-26 16:30:00) [18]


> Kirat ©   (26.05.11 16:20) [29]

Ага, и потом рекурсией на равне с нодами удаляешь по одной записи на нод...
проект в помойку...


Kirat   (2011-05-26 16:20:00) [19]

Но перед єтим надо всей ветке передать isDelete=true


Dennis I. Komarov   (2011-05-26 15:31:00) [20]

Да мало ли желающих...


Страницы:   1 2 3

Наверх

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