![]() |
| ||
|
|
Новости |
Поиск |
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;
VirEx (2011-05-26 15:25:00) [21]>Dennis I. Komarov © (26.05.11 15:19) [26]
>
> > однако в цикле удаления желательна проверка: если из базы
> > удалена запись привязаная к ноду, тогда ноду нужно удалить
>
> Той записи уже может и не быть вовсе, а нод при этом еще оприсован...
о_О каким образом если удаляет он только через дерево?
Dennis I. Komarov (2011-05-26 15:19:00) [22]
> однако в цикле удаления желательна проверка: если из базы
> удалена запись привязаная к ноду, тогда ноду нужно удалить
Той записи уже может и не быть вовсе, а нод при этом еще оприсован...
VirEx (2011-05-26 14:32:00) [23]>KSergey © (26.05.11 14:14) [21]
так он я так понимаю в дереве при нажатии на ноде помечает на удаление (шрифт нода краснеет), а затем отдельной кнопкой удаляет помеченые, что и приведено в моем коде
однако в цикле удаления желательна проверка: если из базы удалена запись привязаная к ноду, тогда ноду нужно удалить
Ega23 (2011-05-26 14:27:00) [24]
> Только там громадное количество данных и прорисовка снова
> занимает много времени.
TreeView.Items.BeginUpdate;
try
// Работа с узлами
finally
TreeView.Items.EndUpdate;
end;
Ega23 (2011-05-26 14:25:00) [25]
> Их еще удалять надо при удалении ноды дерева...
Нет проблем.
type
TMyTreeNode = class (TTreeNode)
public
destructor Destroy; override;
end;
destructor TMyTreeNode.Destroy;
begin
if (Data <> nil) then
TObject(Data).Free;
end;
procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView;
var NodeClass: TTreeNodeClass);
begin
NodeClass := TMyTreeNode;
end;
Ну и следить внимательно, чтобы в data действительно объект сидел.
Kirat (2011-05-26 14:23:00) [26]Так в БД редактируется. Только там громадное количество данных и прорисовка снова занимает много времени. Это конечно не глобально, но хотелось бы чтобы быстрее. А на данный момент я удаляю все дерево и заново его делаю =(!!!
KSergey (2011-05-26 14:14:00) [27]> MsGuns © (26.05.11 13:02) [19]
> >VirEx © (25.05.11 17:31) [12]
Их еще удалять надо при удалении ноды дерева...
Dennis I. Komarov (2011-05-26 13:21:00) [28]
> Kirat © (26.05.11 10:55) [18]
Дык сперва надо БД редактировать, а уж только потом ГУИ дергать...
MsGuns (2011-05-26 13:02:00) [29]>VirEx © (25.05.11 17:31) [12]
Хороший код, классы там всякие.. Еще оракл до кучи и цены не будет решению :)
Kirat (2011-05-26 10:55:00) [30]Спасибо большое! А вот вопрос а как мне всю ветку поменять? на первом я то помечу что он Delete, а в остальных ветках тоже надо так сделать! Ато пока только прорисовка получается! (Данные попадают из БД)
VirEx (2011-05-25 21:13:00) [31]>Ega23 © (25.05.11 20:29) [16]
спасибо кэп :)
утратил навыки
Ega23 (2011-05-25 20:29:00) [32]
itm:=TMyItem.Create();
node.Data := Pointer(itm);
Зачем к указателю указатель приводишь?
begin
i:=0;
while i<TreeView1.items.Count-1 do begin
if TMyItem(TreeView1.items[i].Data).isDelete then // удаляем этот элемент
i:=i+1;
end;
OMG
for i := TreeView1.items.Count - 1 downto 0 do
begin
И хоть сами узлы удаляй. Только для этого нефигово Items.BeginUpdate перед циклом сделать, цикл в try..finally обернуть, в finally - Items.EndUpdate;
end;
Dennis I. Komarov (2011-05-25 18:08:00) [33]а не надо...
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
VirEx (2011-05-25 18:05:00) [34]да не помню какой, я дельфи уж год почти не запускал
Dennis I. Komarov (2011-05-25 18:01:00) [35]Кто сказал, что черный по дефолту?
VirEx (2011-05-25 17:31:00) [36]// делаем объект с нужными свойствами
type
TMyItem=class
public
isDelete:Boolean;
//можно добавить дополнительные свойства
end;
-----
// добавляем в дерево объекты
var
itm:TMyItem;
begin
node:=TreeView1.Items.AddChild(nil,'text1');
itm:=TMyItem.Create();
node.Data := Pointer(itm);
node:=TreeView1.Items.AddChild(nil,'text2');
itm:=TMyItem.Create();
node.Data := Pointer(itm);
----
//при щелчке на элементе делаем его удаляемым или наоборот
TreeView1.OnItemClick(Sender: TObject; Button: TMouseButton; Node: TTreeNode; const Pt: TPoint)
begin
TMyItem(Node.Data).isDelete = not TMyItem(Node.Data).isDelete;
----
//в прорисовке каждого элемента
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if TMyItem(Node.Data).isDelete then Sender.Canvas.Font.Color:= clRed
else
Sender.Canvas.Font.Color:= clBlack;
end;
//где-то в коде при нажатии кнопки удаляем все элементы помеченные на удаление в цикле
//притом цикл должен быть не for а while!
begin
i:=0;
while i<TreeView1.items.Count-1 do begin
if TMyItem(TreeView1.items[i].Data).isDelete then // удаляем этот элемент
i:=i+1;
end;
Dennis I. Komarov (2011-05-25 15:20:00) [37]
> Если есть другой вариант то я не против посмотреть.
За чем другой? Просто я думаю, что он Вам не понятен (судя по [0]). Если это не так, то можно только порадоваться за Вас...
Kirat (2011-05-25 14:05:00) [38]Мне надо пометить другим цветом те строки, которые как бы помеченые на удаление. Если есть другой вариант то я не против посмотреть.
Dennis I. Komarov (2011-05-25 13:52:00) [39]Только вряд ли твой Pointer(0) будет понят...
Да и бросал бы уж туда весь TColor, к чему извращения if?
Kirat (2011-05-25 13:49:00) [40]Грамадное спасибо =)! Почему я сам к єтому не пришел =(?