Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
11-1200007217
!Pharaon!
2008-01-11 02:20
2009.05.03
ListView и Thumbnail (Эскизы изображений)


2-1237488796
Yuriy
2009-03-19 21:53
2009.05.03
Рамочка TsMonthCalendar (AlphaControls)


2-1237745274
Кузя
2009-03-22 21:07
2009.05.03
Delphi Scintilla Interface Components


2-1233922909
Matveih1
2009-02-06 15:21
2009.05.03
Почему главная форма не отображается по верх форм которые она соз


2-1237811538
Orion
2009-03-23 15:32
2009.05.03
Full Screen Mode