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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как найти размеры "галочки", в TreeView с TVS_CHECKBOXES 
V
    Опции темы
Тутанхамец
Дата 21.1.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Здравствуйте. Есть TreeView с TVS_CHECKBOXES. Мне нужно обрабатывать снятие/установку "галочки". Ничего кроме вот этого в голову не пришло:
Код

procedure TForm1.tvWindowsMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  node:Ttreenode;
  i,h:DWORD;
begin
  node:=tvwindows.GetNodeAt(x,y);
  if node<>nil then begin
    if ((node.DisplayRect(true).left-x<15) and  (node.DisplayRect(true).left-x>0)) then begin
    {Тут выполняется код, который надо выполнять, если юзер поставил/снял галочку} 
     end;
  end;
end;


Это плохой код. Потому что длина чекбокса без особых причин принимается за 15. Но вдруг она по каким-то причинам станет другой? В общем, как узнать длину этого квадратика с галочкой?
PM MAIL   Вверх
Sunvas
Дата 21.1.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



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

Цитата(Тутанхамец @  21.1.2007,  11:20 Найти цитируемый пост)
 TreeView с TVS_CHECKBOXES

А куда это свойсво пихать - что-то не найду. У тебя стандартный компонент? Если ответишь на это попробую тебе набросать код.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Тутанхамец
Дата 21.1.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Некоторое облегчение дает такой вариант:
Код

procedure TForm1.tvWindowsMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  node:Ttreenode;
  i,h:DWORD;
begin
  node:=tvwindows.GetNodeAt(x,y);
  if node<>nil then begin


    if ((tvwindows.Indent+2<x) and  (node.DisplayRect(true).left>x)) then begin  //измененная строка

      i:=node.absoluteindex;
      h:=strtoint(handles[i]);
      if ischeckednode(node) then
        SetWindowPos (h, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
      else
        SetWindowPos (h, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE);
          end;
  end;
end;


Но это всё равно не совсем то, что хотелось бы. Лучше было бы узнавать размер чекбокса.

Добавлено @ 11:38 
Блин, про клаву я и не подумал...

ЧТоб у treeview появились чекбоксы я делаю так:
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowLong(TvWindows.Handle, GWL_STYLE, GetWindowLong(TvWindows.Handle, GWL_STYLE) or TVS_CHECKBOXES);
end;


Добавлено @ 11:38 
В смысле, компонент стандартный. TTreeView.
PM MAIL   Вверх
Sunvas
Дата 21.1.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Цитата(Тутанхамец @  21.1.2007,  11:37 Найти цитируемый пост)
TVS_CHECKBOXES

А откуда эта константа?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Тутанхамец
Дата 21.1.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Модуль CommCtrl. 
PM MAIL   Вверх
Sunvas
Дата 21.1.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Общем поэкспериментировал я над твоим кодом. Довольно интересно было, но ничего лучше твоего не получилось.
Вот только тебе код как узнать ширину Check-a
Код

var
  b:Bitmap;
  CheckWidth: word;
begin
GetObject(LoadBitmap(0, PChar(OBM_CHECKBOXES)),SizeOf(BITMAP),@b);
CheckWidth := b.bmWidth div 4;


Следовательно тебе надо проверять. Область нажатия мыши. Думаю сам справишься.
И не забываей о пробеле.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Тутанхамец
Дата 21.1.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Спасибо, Sunvassmile

Мой код с indent'ом не будет работать с любым Node, который находитcя HE в корневухе TreeView. У нодов-потомков отступ от левого края будет не один indent, а несколько, но неизвестно сколько именно. К счастью, у меня все ноды именно в корневухе. 

Я правильно понял, что твой код выдает ширину ЛЮБОГО стандартного чекбокса в системе? Или только чекбокса в моей проге?




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


Соль и сахар
****


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

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



Цитата(Тутанхамец @  21.1.2007,  17:41 Найти цитируемый пост)
код выдает ширину ЛЮБОГО стандартного чекбокса в системе

По идее так.
Цитата(Тутанхамец @  21.1.2007,  17:41 Найти цитируемый пост)
К счастью, у меня все ноды именно в корневухе. 

Тогда зачем тебе дерево, если ты используешь только корневые ноды?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Тутанхамец
Дата 21.1.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Цитата

Тогда зачем тебе дерево, если ты используешь только корневые ноды? 


Потому что сначала предполагал, что эти ноды будут не только корневые. А еще потому, что в дереве можно к ноду добавлять маленькую картинку, а как это сделать с CheckListBox я не нашел. 
PM MAIL   Вверх
aktuba
Дата 21.1.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

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



Тутанхамец, а не лучше вместо стандартного дерева использовать VirtualTreeView?
И с отображением изображений проблем нет, и с checkbox-ами тоже, да и на будущее, если вдруг понадобиться использовать древовидную структуру, полезно...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Тутанхамец
Дата 21.1.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Наверное проще, но неохота юзать нестандартные компоненты. Работать приходится на том компе, который в данный момент не занят. Дельфа-то на них на всех стоит, а вот каждый раз устанавливать доп. компоненты неудобно. 
PM MAIL   Вверх
Sunvas
Дата 21.1.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Тутанхамец, а тогда чем тебя CheckListBox не устаивает?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Тутанхамец
Дата 21.1.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Тем, что я не нашел у CheckListBox свойства Images и решил, что туда нельзя впихнуть картинку. Хотя именно сейчас читаю про owner-draw и потихоньку понимаю, как ее туда впихнуть. 

Ребята, большое спасибо. Похоже, я выбрал не тот путь решения задачи. Вопрос закрыт. 


PM MAIL   Вверх
~FoX~
Дата 15.2.2007, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

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



Цитата(Тутанхамец @  21.1.2007,  19:07 Найти цитируемый пост)
ем, что я не нашел у CheckListBox свойства Images и решил, что туда нельзя впихнуть картинку.

Может уже и поздно, однако:
Код

procedure TForm1.CheckListBox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  Bitmap: TBitmap;
  Offset: Integer;
  BMPRect: TRect;
begin
  with (Control as TCheckListBox).Canvas do
  begin
    FillRect(Rect);
    Bitmap := TBitmap.Create;

   ImageList1.GetBitmap(0, Bitmap);
    Offset := 0;
    if Bitmap <> nil then

    begin
      BMPRect := Bounds(Rect.Left+2, Rect.Top+2, (Rect.Bottom-Rect.Top-2), Rect.Bottom-Rect.Top-2);
      BrushCopy(BMPRect,Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height),
      Bitmap.Canvas.Pixels[0, Bitmap.Height-1]);
      Offset := (Rect.Bottom-Rect.Top+1)+3;
    end;
    TextOut(Rect.Left+Offset, Rect.Top, CheckListBox1.Items[index]);
    Bitmap.Free;
  end;

end;



--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Тутанхамец
Дата 15.2.2007, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Вообще-то поздно, но все равно спасибо. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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