Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Drag & Drop в DBGrid [D7, Paradox]


Страницы:   1 2 3 4

Mishechka ©   (2009-03-10 17:55:00) 

Мне необходимо менять порядок следования записей в DBGrid т.е. перетаскивать строки мышкой выше или ниже. Кто-нибудь знает как это сделать? Спасибо.


MsGuns   (2009-03-16 16:44:00) [41]

>sniknik ©   (16.03.09 12:44) [39]
>> то можно реализовать еще одну сетку, не связанную с БД (стрингрид например),
>и опять, а нафига?

А "фиг" в том, чтобы опер мог перенести данные с "бумаги" в том порядке, в котором они там нарисованы.


sniknik   (2009-03-16 12:44:00) [42]

> Значит, надо добавить с таблицу-справочник людей поле, задающее этот самый "порядок".
эта сказка хороша, начинай сначала...
> clickmaker ©   (10.03.09 17:59) [1]
> заведи поле для упорядочивания, потом меняй значения

> то можно реализовать еще одну сетку, не связанную с БД (стрингрид например),
и опять, а нафига?
> sniknik ©   (10.03.09 22:44) [6]
> > Я  бы заполнил какой-нибудь СтрингГрид, или ЛистВью Значениями, потом тасовал их
> а в чем будет разница? кроме того, что в датасете с данными работать было бы удобнее.

p.s. и не надо вопросов, просто читай сначала, там все расписано.


MsGuns   (2009-03-16 11:51:00) [43]

>а вот когда выч. центр вдруг решил изменить порядок следования фамилий и появилась моя >проблема.

Ага, значит ноги все же растут откуда-то :) Значит, надо добавить с таблицу-справочник людей поле, задающее этот самый "порядок". Тогда изначально приложение должно отображать этот список в нужном порядке и оператор в эксельной манере должен с "бумаги" вносить в него цифры или что-там. В случае отсутствия ФИО добавлять его, присваивая нужный "номер" и запись будет автоматически перемещаться в "нужное" место. Перетаскивание, как видим, оказывается ненужным

Если проблема  в том, что оператору неудобно "скакать" по бумажному списку, в котором ФИО расположены в случайном порядке, то можно реализовать еще одну сетку, не связанную с БД (стрингрид например), куда опер тупо заносит все с "бумаги" подряд. После того, как он внес все (или какую-то порцию) введенную инфу переносить в "базовую" таблицу.
При внесении в стрингрид ФИО сделать возсможность выбора из имеющегося справочника людей. Оператор будет достаточно быстро и удобно "вбивать" в сетку данные с "бумаги", а внесение данный из стрингрида в БД включая добавление новых ФИО выполнит за него прога.
Опять же не надо мачиться в перетаскиванием. Да и неудобно это будет оператору по-любому - и медленне и легко ошибиться.


Mishechka   (2009-03-16 11:40:00) [44]


> ЮЮ ©   (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:32:00) [45]

>Mishechka ©   (16.03.09 10:50) [34]
>Нет, только на бумаге.

А на бумагу оно как попадает  ?


Mishechka   (2009-03-16 11:00:00) [46]


> Leonid Troyanovsky ©   (15.03.09 22:36) [32]
>
>
> http://www.rsdn.ru/forum/message/907742.1.aspx

Мне нужно вставлять запись не в уже существующую, а до или после определённой записи.


Mishechka   (2009-03-16 10:50:00) [47]


> MsGuns ©   (15.03.09 18:26) [31]
>
> Это самое "полотенце" можно получать в электронном виде
> ?

Нет, только на бумаге.


ЮЮ   (2009-03-16 06:01:00) [48]


> но копируются пустые строки. Что я сделал не так?


TargetTable и SourceTable это один и тот же объект, а после TargetTable.append текущая запись - только что вставленная запись. Перед TargetTable.append, т.е. до смены текущей записи следует запомнить значения полей и их присваивать добавленной записи.


