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 т.е. перетаскивать строки мышкой выше или ниже. Кто-нибудь знает как это сделать? Спасибо.


Германн   (2009-03-18 01:27:00) [21]


> Mishechka ©   (17.03.09 22:27) [57]
>
> > Германн ©   (13.03.09 00:51) [29]
> >
> > Это либо враньё, либо "отмазка".
> >
>
> ??? Спасибо.
>

Да не за что.
Ну не надо "придумывать" некие ситуации, которые, по твоему мнению, должны дать реальный пример для твоей задачи. Лучше привести саму задачу.


MsGuns   (2009-03-18 00:46:00) [22]

>sniknik ©   (17.03.09 22:29) [58]

Во-во ! Скоко танцев - то возле костра да с бубном !
А со стрингридом-то на порядок прощее

;Ь


sniknik   (2009-03-17 22:29:00) [23]

> procedure TfmProv.SourceProvDataChange(Sender: TObject; Field: TField);
> begin
>  if UpBtn.Enabled = False then UpBtn.Enabled := True;
>  if not Prov.Bof then UpBtn.Enabled := True;
>  if Prov.Bof then UpBtn.Enabled := False;
>  if DownBtn.Enabled = False then DownBtn.Enabled := True;
>  if not Prov.Eof then DownBtn.Enabled := True;
>  if Prov.Eof then DownBtn.Enabled := False;
> end;
впечатлён... переписал чтобы крыша не съехала...

procedure TForm1.ADODataSet1BeforePost(DataSet: TDataSet);
begin
 with ADODataSet1 do
   if State = dsInsert then
     fSort.AsInteger:= RecordCount + 1;
end;

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
 with ADODataSet1 do begin
   Button1.Enabled:= (RecNo > 1) and not Bof;
   Button2.Enabled:= (RecNo < RecordCount) and not Eof;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 SavePos: TBookmark;
 S1Value, S2Value: integer;
begin
 with ADODataSet1 do
   if RecNo > 1 then begin
     DisableControls;
     try
       SavePos:= GetBookmark;
       try
         S1Value:= fSort.AsInteger;
         Prior;
         S2Value:= fSort.AsInteger;
         Edit;
         fSort.AsInteger:= S1Value;
         Post;
         GotoBookmark(SavePos);
         Edit;
         fSort.AsInteger:= S2Value;
         Post;
       finally
         FreeBookmark(SavePos);
       end;
     finally
       EnableControls;
     end;
   end;
end;


Mishechka   (2009-03-17 22:27:00) [24]


> Германн ©   (11.03.09 00:33) [8]
>
> Я когда-то делал именно так как в [1]. А справа от DBGrid
> поместил две красивые кнопочки со стрелками "вверх" и "вниз".
>  Пользователи не жаловались на неудобства.
>


> clickmaker ©   (11.03.09 13:17) [14]
>
> заведи в таблице поле OrdNumber
> пронумеруй записи
> при выборке добавь сортировку по OrdNumber
> при нажатии кнопки вверх - переставляй значения у текущей
> и предыдущей записи
> при нажатии кнопки вниз - соотв. у текущей и следующей записи
>


> MsGuns ©   (12.03.09 21:56) [28]
>
> Можно я одын  умный вещь скажу ? Спасибо.

А что там с кодом на кнопки? У меня уже закрадываются смутные подозрения, а уж не прав ли

> Германн ©   (13.03.09 00:51) [29]
>
> Это либо враньё, либо "отмазка".
>

??? Спасибо.


Онотоле   (2009-03-17 19:04:00) [25]

или два sql Update запроса, что предпочтительней


Онотоле   (2009-03-17 19:02:00) [26]

пишешь метод Exchange(SrcNo, DestNo: integer);
там два Locate(лучше Seek с индексом) получаешь 2 нужные записи и меняешь  в них значения поля с номером местами.

Потом этот метод можно прикрутить либо к драгдропу, либо к кнопочкам, либо к еще чему захочешь


