Форум: "Начинающим";
Текущий архив: 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