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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка в VirtualStringTree 
:(
    Опции темы
hilarios
Дата 27.8.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Возник такой вопрос: как при создании динамической структуры дерева сортировать данные относительно их типа? т.е. данная сортировка будет воспринимать все данные как строковые, а как сделать, зная тип данных каждого столбца, чтобы сортировка проходила относительно типа этих данных? (тип Int сортировался бы по возрастанию/убыванию, текст по алфавиту и т.д.)

Код

procedure TFormdll.VST1CompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
  BaseTree: TVirtualStringTree;
begin

  BaseTree := TVirtualStringTree(Sender);
  Result := AnsiStrComp(PChar(string(BaseTree.Text[Node1, Column])),
    PChar(string(BaseTree.Text[Node2, Column])));

end;

PM MAIL   Вверх
aktuba
Дата 27.8.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А в чем сложность то??? У тебя же есть ноды, получай поля и сравнивай


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


Новичок



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

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



Цитата(aktuba @ 27.8.2007,  16:03)
А в чем сложность то??? У тебя же есть ноды, получай поля и сравнивай

Делаю так:
Код

 for I := 0 to VST1.Header.Columns.Count - 1 do    // Iterate
 begin

 if ((tipe_c[i]='int') or (tipe_c[i]='double') or (tipe_c[i]='float') or (tipe_c[i]='smallint')) then

  if BaseTree.Text[Node1,column]> BaseTree.Text[Node2,column] then
   Result:=1
   else if BaseTree.Text[Node1,column]< BaseTree.Text[Node2,column] then
   Result:=-1
   else Result:=0

 else

  Result := AnsiStrComp(PChar(string(BaseTree.Text[Node1, Column])),
    PChar(string(BaseTree.Text[Node2, Column])));
 end;


вот только у меня одно сомнение, ведь при заполнении дерева все данные мы перегоняем в строки...корректно будет такое сравнение...
PM MAIL   Вверх
ASGDeveloper
Дата 28.8.2007, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


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

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



Сделай тогда так:
Код

procedure TMainForm.vstTreeCompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
   num1, num2: Integer;
   s1, s2: string;
begin
  s1 := Sender.Text[Node1, Column];
  num1 := StrToIntDef(s1, -1);
  s2 := Sender.Text[Node2, Column];
  num2 := StrToIntDef(s2, -1);

  if (num1 <> -1) and (num2 <> -1) then
  begin
    if num1 > num2 then Result := 1;
    if num1 < num2 then Result := - 1;
    if num1 = num2 then Result := 0;
  end else
  Result := WideCompareStr(vstControlJ.Text[Node1, Column], vstControlJ.Text[Node2, Column]);
end;

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


Новичок



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

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



Цитата(ASGDeveloper @ 28.8.2007,  08:31)
Сделай тогда так:

Спасибо большое за помощь!!! Что-то то я тут от всей суеты совсем запарился...Разобрался как все сделать! smile

Код

procedure TFormdll.VST1CompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
  BaseTree: TVirtualStringTree;
begin

     BaseTree := TVirtualStringTree(Sender);

 if ((tipe_c[Column]='int') or (tipe_c[Column]='bigint') or (tipe_c[Column]='binary') or (tipe_c[Column]='smallint') or (tipe_c[Column]='bit') or (tipe_c[Column]='decimal') or (tipe_c[Column]='numeric') or (tipe_c[Column]='tinyint')) then

   if StrToInt(BaseTree.Text[Node1,column])> StrToInt(BaseTree.Text[Node2,column]) then
   Result:=1
   else if StrToInt(BaseTree.Text[Node1,column])< StrToInt(BaseTree.Text[Node2,column]) then
   Result:=-1
   else Result:=0

 else if ((tipe_c[Column]='float') or (tipe_c[Column]='money') or (tipe_c[Column]='smallmoney')) then
   if StrToFloat(BaseTree.Text[Node1,column])> StrToFloat(BaseTree.Text[Node2,column]) then
   Result:=1
   else if StrToFloat(BaseTree.Text[Node1,column])< StrToFloat(BaseTree.Text[Node2,column]) then
   Result:=-1
   else Result:=0

 else
  Result := AnsiStrComp(PChar(string(BaseTree.Text[Node1, Column])),
    PChar(string(BaseTree.Text[Node2, Column])));
end;

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


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


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

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



ASGDeveloperhilarios

Код

procedure TMainForm.vstTreeCompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
  lData1, lData2: PDataNode;
begin
  Result := 0;
  lData1 := Sender.GetDataNode(Node1);
  lData2 := Sender.GetDataNode(Node2);
  if not (Assigned(lData1) and Assigned(lData2)) then Exit;
  case Column of
    0: Result := AnsiStrCompare(lData1^.str, lData2^.str); // Для строк
    1: if lData1^.Int > lData2^.Int // Для чисел
          then Result := 1
          else Result := -1;
    // и т.д...
  end;
end;


Если Вы переводите число в текст - нет гарантии правильного результата. Я всегда подобным образом делаю.


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


"Shарфик"
*


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

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




Другой вопрос по теме сортировки

Сделана банальная сортировка - кликаем по шапке, и компонент сортирует содержимое сравнивая текст из ячеек.
Все бы здорово, но может кто то сталкивался с аналогичным багом: компонент не сортирует при этом полностью список. Чтобы полностью отсортировать дерево надо сделать 3-4 клика по колонке туда-сюда, чтобы слова выставились как надо.

И почему то на Win 8 вылеталет "out of memory" в штатном редакторе текста компонента. Склоняюсь к мысли, что сборка компонента косячная. Но под Лазарус выбор не большой увы сборок.


--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
Gwire
Дата 30.1.2018, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Зачем столько текста?
Код

   if StrToInt(BaseTree.Text[Node1,column])> StrToInt(BaseTree.Text[Node2,column]) then
   Result:=1
   else if StrToInt(BaseTree.Text[Node1,column])< StrToInt(BaseTree.Text[Node2,column]) then
   Result:=-1
   else Result:=0

Код

    Result := StrToInt(BaseTree.Text[Node1,column]) - StrToInt(BaseTree.Text[Node2,column]);

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.1331 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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