Mishechka   (2009-03-17 18:05:00) [27]


> Mishechka ©   (16.03.09 18:49) [42]
>
> Ребята!
> Я сделал сортированное поле для упорядочивания, меняя значения
> этого поля - меняю порядок расположения записей, поставил
> на форму две кнопки "Вверх" и "Вниз" - думаю, так Марьванне
> будет проще передвигать записи.
>
> Подскажите с кодом для кнопок, пожалуйста. Спасибо.

В данный момент я уже кое-как отсортировал с помощью этого поля, выставляя в нём значения вручную, но как это делать программно не знаю. В DataSource на событие OnDataChange написал обработчик:

procedure TfmProv.SourceProvDataChange(Sender: TObject; Field: TField);
begin
 if UpBtn.Enabled = False then UpBtn.Enabled := True;
 if not Prov.Bof then UpBtn.Enabled := True;
 if Prov.Bof then UpBtn.Enabled := False;
 if DownBtn.Enabled = False then DownBtn.Enabled := True;
 if not Prov.Eof then DownBtn.Enabled := True;
 if Prov.Eof then DownBtn.Enabled := False;
end;

Теперь при достижении курсором начальной или конечной записи соответствующие кнопки отключаются. Также, при добавлении новой записи, в это поле ставится её номер. Для этого я написал следующий обработчик:

procedure TfmProv.ProvBeforePost(DataSet: TDataSet);
begin
 if Prov.State = dsInsert then
  begin
   ProvPNo.Value := Prov.RecordCount +1;
  end;
end;

Не знаю правильно или нет, но пока всё работает. А вот для кнопок пытаюсь сделать примерно так:

procedure TfmProv.UpBtnClick(Sender: TObject);
begin
 Prov.Edit;
 ProvPNo.Value := ProvPNo.Value -1;
 Prov.Post;
end;

procedure TfmProv.DownBtnClick(Sender: TObject);
begin
 Prov.Edit;
 ProvPNo.Value := ProvPNo.Value +1;
 Prov.Post;
end;

Номер текущей записи я увеличиваю или уменьшаю на 1, но одновременно с этим я должен уменьшить или увеличить номер предыдущей или следующей записи, иначе они не поменяются местами, а как это сделать не знаю.
Прошу помочь. Спасибо.


sniknik   (2009-03-17 17:03:00) [28]

> Каким боком кэш поможет решить задачу ?
а каким боком ее решает стринггрид? это же ему взамен предлагали эту альтернативу.

> Добавить еще одно "служебное" поле "Номер бумаги"
если нужно деление записей на "порции" то да. многие системы поддерживают понятие "документ".

> Еще раз объясняю: "бумаги" могут быть РАЗНЫМИ по сути.
еще раз. не плоди сущностей. пока в вопросе не фигурирует ничего из того что ты навоображал. и это не помогает пониманию...
автор не может разобраться и с "не увешанным деталями минимумом", а ты его еще всякой фигней "грузишь", ну и делай тогда все за него, он теперь на тебя надеется... ;)

> А допустить что бывает еще по-другому религия очевидно не дает :)
не религия. вопрос.


MsGuns   (2009-03-17 16:47:00) [29]

>sniknik ©   (17.03.09 13:09) [50]
>ну во первых, насколько помню, никто не обязывал "вводить непосредственно в базу", и даже >предлагалось использовать "оторванный" рекордсет... возможно в BDE это бы и не прошло, но уж >механизм CachedUpdates там точно есть.
>т.е. "вводить непосредственно" необязательно.

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

>во вторых, даже если бы изменения и вводятся в базу, что с того (это даже хорошо если мы этот >порядок хотим сохранять)? это же был бы только индекс по дополнительному, ни к чему не >обязывающему, в остальных аспектах, полю ...
>оригинальный, ваш горячо любимый, порядок ввода сохранился бы, хотя он то как раз в базах >НИЧЕГО не значит. значат только данные по которым можно упорядочивать.