> В моём случае можно представить бумажное полотенце длиной
> в км, которое даёт выч. центр, и данные из него нужно занести
> в таблицу


А откуда тогда в твоем гриде взялись фамилии, если данные ещё только на бумаге?

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

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


Leonid Troyanovsky   (2009-03-15 22:36:00) [49]


> Mishechka   (10.03.09 17:55)

> Мне необходимо менять порядок следования записей в DBGrid
> т.е. перетаскивать строки мышкой выше или ниже. Кто-нибудь

http://www.rsdn.ru/forum/message/907742.1.aspx

--
Regards, LVT.


MsGuns   (2009-03-15 18:26:00) [50]

Это самое "полотенце" можно получать в электронном виде ?
Дальше, думаю, ясно


Mishechka   (2009-03-15 13:24:00) [51]

Я не буду спорить о том, какая бух. программа лучше, я не бухгалтер.
Просто хочу вернуться к своему вопросу

> 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.

Всё работает, но копируются пустые строки. Что я сделал не так? Это я думал таким образом перетаскивать строки из одной сетки в другую, которые подключены к одной таблице. Спасибо.


Германн   (2009-03-13 00:51:00) [52]


> Можно я одын  умный вещь скажу ? Спасибо. Так вот, бухгалтерской
> программы лучше 1С Вы не сделаете - эт точно :)

+1
Я не очень часто соглашаюсь с Ганзом. (А он со мной соглашается ещё реже :(.
Но тут я с ним соглашусь на все 100.

Но ещё более я не соглашусь с объяснением сабжа выданном в
> Mishechka ©   (12.03.09 20:06) [25]

Это либо враньё, либо "отмазка".


MsGuns   (2009-03-12 21:56:00) [53]

>clickmaker ©   (12.03.09 14:26) [22]
>В общем - любая задача, где обработка записей должна идти в >соответсвии с неким приоритетом, который не совпадает с алфавитным >порядком или первичным ключом.

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

>Mishechka ©   (12.03.09 20:06) [25]
>Никто ничего не тыкал как попало, просто записи добавлялись в течение 3->х лет и наступил момент навести порядок, чего простой сортировкой не >добьёшся.

Я извиняюсь, но что это за таинственные "записи", которые нужно "упорядочивать" ? И что это за СУБД, в которой записи хранятся в некотором задаваемом извне "порядке" ?
И еще, непонятен "порядок", который не поддается "простой" сортировке (если учесть что сортировка в общем-то и есть упорядочение)
И, наконец, не путаете ли Вы ХРАНЕНИЕ данных с ОТОБРАЖЕНИЕМ ?

>Я считаю, что настоящая программа это та, с которой и ребёнок может >работать, и должна она иметь всего две кнопки "Вход" и "Выход", а всё >остальное должна делать сама, в том числе и то, что этот ребёнок захочет.

Хорошее желание. Я вот хочу авто, которое само будет не только ездить по улицам без шофера, но еще и заправлять себя, ремонтировать и даже мыть :)

Самая надежная, она же универсальная программа - это 'Hello, word', которая ничего не делает.

>У нас на работе поставили 1С-бухгалтерию, так программист уже два года >из бухгалтерии не выходит, всё настраивает. Вот это программа! Вещь!

Дело не в 1С, а в плохом программисте, не знающем 1С как следует, или главбухе мальвасильне, которая не знает что она хочет или не умеет (не желает) выразить это словами.

>Потому и приходится делать свою.

Можно я одын  умный вещь скажу ? Спасибо. Так вот, бухгалтерской программы лучше 1С Вы не сделаете - эт точно :)


Сергей М.   (2009-03-12 20:28:00) [54]


> "Защита от дураков"


От ретивых чиновников никто и ничто не спасет.
ну разве что только переселиться на Луну или на необитаемый остров.
Но там и компьютерные технологии не нужны)


Сергей М.   (2009-03-12 20:13:00) [55]


