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