Ага, а что делать при вводе другой "бумаги" со свом "порядковым номером" ? Добавить еще одно "служебное" поле "Номер бумаги", а затем еще "номер талмуда" или чего-то-там-еще ?

>с чего это не будет совпадать, если мы его ОТОБРАЗИМ в этом порядке (поле со значениями >порядка "по бумаге" есть). включили нужный индекс/сортировку/ордер в запрос и будет нужный, >не нужен - выключили, нужен другой? - включаем второй индекс.

Еще раз объясняю: "бумаги" могут быть РАЗНЫМИ по сути. Всех одной гребенкой не пригребешь - отсюда и ОТОБРАЗИТЬ правильно не сможешь.

>а по моему все предельно ясно...
>берем вопрос автора "чистый" от его понимания реализации т.е.
>что тут невнятного?
>и ответ, полностью на него отвечающий.
>> [1] заведи поле для упорядочивания, потом меняй значения

Ключевое слово "по моему". А допустить что бывает еще по-другому религия очевидно не дает :)

>а вот позвольте с вами не согласится... имхо такое.

Да на здоровье. Тем более, что ты "только развлекаешься" :)


Mishechka   (2009-03-17 14:19:00) [30]

Ребята, я извиняюсь за за то, что плохо сформулировал свой вопрос, но это ради того, чтобы его упростить. Пример с фамилиями - только пример, на самом деле программа бухгалтерская и несколько сложнее, просто если всё изложить, то вы замучаетесь читать. Скажу только, что три года назад я купил книгу Валерия Фаронова "Система программирования DELPHI" и за пару месяцев сварганил для жены программу, которую она полгода ломала, а я исправлял, пока не наступил тот момент, когда программа перестала зависать и ломаться. После чего она занесла в неё данные и пользуется ею по сей день, ведёт уже три предприятия. С тех пор я программированием не занимался. На сегодняшний день, кардинально изменять программу, пока не создана более совершенная, нет возможности, ведь нужно не потерять все данные. Потому я и решил пока ограничитья либо двумя кнопками "Вверх" и "Вниз", либо перетаскиванием записей. Но тем не менее, MsGuns в [43] абсолютно точно понял и изложил суть задачи, просто у меня вместо фамилий, так называемые проводки (ордера, разброс по счетам, подсчёт сумм за месяц, квартал, полгода, 9 месяцев, год, баланс, остаток на следующий год и т.д.), словом всякая бухгалтерская дребедень.

> Задача
> Как сделать программу, чтобы
> а) данные с "бумаги" в процессе ввода распололагались точно
> в том же порядке, в котором они на "бумаге". Для удобства
> полноты и правильности контроля оператором.
> б) после того, как оператор ввел всю "бумагу", данные были
> перенесены в БД, при этом новые ФИО были бы добавлены в
> БД, а з/пл "разнесены корректно.
> в) после добавления новых данных в БД все записи отобразились
> бы в том, порядке, который требуется "вц"
>
> Как это сделать с помощью единственного НД и спецключа "порядок"
> ?
>
> Если я нарисовал картину не так как надо, значит я действительно
> неверно понял суть задачи.

Спасибо, MsGuns, это именно то, что мне и надо.
А пока, всё-таки, прошу помочь с кнопками. Спасибо.


sniknik   (2009-03-17 13:09:00) [31]

> Если инфу вводить непосредственно в базу
ну во первых, насколько помню, никто не обязывал "вводить непосредственно в базу", и даже предлагалось использовать "оторванный" рекордсет... возможно в BDE это бы и не прошло, но уж механизм CachedUpdates там точно есть.
т.е. "вводить непосредственно" необязательно.