> чего простой сортировкой не добьёшся


Именно сортировкой и добьешься.

Что для этого нужно - тебе уже сказали.


> поставили 1С-бухгалтерию, так программист уже два года из
> бухгалтерии не выходит


И не выйдет.
И дело не только и не столько в одноэсине.
Сел в кресло очередной Черномырдин и сказал: "Всем отныне платить такой-то новый налог по такой-то хитрожопой схеме" - и понеслась по кочкам)


Mishechka   (2009-03-12 20:06:00) [56]


> А не понатыкать как попало, а потом двигать туда-сюда, пытаясь
> задним числом исправить бардак при вводе)
>
> "как хочет бухгалтерша Марьвасильна"



Никто ничего не тыкал как попало, просто записи добавлялись в течение 3-х лет и наступил момент навести порядок, чего простой сортировкой не добьёшся. И для кого тогда программы создавать, как не для Марьвасильны? Я считаю, что настоящая программа это та, с которой и ребёнок может работать, и должна она иметь всего две кнопки "Вход" и "Выход", а всё остальное должна делать сама, в том числе и то, что этот ребёнок захочет. У нас на работе поставили 1С-бухгалтерию, так программист уже два года из бухгалтерии не выходит, всё настраивает. Вот это программа! Вещь! Потому и приходится делать свою. У программистов есть такое понятие "Защита от дураков", такую защиту нужно делать, а не диктовать свои условия пользователю. Я думаю, тут меня поддержат многие. Спасибо.


Сергей М.   (2009-03-12 16:54:00) [57]


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


Так ведь заносить!

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


Mishechka   (2009-03-12 16:33:00) [58]


> В общем - любая задача, где обработка записей должна идти
> в соответсвии с неким приоритетом, который не совпадает
> с алфавитным порядком или первичным ключом.

Полностью согласен. Только у меня программа бухгалтерская и суммы нужно заносить в определённом порядке.


clickmaker   (2009-03-12 14:26:00) [59]

> Если нетрудно, приведите конкретную ситуацию

можно, я приведу?
недавно просто такое делал. Есть некий FAQ, куда админ добавляет вопрос-ответ. И его соответсвенно нужно как-то разместить в общем списке выше или ниже. По приоритету или частоте задаваемости.
В общем - любая задача, где обработка записей должна идти в соответсвии с неким приоритетом, который не совпадает с алфавитным порядком или первичным ключом.


MsGuns   (2009-03-12 14:22:00) [60]

>Mishechka ©   (12.03.09 12:14) [19]
>Я знаю, что работать нужно не с гридом, а с источником данных. Просто посредством грида я >могу видеть свои действия: редактирование, вставку, удаление записей. Надеюсь увидеть и их >перемещение. Я побегал по интернету и увидел, что сотни людей задают такой же вопрос, значит, >решение найти нужно. Что касается строгого функционала, то вырезать, удалить, переместить, >добавить - это всего лишь действия, которые необходимы любому пользователю. Спасибо.

Если нетрудно, приведите конкретную ситуацию, когда реально требуется менять порядок строк в отображаемом НД ПРОИЗВОЛЬНЫМ образом. И, также необходимость делать это именно перетаскиванием. Я после надцати лет разработки совершенно реальных ПРАКТИЧЕСКИХ проектов СУБД ни разу с таким не встречался.
Сотни людей - это в подавляющем большинстве начинающие программисты, желающие сделать "как хочет бухгалтерша Марьвасильна", до этого работавшая с Экселем или вордом.

Если все же требуется сделать изменение порядка записей "как хочется", то используйте TClientDataSet с добавлением поля "Номер пп", и тогда все эти изменения будут итти мимо БД, что, собственно и требуется.
Перетаскивание - отдельная песня. Но если сильно хочется, то можно и это, хотя придется поморозиться, особенно если нет опыта подобных трюкачеств - здесь об этом также былло говорено


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо