Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
И. Павел ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.004 c
15-1263435454
brother
2010-01-14 05:17
2010.04.04
Уникальность окна


2-1265010530
yantux
2010-02-01 10:48
2010.04.04
setlength - какую максимальную длину можно задать?


6-1207310729
Pochemuk
2008-04-04 16:05
2010.04.04
Ремэпинг без подмены IP. Как сделать?


8-1203851462
Waren1
2008-02-24 14:11
2010.04.04
MediaPlayer


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский