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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2013, 18:03   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос EasyListView - вставка своего компонента куда-нибудь, или аналог компонента ListView

Доброго времени суток!

Как вставлять в этом компонент др. компоненты хоть куда-нибудь?

Или подскажите что-то похожее со след. функциями:
1. Группировка(сворачиваемая, разворачиваемая)
2. Сортировка групп, сортировка в группе отдельно от остального.
3. Вставка своих элементов управления.

Последний раз редактировалось Человек_Борща; 15.01.2013 в 18:36.
Человек_Борща вне форума Ответить с цитированием
Старый 15.01.2013, 23:48   #2
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Должны быть соответствующие события для рисования ноды. Рисуете вы например ноду самостоятельно и вот нужно разместить в ноде кнопку например - создаете кнопку настраиваете ее как вам нужно, указываете top, left и в качестве парента назначаете данный компонент для отображения списка.
Довольно часто сталкиваюсь с компонентом VirtualTreeview (а вот кстати и ссылки я вам на мануалы приводил), то в данном компоненте все это добро можно делать в событии AfterPaint()...так же и вот сюда можно еще добавить вызов Change().
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 16.01.2013, 13:29   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

VT все же проще как мне кажется.
Можете подсказать, как мне сделать VT похожим на ListView?
И как в колонку вставлять свой редактор/компонент?(Выпад. список, поле редактирования(актуально оно для subitems?))

Ситуация такая:
Есть списки TList. Они хранят объекты, объекты содержат строки и др. объекты а так же методы, функции, свойства и переменные.
Есть ситуации когда объекты одного списка это группы, а элементы другого списка - дочерние элементы групп(ы).

Вот тут мне категорически удобно разворачивать и сворачивать.

Ближе всего мне TListView, там есть все что надо:
1. Удобное и простое отображение и хранение данных
2. Группировка

Нету плюсиков и минусиков чтобы прятать дочерние элементы групп и это плохо.

Поэтому на загуглил и нагуглил EasyListView, который схож с VirtualTree, оказалось не только родство но и тем фактом, что документации вообще 0.
Пришлось его откинуть и вернуться к VirtualTree.

Возникают вопросы:
1. как хранить в Node объекты списка?
2. Как отображать в subitem'ах какого-либо Node, в такой-то колонке, мой компонент(кнопка, поле ввода, ещё что-то)?

Само VirtualTree выступает в роли редактора и рождается только тогда, когда пользователь открывает окно редактора какого-то списка.
Из этого следует что дерево передается классу списка, и он его заполняет.

Данные сами по себе существуют всегда, только если пользователь, редактором не прибил какой-то объект сам.

Далее сортировка:
Допустим у нас есть Tree в котором список групп и дочерних элементов к ним.

Группы нужно сортировать в порядке приоритета, а элемента группы в ином порядке и по другому признаку. Чем это осуществить?

Последний раз редактировалось Человек_Борща; 16.01.2013 в 18:02.
Человек_Борща вне форума Ответить с цитированием
Старый 18.01.2013, 03:51   #4
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Для начала сделал простой пример. Посмотрите что к чему там, какие-то базовые вещи должны стать понятны.
Код конечно без комментариев, но чуть позже постараюсь в эту тему описать подробнее ваши вопросы.
Вложения
Тип файла: zip forum.zip (2.8 Кб, 53 просмотров)
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 19.01.2013, 04:29   #5
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

По поводу
Цитата:
Как отображать в subitem'ах какого-либо Node, в такой-то колонке, мой компонент(кнопка, поле ввода, ещё что-то)?
В аттаче прикрепил пример, где присутствуют вложенные элементы (насколько я понял, вы это имели ввиду).

Что касается
Цитата:
Как хранить в Node объекты списка?
У каждой ноды есть поле Data - указатель на что-либо, вот в него вы и помещаете свой объект (либо что-то другое, что вам нужно), при добавлении новой ноды методом VT - AddChild(ParentNode, Data). Для доступа к вашим данным в ноде, у VT есть метод GetNodeData(Node), который возвращает тот указатель на данные, который вы передали при добавлении ноды. Как только указатель получен, работаем с нашим объектом (в прим. метод IsNodeDataOfMyObject(Node, out Object)).

