Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2015, 00:06   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию DbGrid + TreeView + CheckBox

Здравствуйте, помогите пожалуйста подобрать компонент для оформления в стиле DbGrid + TreeView + CheckBox.
У меня 2 таблицы
1. G (Группы товаров) с полями
a. ID
b. NAIM
2. T (Товары) с полями
a. ID
b. G_ID
c. NAIM
d. ….
Нужно получить TreeView, но так, чтобы справа был GRID c информацией о товаре, а каждого элемента TreeView был CheckBox. При этом если выделялся головной CheckBox, то выделялись все товары группы, а если выделено только несколько товаров группы, то головной CheckBox закрашивался сероватым. Примерно так как я показал на картинке ниже.

Пробовал использовать свойство TreeView у компонента DbGridEh из EhLib, но там, как я понял из примера нужно, чтобы и Группы и Товары лежали в одной таблице и еще там нет CheckBox’a с нужными мне свойствами.
Спасибо
tarakan1983 вне форума Ответить с цитированием
Старый 04.06.2015, 01:38   #2
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Возможно https://community.devexpress.com/blo...-features.aspx
ДралсяСошибками вне форума Ответить с цитированием
Старый 04.06.2015, 03:19   #3
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от ДралсяСошибками Посмотреть сообщение
Очень бы хотелось научиться пользоваться, но второй день ничего не получается, да и стоимость его ого-го...
tarakan1983 вне форума Ответить с цитированием
Старый 04.06.2015, 09:20   #4
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 158
Смех Компонент легкий, даже я освоил

Был у меня похожая ситуация, использовал бесплатный Virtual Treeview
Демки качаем отсюда
Документацию на русском языке с примерами берем здесь
SQLPowerUser вне форума Ответить с цитированием
Старый 04.06.2015, 17:46   #5
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от SQLPowerUser Посмотреть сообщение
Был у меня похожая ситуация, использовал бесплатный Virtual Treeview
Демки качаем отсюда
Документацию на русском языке с примерами берем здесь
Отлично, примного благодарен за подробный ответ, сегодня начну изучение
tarakan1983 вне форума Ответить с цитированием
Старый 08.06.2015, 02:12   #6
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от SQLPowerUser Посмотреть сообщение
Был у меня похожая ситуация, использовал бесплатный Virtual Treeview
Демки качаем отсюда
Документацию на русском языке с примерами берем здесь
Вроде разобрался с компонентом, только одно пока не допонял, может подскажете?
Как сделать регистронезависимый поиск с фильтрацией?
Т.е., например, по мере того как я набираю текст в Edit1, дерево уменьшается и отображаются только те данные которые отвечают условиям набранного текста, говоря языком SQL примерно так
Код:
SELECT * FROM MYTABLE WHERE UPPER(MYTABLE.NAME) LIKE UPPER(%ля-ля-ля%)
Надеюсь понятно обяснил

Последний раз редактировалось tarakan1983; 08.06.2015 в 07:29.
tarakan1983 вне форума Ответить с цитированием
Старый 08.06.2015, 14:54   #7
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 158
Лампочка

Из работающего проекта. Тут дерево имеет 2 уровня Проект - Сотрудник. Поиск ведется или по уровню 0 или по уровню 1 (зависит от текущего выбора в обычном комбобоксе cbo_LookupField.ItemIndex)
Код:
function MyCountVisibleChildren(Node: PVirtualNode): Cardinal;
begin
  Result := 0;

  Node := Node.FirstChild;

  while Assigned(Node) do
  begin
    if vsVisible in Node.States then
      Inc(Result, MyCountVisibleChildren(Node) + 1);
    Node := Node.NextSibling;
  end;
end; // MyCountVisibleChildren


procedure Tfrm_Main.txt_LookupChange(Sender: TObject);
var
  CurrentNode: PVirtualNode;
  s: string;
begin
  if Trim(txt_Lookup.Text) = '' then
  begin
    RebuildTree;
    exit;
  end;

  CurrentNode := vt.GetFirst;
  if not Assigned(CurrentNode) then exit;

  vt.BeginUpdate;

  repeat
    s := vt.Text[CurrentNode, 5];
    if vt.GetNodeLevel(CurrentNode) = cbo_LookupField.ItemIndex then
      vt.IsVisible[CurrentNode] := Pos(AnsiUpperCase(txt_Lookup.Text), AnsiUpperCase(s)) > 0;

    CurrentNode := vt.GetNextNoInit(CurrentNode);
  until
    CurrentNode = nil;

  // Если поиск по проекту
  if cbo_LookupField.ItemIndex = 0 then
    vt.FullCollapse(nil)
  else // если поиск по сотруднику
  begin
    // Надо пробежаться по крневым узлам дерева и скрыть те, у которых нет видимых дочерних узлов
    CurrentNode := vt.GetFirst;
    if Assigned(CurrentNode) then
    begin
      repeat
        vt.IsVisible[CurrentNode] := (MyCountVisibleChildren(CurrentNode) > 0);
        CurrentNode := vt.GetNextSibling(CurrentNode);
      until
        CurrentNode = nil;
    end;

    vt.FullExpand(nil);
  end; // else если поиск по сотруднику

  vt.EndUpdate;