во вторых, даже если бы изменения и вводятся в базу, что с того (это даже хорошо если мы этот порядок хотим сохранять)? это же был бы только индекс по дополнительному, ни к чему не обязывающему, в остальных аспектах, полю ...
оригинальный, ваш горячо любимый, порядок ввода сохранился бы, хотя он то как раз в базах НИЧЕГО не значит. значат только данные по которым можно упорядочивать.

> будет определяться условиями ОТОБРАЖЕНИЯ БД и не совпадать с "бумагой".
с чего это не будет совпадать, если мы его ОТОБРАЗИМ в этом порядке (поле со значениями порядка "по бумаге" есть). включили нужный индекс/сортировку/ордер в запрос и будет нужный, не нужен - выключили, нужен другой? - включаем второй индекс.

> В целом, конечно, Сергей (Герман) прав - автор невнятно сформулировал вопрос
а по моему все предельно ясно...
берем вопрос автора "чистый" от его понимания реализации т.е.
> [0] Мне необходимо менять порядок следования записей в DBGrid...
что тут невнятного?
и ответ, полностью на него отвечающий.
> [1] заведи поле для упорядочивания, потом меняй значения

зачем к этому добавлять еще какие то сущности? типа второго порядка, записываемого порядка, порядка ввода, порядка в стрингриде, собственно сам стринггрид, другую таблицу...
если у него с этим и возникнут проблемы то потом, а пока он даже с простейшим не разобрался.

> "задачей" же своей видел не во "внесении хаоса"
а вот позвольте с вами не согласится... имхо такое.


MsGuns   (2009-03-17 12:23:00) [32]

>sniknik ©   (17.03.09 10:27) [48]
>задача MsGuns-а внести хаос в обсуждение. запутывание простых вещей.

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

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

43 я все-таки "читал" в т.ч. последнюю фразу, на которую ты, очевидно, не обратил внимания.

В целом, конечно, Сергей (Герман) прав - автор невнятно сформулировал вопрос и в итоге неясно что ему нужно и каким боком тут вообще "перетаскивание" (Drag&Drop)

"задачей" же своей видел не во "внесении хаоса", а подсказать автору способ при котором отпадает вообще необходимость что-либо перетаскивать (и соответственно сильно усложнять код ненужными громоздкими деталями), а "технологичность" программы только выиграет.


sniknik   (2009-03-17 10:27:00) [33]

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

> Ты [43] читал ?
а то. там ты пытаешься запутать простую вещь вводя дополнительные, не фигурирующие в основном вопросе сущности...
типа второй не связанной с первой упорядоченности...
это проблема? если нужно 2 несвязанные, введи 2 поля упорядочивания...

хотя и это не нужно, при внимательном прочтении, т.к.  
> 2. Есть опредеденный неким "вц" "порядок" следования этих самых ФИО, например, по году рождения:
один из порядков у тебя естественный. второй искуственно настраиваемый по полю.

p.s. ты сам то [43] читал? или только писал?


MsGuns   (2009-03-17 09:30:00) [34]

>sniknik ©   (17.03.09 00:21) [45]

Ты [43] читал ?


Германн   (2009-03-17 00:38:00) [35]

Складывается у меня упорное мнение, что все участники данного обсуждения решают разные задачи. В чём-то сходные, но всё равно разные.
А всё потому, что автор свою задачу не смог или не захотел объяснить.


sniknik   (2009-03-17 00:21:00) [36]

> Как это сделать с помощью единственного НД и спецключа "порядок" ?
про спецключ речь не шла (просто у понятие ключ вообще то вполне определенное понятие. не надо сюда ключи пусть и спец вмешивать), простое поле для упорядочивания  
легко

1  Б   10000
2  Ж  15000 (+)
3  А   17500
4  Г   20000
5  В

первое поле это оно и есть, с нужными значениями...
хочется сменить порядок, например поменять местами  "Ж  15000 (+)" и "А   17500"?
тоже легко, в Ж" вставляем 3, в "А" 2, и при включенной сортировке по этому полю они "сами" поменяются местами, будет уже в новом порядке.  

