Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.04.04;
Скачать: CL | DM;

Вниз

Как поменять столбцы местами?   Найти похожие ветки 

 
И. Павел ©   (2010-02-01 14:23) [0]

Здравствуйте.

Использую TDBGridEh (TDBGrid+дополнительные возможности). Подскажите, пожалуйста, как можно поменять местами столбцы, тоесть изменить порядок их следования на форме, а не в базе. Желательно поменять местами только два столбца, не меняя позиции остальных.
Пытался использовать свойство DBGridEh.Columns[i].Index:=, но при этом i-му полю автоматически присваивается index=0 а все остальные поля сдвигаются вправо. Можно, конечно, сделать и так, но это довольно запутанно. Может быть есть более удобный способ?


 
Sergey13 ©   (2010-02-01 14:55) [1]

В дизайн-тайме можно просто в редакторе колонок перетащить мышкой.
Можно переделать запрос на нужный порядок полей если делаешь в ран-тайме.


 
И. Павел ©   (2010-02-01 16:58) [2]


> Sergey13 ©

Спасибо, но нужно именно в run-тайме. В начальном запросе порядок полей не важен: я сразу же загружаю формат из INI файла, а теперь решил сделать окошко, позволяющее пользователю сортировать столбцы, выбирать видимые и менять ширину столбцов. Менять положение столбцов перетаскиванием неудобно, так как таблица содержит много строк.


 
И. Павел ©   (2010-02-01 16:59) [3]


> много строк

извиняюсь: столбцов


 
12 ©   (2010-02-01 17:17) [4]

напиши метод
не знаю как TDBGridEh, но по идее, должен

procedure TForm1.Button1Click(Sender: TObject);
begin
  ExChangeCol(2,5,DBGrid1);
end;

procedure TForm1.ExChangeCol(F, S: integer; var ADBGrid: TDBGrid);
begin
  if F>S then
  asm
   mov EAX,F
   XCHG EAX,S
   mov F,EAX
  end;
  ADBGrid.Columns[S].Index:=F;
  ADBGrid.Columns[F+1].Index:=S;
end;


 
И Павел   (2010-02-01 18:11) [5]


> 12 ©

Большое спасибо. Все работает!

А код


>   mov EAX,F
>   XCHG EAX,S
>   mov F,EAX


и


>   if F>S then
>   Begin
>     temp:=F;
>     F:=S;
>     S:=temp;
>   end;


это одно и то же?


 
12 ©   (2010-02-01 18:13) [6]

угу.

просто задумался о способах перестановки двух чисел "без третьего" :)


 
И Павел   (2010-02-01 18:27) [7]

Ясно. Спасибо.


 
Anatoly Podgoretsky ©   (2010-02-01 19:25) [8]

> 12  (01.02.2010 18:13:06)  [6]

Неужели так бедно, что третьего нет?


 
Германн ©   (2010-02-02 02:10) [9]


> Anatoly Podgoretsky ©   (01.02.10 19:25) [8]
>
> > 12  (01.02.2010 18:13:06)  [6]
>
> Неужели так бедно, что третьего нет?
>

Поиск третьего - анахронизм 20-го века.


 
Mike Kouzmine   (2010-02-02 10:46) [10]

А что, мышки нет у пользователя? Нажал и перетянул.


 
И. Павел ©   (2010-02-02 10:52) [11]


> А что, мышки нет у пользователя? Нажал и перетянул.

Мне нужно сделать форму, в которой есть два списка: список видимых и невидимых полей. Список видимых полей можно сортировать.
Перетаскивать мышкой сложно, так как в таблице может быть много полей.


 
Mike Kouzmine   (2010-02-02 10:55) [12]

А колонки все независимы? Обязательно все показывать? Пользователь не будет воспринимать данные. Хотя, тебе виднее.


 
И. Павел ©   (2010-02-02 11:01) [13]


> А колонки все независимы? Обязательно все показывать? Пользователь
> не будет воспринимать данные.

Пользователи сами настраивают формат - ширину и количество колонок.  Ограничивать их одним экраном не хочется - кто захочет сам так сможет настроить свой формат.


 
Медвежонок Пятачок ©   (2010-02-02 11:42) [14]

и в чем же проблема?


 
И. Павел ©   (2010-02-02 13:22) [15]


> и в чем же проблема?

Проблема уже решена.
Видимо Index можно использовать только чтобы менять местами только смежные поля (для TDBGridEh). Раньше хотел выделять 2 поля и менять их местами, но видимо придется ограничиться кнопками вверх/вниз.


 
12 ©   (2010-02-02 13:35) [16]

поменять индексы местами -
на самом деле, сначала один индекс получает новый номер, остальные перестраиваются, затем второй получает номер

0
1
2
3 - этот хотим 1м
4

актуальный/бывший
0 0
1 3
2 1
3 2
4 4


 
И. Павел ©   (2010-02-02 14:02) [17]


> 12 ©

Поэтому и получается, что для смежных полей перестановка работает:

0
1
2
3 - перемещаем на 2
4

0 0
1 1
2 3
3 2
4 4