end; // txt_LookupChange
SQLPowerUser вне форума Ответить с цитированием
Старый 08.06.2015, 15:00   #8
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Спасибо, я нашел еще один
Код:
type
  // Данные, прикрепленные к узлу 
  PRec = ^TRec; 
  TRec = record
    Name: string; // Caption нода 
    // Могут быть и другие параметры 
  end; 
  
  PTreeSearch = ^TTreeSearch; 
  TTreeSearch = record
    ClearSearch: boolean; 
    Name: string; 
  end; 
    
// Рекурсивный обход дерева 
procedure FindInTree( Tree: TVirtualStringTree; Node: PVirtualNode; 
  Search: TTreeSearch; var Hide: boolean ); 
var
  p: PRec; 
  flag, recurse: boolean; 
begin
   flag := false; 
   repeat
      if Tree.GetNodeLevel( Node ) = 0 then
         flag := false; 
  
      recurse := false; 
      p := Tree.GetNodeData( Node ); 
      if Assigned( p ) then
      begin
         if Search.ClearSearch then
            Hide := false
         else
            // Проверка на соответствие фильтру 
            Hide := Pos( AnsiLowerCase( Search.Name ), AnsiLowerCase( p^.Name ) ) = 0; 
         if not Hide then
            flag := true; 
  
         if ( Node.ChildCount > 0 ) and ( Tree.GetFirstChild( Node ) <> nil ) then
         begin
            recurse := true; 
            FindInTree( Tree, Tree.GetFirstChild( Node ), Search, Hide ); 
         end; 
  
         if flag and recurse then
         begin
            Node.States := Node.States - [vsHidden]; 
            flag := true; 
         end
         else
            if Hide then
               Node.States := Node.States + [vsHidden] 
            else
               Node.States := Node.States - [vsHidden]; 
  
         Node := Node.NextSibling; 
      end; 
   until Node = nil; 
   if flag then
      Hide := false; 
end; 
  
// Пример вызова процедуры 
procedure TForm1.Button1Click(Sender: TObject); 
var
  ts: TTreeSearch; 
  Hide: boolean; 
begin
   case Length( Edit1.Text ) of
      0: begin
         ts.ClearSearch := true; 
      end; 
      else
      begin
         ts.ClearSearch := false; 
         ts.Name := Edit1.Text; 
      end; 
   end; 
   FindInTree( VirtualStringTree1, VirtualStringTree1.GetFirstChild( nil ), ts, Hide ); 
   VirtualStringTree1.Invalidate; 
end; 
  
// P.S. 
// Обнаружен неприятный баг у VirtualStringTree версии 4.8.6 
// После скрытия/отображения узла сбивается максимальное значение у вертикального скролла. 
// Способа исправить этот баг найти не удалось. Тестировалось на Delphi 2010. 
// Тест на Delphi 2007 с VirtualStringTree версии 4.7.0 такой проблемы не выявил.
Может кто сможет исправить указанный баг?
P.S. Использую последнюю версию, но баг также наблюдается

Цитата:
Из работающего проекта...
Спасибо большое, Ваш поиск без глюков. Не подскажете еще такой момент, у меня 2 узла : группа товара и наименование товара, поиск идет по наименованию товара, ненужные позиции скрываются, все хорошо, но если поставить checkbox группы в true, то он проставляет всем товарам checkbox в true, даже скрытым, а как сделать, чтобы при выделении группы он проставлял checkbox в true только видимым товарам?

Последний раз редактировалось Stilet; 04.12.2015 в 10:28.
tarakan1983 вне форума Ответить с цитированием
Старый 10.11.2015, 14:56   #9
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 158
Стрелка Так работает

Здесь в событии OnInitNode, надо поставить Node.CheckType := ctCheckBox;
А галочки обрабатывать уже в событии OnChecked. Проект прилагаю.
Вложения
Тип файла: zip 01. Фильтрация.zip (5.0 Кб, 44 просмотров)
SQLPowerUser вне форума Ответить с цитированием
Старый 10.11.2015, 16:41   #10
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от SQLPowerUser Посмотреть сообщение
Здесь в событии OnInitNode, надо поставить Node.CheckType := ctCheckBox;
А галочки обрабатывать уже в событии OnChecked. Проект прилагаю.
Ну прямо не знаю как Вас благодарить, просто то что надо.
Осталось только ускорить загрузку данных из датасета и будет все зашибись!!!!
tarakan1983 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TreeView с Checkbox bilibian Общие вопросы Delphi 11 08.08.2014 15:36
TreeView с CheckBox"ом для C++ Builder Freeman-c Помощь студентам 0 31.07.2012 14:00
CheckBox в DBGrid Impuls1989 Общие вопросы Delphi 4 07.08.2010 14:27
checkbox & dbgrid Mihailhome БД в Delphi 4 19.05.2009 08:42
Кастомизация состояний treeView checkBox NIPI Общие вопросы .NET 0 23.04.2008 07:14