Текущий архив: 2009.05.03;
Скачать: CL | DM;
Вниз
Drag & Drop в DBGrid Найти похожие ветки
← →
Mishechka (2009-03-10 17:55) [0]Мне необходимо менять порядок следования записей в DBGrid т.е. перетаскивать строки мышкой выше или ниже. Кто-нибудь знает как это сделать? Спасибо.
← →
clickmaker © (2009-03-10 17:59) [1]заведи поле для упорядочивания, потом меняй значения
← →
KSergey © (2009-03-10 18:17) [2]я делал, только наверное на основе StringGrid, хотя и не помню, может и на "оторванном" Ado DataSet лкально менял поле сортировки, как clickmaker [1] говорит.
← →
Mishechka (2009-03-10 18:21) [3]
> заведи поле для упорядочивания, потом меняй значения
А просто перетаскивать не получится?
← →
clickmaker © (2009-03-10 18:24) [4]> А просто перетаскивать не получится?
нет. Грид не содержит данных. Он всего лишь их показывает. Поэтому сортировка должна быть именно у источника данных.
← →
korneley © (2009-03-10 22:10) [5]В простейшем случае, на OnDragOver акцептируешь посылателя, на OnDragDrop выполняешь [1] не забывая о [4] Да, и к чему такой джаз? Я бы заполнил какой-нибудь СтрингГрид, или ЛистВью Значениями, потом тасовал их, как душе угодно, и , по результатам, всандалил бы в базу :)
← →
sniknik © (2009-03-10 22:44) [6]> Я бы заполнил какой-нибудь СтрингГрид, или ЛистВью Значениями, потом тасовал их
а в чем будет разница? кроме того, что в датасете с данными работать было бы удобнее.
← →
korneley © (2009-03-10 23:11) [7]
> sniknik © (10.03.09 22:44) [6]
Ну не знаю. Мне было бы проще извлечь данные, а потом с ними разбираться. Тем более, что датасет, он, конечно, удобен, но ... как-то... со всеми претензиями, разбираться... Мой ответ: хочешь хорошо, делай САМ! Другого нет.
← →
Германн © (2009-03-11 00:33) [8]Я когда-то делал именно так как в [1]. А справа от DBGrid поместил две красивые кнопочки со стрелками "вверх" и "вниз". Пользователи не жаловались на неудобства.
← →
KSergey © (2009-03-11 08:48) [9]> Германн © (11.03.09 00:33) [8]
> поместил две красивые кнопочки со стрелками "вверх" и "вниз".
> Пользователи не жаловались на неудобства.
Я жалуюсь! В нашей проге такой же ужас! Но понятно, "так проще".
> sniknik © (10.03.09 22:44) [6]
> > Я бы заполнил какой-нибудь СтрингГрид, или ЛистВью Значениями, потом тасовал их
> а в чем будет разница? кроме того, что в датасете с данными работать было бы удобнее.
Для действительно удобной и красивой реализации необходимо грамотно управлять первой видимой строкой. Вероятно это не очень удобно для ДБГрид, но сам не пробовал.
← →
Ega23 © (2009-03-11 09:57) [10]Я такое делал когда-то очень давно. Но код не дам - стыдно... :)
← →
sniknik © (2009-03-11 11:50) [11]> грамотно управлять первой видимой строкой. Вероятно это не очень удобно для ДБГрид
в смысле? при установленной сортировке по полю дать минимальное значение строке которая должна быть первой это "не очень удобно"?
а что же тогда удобно?
или я чего то не понимаю. что такое "удобная и красивая реализация"
когда то давно, когда еще писал на досовском фохпро нужно было подобное (накладные у одной компании зависели от позиции, т.е. возвраты и д.р. операции с ними должны по их правилам совпадать позиционно с присланной бумажной накладной...)
сделал просто (ни кнопочек, ни драг и дропа тогда не было) текущая позиция перемещалась стрелочками вверх и вниз при зажатом ctrl-е. имхо, это и теперь самый простой, и самый удобный способ. в тех редких случаях когда действительно нужно (что чаще всего не так).
← →
Mishechka © (2009-03-11 12:57) [12]Подскажите, как реализовать эти две кнопочки. Может код покажете? Ведь я только учусь. Спасибо.
← →
Mishechka © (2009-03-11 12:59) [13]Подскажите, как реализовать эти две кнопочки. Может код покажете? Ведь я только учусь. Спасибо.
← →
clickmaker © (2009-03-11 13:17) [14]> [13] Mishechka © (11.03.09 12:59)
заведи в таблице поле OrdNumber
пронумеруй записи
при выборке добавь сортировку по OrdNumber
при нажатии кнопки вверх - переставляй значения у текущей и предыдущей записи
при нажатии кнопки вниз - соотв. у текущей и следующей записи
← →
Mishechka © (2009-03-11 13:22) [15]Скажите, если поставить PopupMenu и с его помощью "Вырезать" а потом "Вставить" в нужное место? Так получится? И как мне реализовать такие пункты в PopupMenu: "Вырезать", "Копировать", "Вставить", "Удалить"? Спасибо.
← →
clickmaker © (2009-03-11 13:35) [16]> с его помощью "Вырезать" а потом "Вставить" в нужное место?
что вырезать?
← →
KSergey © (2009-03-11 14:16) [17]> sniknik © (11.03.09 11:50) [11]
> > грамотно управлять первой видимой строкой. Вероятно это
> не очень удобно для ДБГрид в смысле?
Я про случай, когда все строки не влазят в экран. А переместить хочется выше видимой верхней, например.
> текущая позиция перемещалась стрелочками вверх и вниз при зажатом ctrl-е.
Вещь! как я не допер... все винды поганые мозг развратили. убежал делать
← →
MsGuns © (2009-03-11 16:27) [18]Вырезать, удалить, переместить, добавить - это что, гама ?
С СУЩНОСТЯМИ, которые собственно хранятся в БД, а в "гридах" всего лишь ОТОБРАЖАЮТСЯ. так поступать категорически нельзя
И вообще чем "строже" функционал приложения работы с БД, тем проще с ним работать пользователю. Хотя бы потому что до минимума сводит вероятность СЛУЧАЙНОЙ ошибки, которую занефикделать можно допустить при том же перетаскивании.
← →
Mishechka © (2009-03-12 12:14) [19]
> Вырезать, удалить, переместить, добавить - это что, гама
> ?
> С СУЩНОСТЯМИ, которые собственно хранятся в БД, а в "гридах"
> всего лишь ОТОБРАЖАЮТСЯ. так поступать категорически нельзя
>
> И вообще чем "строже" функционал приложения работы с БД,
> тем проще с ним работать пользователю. Хотя бы потому что
> до минимума сводит вероятность СЛУЧАЙНОЙ ошибки, которую
> занефикделать можно допустить при том же перетаскивании.
>
>
Я знаю, что работать нужно не с гридом, а с источником данных. Просто посредством грида я могу видеть свои действия: редактирование, вставку, удаление записей. Надеюсь увидеть и их перемещение. Я побегал по интернету и увидел, что сотни людей задают такой же вопрос, значит, решение найти нужно. Что касается строгого функционала, то вырезать, удалить, переместить, добавить - это всего лишь действия, которые необходимы любому пользователю. Спасибо.
← →
ЮЮ © (2009-03-12 12:31) [20]
> Кто-нибудь знает как это сделать? Спасибо.
В простейшем случае: написать необходимый код в обработчиках Grid-a, визуально реализующий Drag & Drop на гриде, а фактически изменяющий данные в DataSete/базе данных.
При желании прикрутить аналогичное к другому гриду,
а) предыдущую реализацию оформить в виде функций с их вызовом в обработчиках
б) написать наследника с нужной визальной реализацией и механизмом изменения внутренней реализации.
← →
MsGuns © (2009-03-12 14:22) [21]>Mishechka © (12.03.09 12:14) [19]
>Я знаю, что работать нужно не с гридом, а с источником данных. Просто посредством грида я >могу видеть свои действия: редактирование, вставку, удаление записей. Надеюсь увидеть и их >перемещение. Я побегал по интернету и увидел, что сотни людей задают такой же вопрос, значит, >решение найти нужно. Что касается строгого функционала, то вырезать, удалить, переместить, >добавить - это всего лишь действия, которые необходимы любому пользователю. Спасибо.
Если нетрудно, приведите конкретную ситуацию, когда реально требуется менять порядок строк в отображаемом НД ПРОИЗВОЛЬНЫМ образом. И, также необходимость делать это именно перетаскиванием. Я после надцати лет разработки совершенно реальных ПРАКТИЧЕСКИХ проектов СУБД ни разу с таким не встречался.
Сотни людей - это в подавляющем большинстве начинающие программисты, желающие сделать "как хочет бухгалтерша Марьвасильна", до этого работавшая с Экселем или вордом.
Если все же требуется сделать изменение порядка записей "как хочется", то используйте TClientDataSet с добавлением поля "Номер пп", и тогда все эти изменения будут итти мимо БД, что, собственно и требуется.
Перетаскивание - отдельная песня. Но если сильно хочется, то можно и это, хотя придется поморозиться, особенно если нет опыта подобных трюкачеств - здесь об этом также былло говорено
← →
clickmaker © (2009-03-12 14:26) [22]> Если нетрудно, приведите конкретную ситуацию
можно, я приведу?
недавно просто такое делал. Есть некий FAQ, куда админ добавляет вопрос-ответ. И его соответсвенно нужно как-то разместить в общем списке выше или ниже. По приоритету или частоте задаваемости.
В общем - любая задача, где обработка записей должна идти в соответсвии с неким приоритетом, который не совпадает с алфавитным порядком или первичным ключом.
← →
Mishechka © (2009-03-12 16:33) [23]
> В общем - любая задача, где обработка записей должна идти
> в соответсвии с неким приоритетом, который не совпадает
> с алфавитным порядком или первичным ключом.
Полностью согласен. Только у меня программа бухгалтерская и суммы нужно заносить в определённом порядке.
← →
Сергей М. © (2009-03-12 16:54) [24]
> суммы нужно заносить в определённом порядке
Так ведь заносить !
А не понатыкать как попало, а потом двигать туда-сюда, пытаясь задним числом исправить бардак при вводе)
← →
Mishechka © (2009-03-12 20:06) [25]
> А не понатыкать как попало, а потом двигать туда-сюда, пытаясь
> задним числом исправить бардак при вводе)
>
> "как хочет бухгалтерша Марьвасильна"
Никто ничего не тыкал как попало, просто записи добавлялись в течение 3-х лет и наступил момент навести порядок, чего простой сортировкой не добьёшся. И для кого тогда программы создавать, как не для Марьвасильны? Я считаю, что настоящая программа это та, с которой и ребёнок может работать, и должна она иметь всего две кнопки "Вход" и "Выход", а всё остальное должна делать сама, в том числе и то, что этот ребёнок захочет. У нас на работе поставили 1С-бухгалтерию, так программист уже два года из бухгалтерии не выходит, всё настраивает. Вот это программа! Вещь! Потому и приходится делать свою. У программистов есть такое понятие "Защита от дураков", такую защиту нужно делать, а не диктовать свои условия пользователю. Я думаю, тут меня поддержат многие. Спасибо.
← →
Сергей М. © (2009-03-12 20:13) [26]
> чего простой сортировкой не добьёшся
Именно сортировкой и добьешься.
Что для этого нужно - тебе уже сказали.
> поставили 1С-бухгалтерию, так программист уже два года из
> бухгалтерии не выходит
И не выйдет.
И дело не только и не столько в одноэсине.
Сел в кресло очередной Черномырдин и сказал: "Всем отныне платить такой-то новый налог по такой-то хитрожопой схеме" - и понеслась по кочкам)
← →
Сергей М. © (2009-03-12 20:28) [27]
> "Защита от дураков"
От ретивых чиновников никто и ничто не спасет.
ну разве что только переселиться на Луну или на необитаемый остров.
Но там и компьютерные технологии не нужны)
← →
MsGuns © (2009-03-12 21:56) [28]>clickmaker © (12.03.09 14:26) [22]
>В общем - любая задача, где обработка записей должна идти в >соответсвии с неким приоритетом, который не совпадает с алфавитным >порядком или первичным ключом.
Ключевое слово - "некий приоритет". Очевидно, его просто нужно было определить при проектировании как сущность и использовать при упорядении.
Сам боролся с подобными ситуациями, но в результате сделал вывод, что бороться в итоге приходится с последствиями собственных просчетов и ошибок
>Mishechka © (12.03.09 20:06) [25]
>Никто ничего не тыкал как попало, просто записи добавлялись в течение 3->х лет и наступил момент навести порядок, чего простой сортировкой не >добьёшся.
Я извиняюсь, но что это за таинственные "записи", которые нужно "упорядочивать" ? И что это за СУБД, в которой записи хранятся в некотором задаваемом извне "порядке" ?
И еще, непонятен "порядок", который не поддается "простой" сортировке (если учесть что сортировка в общем-то и есть упорядочение)
И, наконец, не путаете ли Вы ХРАНЕНИЕ данных с ОТОБРАЖЕНИЕМ ?
>Я считаю, что настоящая программа это та, с которой и ребёнок может >работать, и должна она иметь всего две кнопки "Вход" и "Выход", а всё >остальное должна делать сама, в том числе и то, что этот ребёнок захочет.
Хорошее желание. Я вот хочу авто, которое само будет не только ездить по улицам без шофера, но еще и заправлять себя, ремонтировать и даже мыть :)
Самая надежная, она же универсальная программа - это "Hello, word", которая ничего не делает.
>У нас на работе поставили 1С-бухгалтерию, так программист уже два года >из бухгалтерии не выходит, всё настраивает. Вот это программа! Вещь!
Дело не в 1С, а в плохом программисте, не знающем 1С как следует, или главбухе мальвасильне, которая не знает что она хочет или не умеет (не желает) выразить это словами.
>Потому и приходится делать свою.
Можно я одын умный вещь скажу ? Спасибо. Так вот, бухгалтерской программы лучше 1С Вы не сделаете - эт точно :)
← →
Германн © (2009-03-13 00:51) [29]
> Можно я одын умный вещь скажу ? Спасибо. Так вот, бухгалтерской
> программы лучше 1С Вы не сделаете - эт точно :)
+1
Я не очень часто соглашаюсь с Ганзом. (А он со мной соглашается ещё реже :(.
Но тут я с ним соглашусь на все 100.
Но ещё более я не соглашусь с объяснением сабжа выданном в
> Mishechka © (12.03.09 20:06) [25]
Это либо враньё, либо "отмазка".
← →
Mishechka © (2009-03-15 13:24) [30]Я не буду спорить о том, какая бух. программа лучше, я не бухгалтер.
Просто хочу вернуться к своему вопросу
> Mishechka (10.03.09 17:55)
и попробую обьяснить так:
Допустим вам нужно вносить данные в таблицу (посредством DBGrid) в ячейки напротив фамилий людей. Вносить данные нужно не в том порядке, в котором они отсортированы в сетке или таблице (А-Я, Я-А или по ключу), а своеобразно. Допустим сначала Иванов, потом Агафонов, потом Петров, потом Юсупов и т. д. Всякий раз приходится прокручивать сетку то вниз, то вверх, что, согласитесь, крайне неудобно. В моём случае можно представить бумажное полотенце длиной в км, которое даёт выч. центр, и данные из него нужно занести в таблицу. Потому мне и нужно разместить строки так, как у них в полотенце. Тогда можно будет просто заносить данные и давить "Enter", у меня "Enter" переводит курсор на следующую строку. Теперь понятна моя проблема?
Я тут опробовал такой код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, Db, DBTables;
type
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Table2: TTable;
DataSource2: TDataSource;
DBGrid2: TDBGrid;
procedure DBGrid2DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure DBGrid2DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.DBGrid2DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
accept:=Source is TDBGrid;
end;
procedure TForm1.DBGrid2DragDrop(Sender, Source: TObject; X, Y: Integer);
var SourceTable, TargetTable:TTable;
i:integer;
begin
if Source is TDBGrid then
begin
TargetTable:=(sender as TDBGrid).DataSource.DataSet as TTable;
SourceTable:=(Source as TDBGrid).DataSource.DataSet as TTable;
TargetTable.append;
For i:=0 to SourceTable.Fields.count-1 do
TargetTable.fields[i].assign(SourceTable.fields[i]);
TargetTable.post;
end;
end;
procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssLeft in Shift then DBGrid1.BeginDrag(True, 10);
end;
end.
Всё работает, но копируются пустые строки. Что я сделал не так? Это я думал таким образом перетаскивать строки из одной сетки в другую, которые подключены к одной таблице. Спасибо.
← →
MsGuns © (2009-03-15 18:26) [31]Это самое "полотенце" можно получать в электронном виде ?
Дальше, думаю, ясно
← →
Leonid Troyanovsky © (2009-03-15 22:36) [32]
> Mishechka (10.03.09 17:55)
> Мне необходимо менять порядок следования записей в DBGrid
> т.е. перетаскивать строки мышкой выше или ниже. Кто-нибудь
http://www.rsdn.ru/forum/message/907742.1.aspx
--
Regards, LVT.
← →
ЮЮ © (2009-03-16 06:01) [33]
> но копируются пустые строки. Что я сделал не так?
TargetTable и SourceTable это один и тот же объект, а после TargetTable.append текущая запись - только что вставленная запись. Перед TargetTable.append, т.е. до смены текущей записи следует запомнить значения полей и их присваивать добавленной записи.
> В моём случае можно представить бумажное полотенце длиной
> в км, которое даёт выч. центр, и данные из него нужно занести
> в таблицу
А откуда тогда в твоем гриде взялись фамилии, если данные ещё только на бумаге?
вот и добавляй их в грид в том порядке, как они есть на бумаге, т.е. сначала в первом поле выбираешь Иванов и вносишь данные по нему, потом Агафонов и т.д.
Правда структура данных для этого должна быть проработана правильно, а "бумажное полотенце" должно заноситься как отдельная сущность с подчиненными записями "строка бумажного полотенца"
← →
Mishechka © (2009-03-16 10:50) [34]
> MsGuns © (15.03.09 18:26) [31]
>
> Это самое "полотенце" можно получать в электронном виде
> ?
Нет, только на бумаге.
← →
Mishechka © (2009-03-16 11:00) [35]
> Leonid Troyanovsky © (15.03.09 22:36) [32]
>
>
> http://www.rsdn.ru/forum/message/907742.1.aspx
Мне нужно вставлять запись не в уже существующую, а до или после определённой записи.
← →
MsGuns © (2009-03-16 11:32) [36]>Mishechka © (16.03.09 10:50) [34]
>Нет, только на бумаге.
А на бумагу оно как попадает ?
← →
Mishechka © (2009-03-16 11:40) [37]
> ЮЮ © (16.03.09 06:01) [33]
>
> TargetTable и SourceTable это один и тот же объект, а после
> TargetTable.append текущая запись - только что вставленная
> запись. Перед TargetTable.append, т.е. до смены текущей
> записи следует запомнить значения полей и их присваивать
> добавленной записи.
>
Тогда это и будет выглядеть как?
> Mishechka © (11.03.09 13:22) [15]
>
> Скажите, если поставить PopupMenu и с его помощью "Вырезать"
> а потом "Вставить" в нужное место? Так получится? И как
> мне реализовать такие пункты в PopupMenu: "Вырезать", "Копировать",
> "Вставить", "Удалить"? Спасибо.
>
> А откуда тогда в твоем гриде взялись фамилии, если данные
> ещё только на бумаге?
>
Они в таблице уже три года и заносятся данные по месяцам т.е. каждый месяц новое полотенце. Список фамилий меняется только в том случае, если нужно кого-то добавить в список или удалить из него. Как выяснилось, эти действия не вызывали проблем, а вот когда выч. центр вдруг решил изменить порядок следования фамилий и появилась моя проблема.
> Правда структура данных для этого должна быть проработана
> правильно, а "бумажное полотенце" должно заноситься как
> отдельная сущность с подчиненными записями "строка бумажного
> полотенца"
А с кем ты разговариваешь? Для меня это тёмный лес, я же только учусь.
← →
MsGuns © (2009-03-16 11:51) [38]>а вот когда выч. центр вдруг решил изменить порядок следования фамилий и появилась моя >проблема.
Ага, значит ноги все же растут откуда-то :) Значит, надо добавить с таблицу-справочник людей поле, задающее этот самый "порядок". Тогда изначально приложение должно отображать этот список в нужном порядке и оператор в эксельной манере должен с "бумаги" вносить в него цифры или что-там. В случае отсутствия ФИО добавлять его, присваивая нужный "номер" и запись будет автоматически перемещаться в "нужное" место. Перетаскивание, как видим, оказывается ненужным
Если проблема в том, что оператору неудобно "скакать" по бумажному списку, в котором ФИО расположены в случайном порядке, то можно реализовать еще одну сетку, не связанную с БД (стрингрид например), куда опер тупо заносит все с "бумаги" подряд. После того, как он внес все (или какую-то порцию) введенную инфу переносить в "базовую" таблицу.
При внесении в стрингрид ФИО сделать возсможность выбора из имеющегося справочника людей. Оператор будет достаточно быстро и удобно "вбивать" в сетку данные с "бумаги", а внесение данный из стрингрида в БД включая добавление новых ФИО выполнит за него прога.
Опять же не надо мачиться в перетаскиванием. Да и неудобно это будет оператору по-любому - и медленне и легко ошибиться.
← →
sniknik © (2009-03-16 12:44) [39]> Значит, надо добавить с таблицу-справочник людей поле, задающее этот самый "порядок".
эта сказка хороша, начинай сначала...
> clickmaker © (10.03.09 17:59) [1]
> заведи поле для упорядочивания, потом меняй значения
> то можно реализовать еще одну сетку, не связанную с БД (стрингрид например),
и опять, а нафига?
> sniknik © (10.03.09 22:44) [6]
> > Я бы заполнил какой-нибудь СтрингГрид, или ЛистВью Значениями, потом тасовал их
> а в чем будет разница? кроме того, что в датасете с данными работать было бы удобнее.
p.s. и не надо вопросов, просто читай сначала, там все расписано.
← →
MsGuns © (2009-03-16 16:44) [40]>sniknik © (16.03.09 12:44) [39]
>> то можно реализовать еще одну сетку, не связанную с БД (стрингрид например),
>и опять, а нафига?
А "фиг" в том, чтобы опер мог перенести данные с "бумаги" в том порядке, в котором они там нарисованы.
Страницы: 1 2 вся ветка
Текущий архив: 2009.05.03;
Скачать: CL | DM;
Память: 0.62 MB
Время: 0.017 c