а вот для остальных нужно рещать "Кубик Рубика" - меняем что-то одно - меняется все остальное :) Впрочем это тоже можно решить - просто разбить перемещение на цепочку перемещений смежных полей.

Если с утверждением про смежные поля я поторопился - пожалуйта, поправьте, ато боюсь дальнейших сюрпризов от программы :)


 
Медвежонок Пятачок ©   (2010-02-02 14:04) [18]

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

:)


 
Медвежонок Пятачок ©   (2010-02-02 14:08) [19]

причем отлуп обеим перестановкам. (так как несмежные нельзя перемещать)


 
12 ©   (2010-02-02 14:08) [20]

а

if F>S
temp:=F;
>     F:=S;
>     S:=temp;
проверим, и если в другом порядке задали, переставим числа

 ADBGrid.Columns[SIdx].Index:=FIdx;
произошло смещение индекса,

а мы и учитываем его
 ADBGrid.Columns[FIdx+1].Index:=SIdx;

чем не ?


 
И. Павел ©   (2010-02-02 14:22) [21]


> 12 ©

Да, вы правы - все работает. Просто я сначала что-то напортачил.


> Медвежонок Пятачок ©

Несмежные можно перемещать, но в одну операцию это будет не перестановка двух элементов, а перемещение одного и подгон остальных индексов. Просто алгоритм увеличения/уменьшения индекса на 1 удачно подходит под задачу перестановки.


 
Sergey13 ©   (2010-02-02 14:23) [22]

Если будет отдельная форма для управления этой лабудой, то почему нельзя просто пройти в цикле по всем полям и установить индекс и видимость? Слева направо.


 
И. Павел ©   (2010-02-02 14:33) [23]


> Если будет отдельная форма для управления этой лабудой,
> то почему нельзя просто пройти в цикле по всем полям и установить
> индекс и видимость? Слева направо.

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


 
Sergey13 ©   (2010-02-02 15:04) [24]

> [23] И. Павел ©   (02.02.10 14:33)

А если удалить все колонки и заполнить заново в нужном порядке?

ЗЫ: Честно говоря - странная задача, если пользователь сам задает видимость колонок. Кто потом будет виноват в том, что "а я не видел"? А с размерами и порядком проще сохранять то что юзер мышкой накрутит прямо в гриде без дополнительных форм.


 
Anatoly Podgoretsky ©   (2010-02-02 15:13) [25]

> Sergey13  (02.02.2010 15:04:24)  [24]

Никаких проблем с ответственостью, за все время подобный вопрос даже не возникал.
У меня сохраняются при закрытии формы, и восстанавливаются при открытие.


 
Sergey13 ©   (2010-02-02 15:59) [26]

> [25] Anatoly Podgoretsky ©   (02.02.10 15:13)

И видимость колонок можно изменять?


 
12 ©   (2010-02-02 16:04) [27]


> Sergey13 ©   (02.02.10 15:59) [26]

у нас (не я писал, правда) - да.
Хоть одни id смотри
чего натворишь при этом - твои проблемы


 
И. Павел ©   (2010-02-02 16:07) [28]


> А если удалить все колонки и заполнить заново в нужном порядке?

Тоже вариант. Странно, что в DBGridEh нет готового метода для сортировки полей. По моему - только этого там и нет :)


 
Sergey13 ©   (2010-02-02 16:25) [29]

> [27] 12 ©   (02.02.10 16:04)
> чего натворишь при этом - твои проблемы

Да это понятно, у кого проблемы. Но зачем этому способствовать?
ИМХО, конечно, исключительно.

ЗЫ: А можно вообще без колонок? Ну типа открылось что-то и мне достаточно. 8-)


 
12 ©   (2010-02-02 17:00) [30]


> Sergey13 ©   (02.02.10 16:25) [29]
> ЗЫ: А можно вообще без колонок? Ну типа открылось что-то
> и мне достаточно. 8-)

можно :)
дело в том, что все настройки всех форм/гридов у нас также
>> У меня сохраняются при закрытии формы, и восстанавливаются при открытие.
нов отдельную таблу, чтоб машинонезависимость была.
Как-то упражнялся в чем-то и апдейтнул неудачно. У всех пустота везде. Восстанавливал всем из копии :)


 
Anatoly Podgoretsky ©   (2010-02-02 17:08) [31]

> Sergey13  (02.02.2010 15:59:26)  [26]

Такой цели не было, но это не проблема.



Страницы: 1 вся ветка

Текущий архив: 2010.04.04;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.012 c
2-1265190292
s_t_d
2010-02-03 12:44
2010.04.04
Delphi_Excel Как создать копию раб. листа?


15-1263485249
имя
2010-01-14 19:07
2010.04.04
Юридическая констатация всем давно известного факта


2-1262824902
kyran29
2010-01-07 03:41
2010.04.04
Отправка файла на e-mail


15-1262156476
прохожий
2009-12-30 10:01
2010.04.04
домен продлить


2-1265061595
Евгений Р.
2010-02-02 00:59
2010.04.04
Встроенные функции ADO для провайдера VFPOLEDB.1