![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Drag & Drop в DBGrid [D7, Paradox]
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]> чтобы опер мог перенести данные с "бумаги" в том порядке, в котором они там нарисованы.
даже при отсутствии "поля для упорядочивания", они и будут именно в том порядке в котором их заносят.
а если оно есть, + сортированное, то туда достаточно вносить авто(/просто)инкрементное значение, и они не только будут в этом порядке, но и его можно будет менять меняя их значения, и сохранять именно в этом порядке.
и вот нафига еще добавлять стринглист в схему? все и так можно сделать лучше и без лишних "телодвижений".
ты читал начало?