Цитата:
Из этого следует что дерево передается классу списка, и он его заполняет.
Здесь я все таки не соглашусь. Стоит добавить еще один класс, менеджер/контроллер, который будет знать и о VT, и о списке объектов. Данный класс, как раз таки, и должен будет выполнять всю работу по отображению как самого дерева, так и его элементов (кнопка, поле ввода и т.д.).

Цитата:
Далее сортировка:
Допустим у нас есть Tree в котором список групп и дочерних элементов к ним.
Группы нужно сортировать в порядке приоритета, а элемента группы в ином порядке и по другому признаку. Чем это осуществить?
Данной проблемой не должен заниматься уровень View - в нашем случае VT. Эта задача должна быть реализована уровнем ниже. А вот View (как я говорил, менеджер/контроллер = VT + ListOfObjects) будет получать уже отфильтрованный список и всего лишь выводить данные пользователю.

p.s. Примеры в аттачах писал "на коленке", так что красивость и правильность кода не гарантирована.
Вложения
Тип файла: zip forum_1.zip (3.1 Кб, 24 просмотров)
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 19.01.2013 в 04:33.
spamer вне форума Ответить с цитированием
Старый 23.01.2013, 18:47   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Кое что это прояснило.
Есть событие выделения ветвей?

Ответ: Событие OnChange.

Я начал по-тихоньку разбираться. И честно говоря - VirtualTrees это круче ListView в овер9000 раз.

Теперь такая дилема:
Ноды можно редактировать, и редактор появляется только тогда, когда я тыкаю по самому тексту нода. Это не хорошо.
Чем отрегулировать это?
В дереве у меня 2 колонки, и обе редактируются на ура. Однако хотелосьбы не тыкать на сам текст а както, проверять чтоли, что мышка находится в диапозоне колонки X и элемент Y переходит в редактирование...
В ListView я так и делал, Брал координату мыши относительно ListView b cмотрел где находится она по оси X, если входит в предел от кролонки слева и до колонки справа то включается редактор..

Последний раз редактировалось Человек_Борща; 23.01.2013 в 23:53.
Человек_Борща вне форума Ответить с цитированием
Старый 24.01.2013, 02:23   #7
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
Есть событие выделения ветвей?
Ответ: Событие OnChange.
Все верно, это оно и есть.
В обновленном аттаче показан пример использования MultiSelect режима.

Цитата:
Ноды можно редактировать, и редактор появляется только тогда, когда я тыкаю по самому тексту нода. Это не хорошо.
Чем отрегулировать это?
В дереве у меня 2 колонки, и обе редактируются на ура. Однако хотелосьбы не тыкать на сам текст а както, проверять чтоли, что мышка находится в диапозоне колонки X и элемент Y переходит в редактирование.
А вот это не уверен, что правильно понял. Т.е. вы хотите что бы при наведении на конкретный Column начиналось редактирование текста ноды для этого Column? Если так, то первое, что пришло на ум - это обработка все тех же координат (см. обработчик события OnMouseMove в аттаче). Только это ведь не удобно для пользователя - навел на Column и текст перешел в режим редактирования; другое дело, если бы поведение было как в проводнике Windows - если нода выделена и вы нажимаете по ней, при этом курсор находится над нужным Column, то начинаете режим редактирования
p.s. Исходник лучше смотреть дифом с предыдущей версией.
Вложения
Тип файла: zip forum_1_1.zip (3.7 Кб, 23 просмотров)
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 24.01.2013 в 02:26.
spamer вне форума Ответить с цитированием
Старый 24.01.2013, 03:26   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

хех придется делать по старинке, тогда.
Вот такой код писался чтобы проверить наличие мышки в такой-то позиции при дабл-клике:
Код:
function TViewFrame.MouseInRange(const aRect: TRect;
  const aColumnIndex: Integer; const FullRow: Boolean): Boolean;
