Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Select in TreeView, Как определить выделенный елемент... 
V
    Опции темы
Chydik
Дата 6.6.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Народ помогите пожалусто с определением выделенного елемент в TreeView в режиме OwnerDraw.

Мой код:
Код

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
  var
  NodeRect : TRect;
  bm:TBitmap;
begin

bm:=TBitmap.Create;
bm.Width:=4;
bm.Height:=16;
    ImageList2.Draw(bm.Canvas,0,0,2,true);

  DefaultDraw := False;
  NodeRect := Node.DisplayRect( false );
  NodeRect.Left := NodeRect.Left + ( Node.Level * TreeView1.Indent );
  TreeView1.Canvas.Brush.Style:=bsClear;

  TreeView1.Images.Draw( TreeView1.Canvas, NodeRect.Left, NodeRect.Top, Node.ImageIndex );
if cdsselected in state then
Begin
      TreeView1.Font.Style := [fsBold,fsUnderline];
      TreeView1.Canvas.TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
end
      else
      Begin
      TreeView1.Font.Style := [fsBold];
           TreeView1.Canvas.TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
      end;
end;




Данный  вариант не помогает.
Код

if cdsselected in state then

Надо определить выделен ли елемент и нарисоваеть его с подчеркиванием
PM MAIL   Вверх
Keeper89
Дата 6.6.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Код

if TreeView1.Selected = Node then
  // Подчеркиваем

?


--------------------
PM MAIL WWW   Вверх
Chydik
Дата 6.6.2009, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Немного не правильно выразился.
Виноват Сорри.

Дело в том что если определяется выделенный елемент то идет зацикленная перерисовка.

А если енто все использовать OnClick (т.е установка стиля для выделения), то стиль меняется для всех елементов.

У меня стоит темносиний цвет текста и при клике, без опредиления выбранного елемента

Код

if cdsselected in state then
Begin
      TreeView1.Font.Style := [fsBold,fsUnderline];
      TreeView1.Canvas.TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
end
      else
      Begin
      TreeView1.Font.Style := [fsBold];
           TreeView1.Canvas.TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
      end;

, текст становиться черным
Но где происходит даная обработка выделения я никак не пойму.
PM MAIL   Вверх
Keeper89
Дата 6.6.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



У меня выделение работает просто вот так:
Код

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if cdsSelected in State then
    Sender.Canvas.Font.Style := [fsBold,fsUnderline];
end;


Это сообщение отредактировал(а) Keeper89 - 6.6.2009, 20:53


--------------------
PM MAIL WWW   Вверх
Chydik
Дата 6.6.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Да но енто при условии что DefaultDraw := True;, а меня в False т.к. не нашел другого выхода для прозоачности текста(в TreeView используется заливка фона)

PM MAIL   Вверх
Keeper89
Дата 6.6.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Опиши задачу подробнее, может есть способ получше, чем у тебя.


--------------------
PM MAIL WWW   Вверх
Chydik
Дата 6.6.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



В принципе весь основной код я написал.

Еще использую

Код

 procedure TTreeView.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
 begin
   Msg.Result := 1;           // Prevent background from getting erased
end;



Чтоб небыло мерцаний при перерисовке елементов

В Событии TreeView1CustomDraw просто канва заливается градиентой

Вот в принципе и все.

Код

 TreeView1.Canvas.Brush.Style:=bsClear;


Использую для прозрачности заливки елементов(при DefaultDraw=ture) енто никак не смог осущетвить.

И хотелось бы чтоб при клике на елемент он подчеркивался.
(Енто то счем хотелось бы пока разобраться, т.к енто самый простой вариант выделения.)

Это сообщение отредактировал(а) Chydik - 6.6.2009, 22:12
PM MAIL   Вверх
Keeper89
Дата 7.6.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Вот, выделяется как нужно:
Код

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
  var
  NodeRect : TRect;
  bm:TBitmap;
begin
  with Sender.Canvas do
  begin
    bm := TBitmap.Create;
    bm.Width := 4;
    bm.Height := 16;
    //ImageList2.Draw(bm.Canvas,0,0,2,true);
    DefaultDraw := False;
    NodeRect := Node.DisplayRect( false );
    NodeRect.Left := NodeRect.Left + ( Node.Level * TreeView1.Indent );
    Brush.Style := bsClear;
    //TreeView1.Images.Draw( TreeView1.Canvas, NodeRect.Left, NodeRect.Top, Node.ImageIndex );
    if cdsSelected in State then
    begin
      Font.Color := clBlack;
      Font.Style := [fsBold,fsUnderline];
      TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
    end
    else
    begin
      TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
    end;
  end;
end;




--------------------
PM MAIL WWW   Вверх
Chydik
Дата 7.6.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Огромное спасибо. smile 
ЗАработало. smile 
Т.е. получается проьлема у меня была в том что параметры шрифта я менял не для канвы, а не посредственно шрифта ТриВиьюва.

Добавлено через 10 минут и 15 секунд
ДА и еще

Код

    if cdsSelected in State then
    begin
      Font.Color := clBlack;
      Font.Style := [fsBold,fsUnderline];
          TreeView1.Images.Draw( TreeView1.Canvas, NodeRect.Left, NodeRect.Top, Node.ImageIndex );
      TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
    end
    else
    begin
        TreeView1.Images.Draw( TreeView1.Canvas, NodeRect.Left, NodeRect.Top, Node.ImageIndex );
      TextOut( NodeRect.Left + 2+16, NodeRect.Top + 2, Node.Text );
    end;

имеджы надо добавлять при проверки выделения.
Код


TreeView1.Images.Draw(TreeView1.Canvas, NodeRect.Left, NodeRect.Top, Node.ImageIndex );


PM MAIL   Вверх
Keeper89
Дата 7.6.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Цитата(Chydik @  7.6.2009,  18:35 Найти цитируемый пост)
имеджы надо добавлять при проверки выделения.

Их я просто закомментировал, т.е. иконок не было. smile


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1239 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.