> При условии, что Ж родился до А и позже Б
да плевать, порядок определяется значениями "нашего" поля, что будет в остальных записях абсолютно неважно.
(не, если хочется еще и сохранять так же упорядочено, будет чуть сложнее, но про сохранение речи не было... в вопросе по крайней мере. после вроде упоминали.)


MsGuns   (2009-03-16 21:58:00) [37]

Пардон, я не написал результат.
Б 10000
Ж 15000 (+)
А  17500
Г 20000
В

При условии, что Ж родился до А и позже Б


MsGuns   (2009-03-16 21:55:00) [38]

>sniknik ©   (16.03.09 16:56) [41]
>даже при отсутствии "поля для упорядочивания", они и будут именно в том >порядке в котором их заносят.
>а если оно есть, + сортированное, то туда достаточно вносить авто
>(/просто)инкрементное значение, и они не только будут в этом порядке, но >и его можно будет менять меняя их значения, и сохранять именно в этом >порядке.
>и вот нафига еще добавлять стринглист в схему? все и так можно сделать >лучше и без лишних "телодвижений".
>ты читал начало?

1. Имеется база, в которой есть ФИО. Например: А,Б,В,Г
2. Есть опредеденный неким "вц" "порядок" следования этих самых ФИО, например, по году рождения:
 Б
 А
 Г
 В
3. Есть некоторые данные, поступающие на бумаге в произвольном порядке, при этом часть ФИО из этой бумаги мжет отсутствовать в БД. Данные, напнример, о з/пл за месяц
Ж 15000
А  17500
Г  20000
Б  10000

Задача
Как сделать программу, чтобы
а) данные с "бумаги" в процессе ввода распололагались точно в том же порядке, в котором они на "бумаге". Для удобства полноты и правильности контроля оператором.
б) после того, как оператор ввел всю "бумагу", данные были перенесены в БД, при этом новые ФИО были бы добавлены в БД, а з/пл "разнесены корректно.
в) после добавления новых данных в БД все записи отобразились бы в том, порядке, который требуется "вц"

Как это сделать с помощью единственного НД и спецключа "порядок" ?

Если я нарисовал картину не так как надо, значит я действительно неверно понял суть задачи.


Mishechka   (2009-03-16 18:49:00) [39]

Ребята!
Я сделал сортированное поле для упорядочивания, меняя значения этого поля - меняю порядок расположения записей, поставил на форму две кнопки "Вверх" и "Вниз" - думаю, так Марьванне будет проще передвигать записи.

Потом застрял и вот такое навоял:

procedure TfmProv.UpBtnClick(Sender: TObject);
begin
 if not Prov.FindFirst then
   UpBtn.Enabled := True;
   Prov.Edit;
   ProvPNo.Value := ProvPNo.Value -1;
   Prov.Prior;
 if Prov.FindFirst then UpBtn.Enabled := False;
end;

procedure TfmProv.DownBtnClick(Sender: TObject);
begin
 if not Prov.FindLast then
   DownBtn.Enabled := True;
   Prov.Edit;
   ProvPNo.Value := ProvPNo.Value +1;
   Prov.Next;
 if Prov.FindLast then DownBtn.Enabled := False;
end;

Подскажите с кодом для кнопок, пожалуйста. Спасибо.


sniknik   (2009-03-16 16:56:00) [40]

> чтобы опер мог перенести данные с "бумаги" в том порядке, в котором они там нарисованы.
даже при отсутствии "поля для упорядочивания", они и будут именно в том порядке в котором их заносят.
а если оно есть, + сортированное, то туда достаточно вносить авто(/просто)инкрементное значение, и они не только будут в этом порядке, но и его можно будет менять меняя их значения, и сохранять именно в этом порядке.

и вот нафига еще добавлять стринглист в схему? все и так можно сделать лучше и без лишних "телодвижений".

ты читал начало?


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

Наверх

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