var
  iFrom, iTo, i, iC: Integer;
  p: TPoint;
  r: TRect;
begin
  r := aRect;
  GetCursorPos(p);
  p := ScreenToClient(p);

  iC := LV.Columns.Count - 1;

  for i := 0 to iC do
  begin
    if i <> aColumnIndex then
      r.Left := r.Left + LV.Columns[i].Width
    else if FullRow then
      r.Right := r.Left + LV.Columns[aColumnIndex].Width
    else
      r.Right := r.Left + LV.Columns[iC].Width;
  end;

  iFrom := r.Left + 1;
  iTo := r.Right - 1;
  Result := ((p.X >= iFrom) and (p.X <= iTo));
end;
Естественно условие что ItenIndex у LIstView <> -1 и выбран всего-лишь 1 элемент.
По событию OnClick действовала все та же функция только if not MauseInRange и если условие срабатывает, редактор прячется а новые данные запоминаются.

А как вызывать редактор для item X в колонке Z?

Последний раз редактировалось Человек_Борща; 24.01.2013 в 03:29.
Человек_Борща вне форума Ответить с цитированием
Старый 24.01.2013, 04:42   #9
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
А как вызывать редактор для item X в колонке Z?
Просто на позиции текста отображайте Edit (см. код ниже).

Вот...из последнего вашего поста, я так понимаю нужно что-то наподобие этого:
Код:
  private
    FCurrentMyObject: TMyObject;
    FCurrentColumnIndex: TColumnIndex;
    FedtRename: TEdit;

//---

procedure TForm1.FormCreate(Sender: TObject);
begin
...
  FedtRename := TEdit.Create(nil);
  edtRename.OnChange := edtRenameChange;
  edtRename.Parent := VirtualStringTree1;
  edtRename.Visible := False;
...
end;

//---

procedure TForm1.VirtualStringTree1NodeDblClick(Sender: TBaseVirtualTree;
  const HitInfo: THitInfo);
var
  p: TPoint;
  r: TRect;
begin
  if not IsNodeDataOfMyObject(HitInfo.HitNode, FCurrentMyObject) then
    Exit;

  GetCursorPos(p);
  p := ScreenToClient(p);
  FCurrentColumnIndex := VirtualStringTree1.Header.Columns.ColumnFromPosition(p);
  r := VirtualStringTree1.GetDisplayRect(HitInfo.HitNode, CurrentColumnIndex, True);
  if (p.X <= r.Right) and (p.X >= r.Left) then   // Можно добавить также проверку на конкретный Column => CurrentColumnIndex
  begin
    edtRename.Left := r.Left;
    edtRename.Top := r.Top + ( (VirtualStringTree1.DefaultNodeHeight - edtRename.Height) div 2 );
    edtRename.Visible := True;
    edtRename.SetFocus;
  end;
end;

procedure TForm1.VirtualStringTree1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FCurrentMyObject := nil;
  edtRename.Visible := False;
end;

procedure TForm1.edtRenameChange(Sender: TObject);
begin
  if CurrentColumnIndex = 0 then
    CurrentMyObject.Str1 := edtRename.Text
  else  if CurrentColumnIndex = 1 then
    CurrentMyObject.Str2 := edtRename.Text;
end;
На всякий случай еще и аттач прикреплю.
Вложения
Тип файла: zip forum_1_1_1.zip (3.9 Кб, 28 просмотров)
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 24.01.2013, 09:51   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Я для создания редактора использую IVTEditLink Интерфейс =)
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить программу так, чтобы круг двигался не по прямой, а по какому - нибудь другому закону.Например,по какой-нибудь кривой kg250493 C++ Builder 2 24.11.2012 13:44
Куда пойти, куда податься Delрhi Свободное общение 4 06.02.2012 12:39
Использование компонента idUdpClient без компонента TForm. Riply Компоненты Delphi 2 18.02.2011 21:21
Куда отследить куда утекает память? TwiX Общие вопросы Delphi 6 02.03.2010 03:10