Главная страница
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]
>> то можно реализовать еще одну сетку, не связанную с БД (стрингрид например),
>и опять, а нафига?

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


 
sniknik ©   (2009-03-16 16:56) [41]

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

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

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


 
Mishechka ©   (2009-03-16 18:49) [42]

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

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

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;

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


 
MsGuns ©   (2009-03-16 21:55) [43]

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

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

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

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

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


 
MsGuns ©   (2009-03-16 21:58) [44]

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

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


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

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

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

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

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


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

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


 
MsGuns ©   (2009-03-17 09:30) [47]

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

Ты [43] читал ?


 
sniknik ©   (2009-03-17 10:27) [48]

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

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

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

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


 
MsGuns ©   (2009-03-17 12:23) [49]

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

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

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

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

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

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


 
sniknik ©   (2009-03-17 13:09) [50]

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

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

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

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

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

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


 
Mishechka ©   (2009-03-17 14:19) [51]

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

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

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


 
MsGuns ©   (2009-03-17 16:47) [52]

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

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

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

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

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

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

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

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

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

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


 
sniknik ©   (2009-03-17 17:03) [53]

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

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

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

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


 
Mishechka ©   (2009-03-17 18:05) [54]


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


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

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

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


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

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


 
Mishechka ©   (2009-03-17 22:27) [57]


> Германн ©   (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]
>
> Это либо враньё, либо "отмазка".
>

??? Спасибо.


 
sniknik ©   (2009-03-17 22:29) [58]

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


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

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

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



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


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

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


 
девушка   (2009-03-18 07:40) [61]

Вопрос в догонку:
Может быть кто-то решал подобную задачу для cxGrid?
Может быть там уже есть своя нумерация строк?


 
sniknik ©   (2009-03-18 08:07) [62]

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

да проще. но только со знаком наоборот.

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


 
MsGuns ©   (2009-03-18 09:19) [63]

>sniknik ©   (18.03.09 08:07) [62]
>перенос туда, ручной апдейт оттуда,

Чевой-чевой ? Ты почитай внимательно-то :)

>решение проблем с тормозами на даже не очень большом(по меркам рекордсета) количестве данных,

Кхмм..  "пакетная" запись параметрическими запросами в контексте одной транзакции тормознутее одиночных апдейтов с каждоразной перечиткой ? Ну-ну
И что за "тормоза" от стрингрида на сотне-другой записей (больше "ручной" документ обычно не содержит)

>отказ(или переписывание) от сортировок/фильтров/детайлов,  

Причем тут сортровки/фильтры и откуда появился "детайл" - фантазируем помаленьку ?

>работа с числами/датами/мемо/...

И что за трабла ? Тот же самый пирог, что и в BeforePost для датасета. Не вижу разницы.
А мемо <80  Ты б еще картинки или оле сюда б приплел, ей-богу пожалей мой живот :)

>через "Ж" т.е. через текстовое представление,  и все ради того чтобы при обмене записей на >пару строк меньше. а по сути тоже самое, написать?

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

Хотя довольно - спор ИМХО уже давно вышел за рамки сабжа
:)


 
sniknik ©   (2009-03-18 11:06) [64]

> Чевой-чевой ? Ты почитай внимательно-то :)
по моему мы уже выяснили, что я гораздо более внимательнее тебя...
вот напиши сохранение в базу со стринггрида. а в варианте с кешированным датасетом это просто вызов ApplyUpdates (для BDE или аналог для другого движка).

> Кхмм..  "пакетная" запись параметрическими запросами в контексте одной транзакции тормознутее одиночных апдейтов с каждоразной перечиткой ? Ну-ну
действительно, ну-ну... у меня уже возникают сомнения что вообще с базами работал...
итак, уже упомянутый ApplyUpdates vs ""пакетная" запись параметрическими запросами в контексте одной транзакции" со стринггрида...
предлагай реализацию и мерь скорость выполнения. а да, реализация желательно должна быть проще ;), т.к. "А со стрингридом-то на порядок прощее", твои слова.

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

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

> совершенно не напрягая ни ее, ни движок, ни сервер.
а ты вообще с базами работал? ответь кого "напрягает" "оторванный/кешированный" рекордсет?

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

> Хотя довольно - спор ИМХО уже давно вышел за рамки сабжа
действительно. и чего это я так долго с ламером... надеялся на лучшее.


 
Mishechka ©   (2009-03-18 12:34) [65]

sniknik ©   (17.03.09 22:29) [58]
Спасибо, сейчас попробую. Только мне не ясно, что это - ADODataSet, этот код для ADO? У меня BDE, Paradox, D7.


 
sniknik ©   (2009-03-18 12:43) [66]

> Только мне не ясно, что это - ADODataSet, этот код для ADO? У меня BDE, Paradox, D7.
а это чтобы не расслаблялся... не копипастил тупо. и там еще по той же причине нет кода для второй кнопки (хотя принципиально он не отличается...).


 
Mishechka ©   (2009-03-18 15:42) [67]


> а это чтобы не расслаблялся... не копипастил тупо. и там
> еще по той же причине нет кода для второй кнопки (хотя принципиально
> он не отличается...).
>

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


 
sniknik ©   (2009-03-18 17:42) [68]

> Всё работает за исключением одного момента: ...
как наисправлял то и получил...


 
Mishechka ©   (2009-03-18 18:42) [69]


> как наисправлял то и получил...


Я почти ничего не наисправлял, кроме подчёркнутых строк...

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


 
MsGuns ©   (2009-03-18 21:27) [70]

>sniknik ©   (18.03.09 11:06) [64]
>действительно, ну-ну... у меня уже возникают сомнения что вообще с >базами работал...

Эгеж, я вообще только позавчера родился ;)))

Спор продолжать бессмысленно, т.к. ты, похоже, считаешь что есть только два мнения - твое и неправильное ;)

На сем позволь отклаянться ;)


 
sniknik ©   (2009-03-18 22:53) [71]

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


 
Германн ©   (2009-03-19 01:39) [72]


> sniknik ©   (18.03.09 22:53) [71]
>
> > Я почти ничего не наисправлял, кроме подчёркнутых строк.
> ..

Имхо, партизан вставил в код твою гранату, Но эта граната оказалась "не той системы". :)


 
sniknik ©   (2009-03-19 02:15) [73]

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


 
Германн ©   (2009-03-19 02:42) [74]


> граната там всегда была... это существование реальной позиции
> в файловых таблицах.

А автор сказал, что у него "BDE, Paradox, D7."
:)


 
Mishechka ©   (2009-03-19 20:57) [75]


> при включенном индексе эти позиции "поплыли". а там сравнение
> по ним


Я это понял, когда отключил ключ. Может просветишь, что это такое? А то я вроде доковырял, но больше интуитивно. Глянь что получилось:

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

procedure TForm1.Button1Click(Sender: TObject);
var
SavePos: TBookmark;
S1Value, S2Value: integer;
begin
with ADODataSet1 do
  if not Bof 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;

Если неправильно, то укажи где, буду благодарен.


 
sniknik ©   (2009-03-19 21:20) [76]

> Я это понял, когда отключил ключ.
машина не заводится и поэтому я слил бензин... отличное, правильное решение! но только... ты вроде хотел ехать?  

> А то я вроде доковырял, но больше интуитивно.  
бросай интуицию и начинай книжки читать.

> Глянь что получилось:
даже если бы не отключил сортировку, получилось полная бессмыслица в условиях... ни одно не сработает, можешь смело выкидывать.
полностью это
with ADODataSet1 do begin
 Button1.Enabled:= not Bof;
 Button2.Enabled:= not Eof;
end;
и это
if not Bof then
... ты сделал им "кастрацию".

и кстати хорошо конечно что перешел на ADO, но тогда какой смысл было коверкать мой код? мой как раз под ADO рабочий на 100%.


 
Mishechka ©   (2009-03-20 11:22) [77]

Ты меня не понял. Я отключал ключ, когда искал причину, потом снова включил, иначе какой смысл?
На ADO я не переходил, просто чтобы тебя не сбивать, показывал свои действия на твоём же коде, а вместо ADODataSet1 я ссылаюсь на свою таблицу, и мой код другой:

procedure TfmProv.SourceProvDataChange(Sender: TObject; Field: TField);
begin
with Prov do begin
  UpBtn.Enabled:= not Bof;
  DownBtn.Enabled:= not Eof;
end;
end;

procedure TfmProv.UpBtnClick(Sender: TObject);
var
SavePos: TBookmark;
S1Value, S2Value: integer;
begin
with Prov do
  if not Bof then begin
    DisableControls;
    try
      SavePos:= GetBookmark;
      try
        S1Value:= ProvPNo.AsInteger;
        Prior;
        S2Value:= ProvPNo.AsInteger;
        Edit;
        ProvPNo.AsInteger:= S1Value;
        Post;
        GotoBookmark(SavePos);
        Edit;
        ProvPNo.AsInteger:= S2Value;
        Post;
      finally
        FreeBookmark(SavePos);
      end;
    finally
      EnableControls;
    end;
  end;
  DBGridProv.SetFocus;
end;

procedure TfmProv.DownBtnClick(Sender: TObject);
var
SavePos: TBookmark;
S1Value, S2Value: integer;
begin
with Prov do
  if not Eof then begin
    DisableControls;
    try
      SavePos:= GetBookmark;
      try
        S1Value:= ProvPNo.AsInteger;
        Next;
        S2Value:= ProvPNo.AsInteger;
        Edit;
        ProvPNo.AsInteger:= S1Value;
        Post;
        GotoBookmark(SavePos);
        Edit;
        ProvPNo.AsInteger:= S2Value;
        Post;
      finally
        FreeBookmark(SavePos);
      end;
    finally
      EnableControls;
    end;
  end;
  DBGridProv.SetFocus;
end;

Вообще-то, о коде я тоже хотел спросить. В книжках учат писать так:

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
 if Button1.Enabled = False then
   Button1.Enabled := True;
 if not Table1.Bof then
   Button1.Enabled := True;
 if Table1.Bof then
   Button1.Enabled := False;
 if Button2.Enabled = False then
   Button2.Enabled := True;
 if not Table1.Eof then
   Button2.Enabled := True;
 if Table1.Eof then
   Button2.Enabled := False;
end;

Если ADODataSet1 заменить на Table1, то у тебя было бы так:

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

Как правильно писать и где об этом почитать? Мне кажется, что сколько людей напишут, столько и будет вариантов, а как всё-таки правильно?


 
MsGuns ©   (2009-03-20 13:04) [78]

Что же Вам еще писать - уже столько понаписано :)
Есть два (упрощенно) способа

Первый (Sniknik) - все делать с помощью датасета, "привязанного" к БД с возможностью отложеннных (кэшированых) изменений. Для  расположения записей (как старых, так и добавленных в сеансе) в нужном порядке надо использовать возможности датасета, т.е. сортировки, индексы и т.д. в том числе и варианты с добавлением в саму ТАБЛИЦУ БД специальных полей.
Для  того, чтобы это сделать, нужно почитать о работе с АДО-ми компонентами (TADODataSet например) и НАУЧИТЬСЯ.

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

Какой способ выбрать - Вам решать, однако реализовывать его придется также Вам самому и если Вы ждете, что кто-то здесь за Вас нарисует готовый код, то сильно заблуждаетесь :)


 
sniknik ©   (2009-03-20 13:58) [79]

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

> и мой код другой:
неважно, как уже сказал условия бессмысленные  (на самом деле эта добавка вида not Bof у меня была ради единственного состояния - пустого рекордсета, все остальное что ты выкинул как раз основное, рабочее. и думать тебе нужно над ним, а не над "пустышкой вставленной на всякий случай")

> В книжках учат писать так:
это в каких книжках? библия дельфи глазами хакера? ... в нормальных учат так НЕ писать.

> а как всё-таки правильно?
как работает так и правильно. если конечно правильно работает...

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

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


 
Mishechka ©   (2009-03-20 18:06) [80]


> нужно почитать о работе с АДО-ми компонентами (TADODataSet
> например) и НАУЧИТЬСЯ.


Согласен, почитать и научиться нужно, но пока у меня BDE, Paradox и способ (Sniknik), который, кроме добавления в талицу одного поля, ничего не требует. Второй способ (msguns) более трудоёмкий, хотя результат будет тот же.


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


В таблице порядок следования записей не меняется, в этом не трудно убедиться с помощью Database Desktop. Это всё работает только в DBGrid в момент заноса данных, что и требовалось.


> если Вы ждете, что кто-то здесь за Вас нарисует готовый
> код, то сильно заблуждаетесь :)
>


Я этого и не ждал, просто словеса желательно подтверждать примером, хотя бы фрагментом кода. Вы музыку слушаете или достаточно ноты почитать? Лично я, книги по Delphi, если там нет демонстрации того, что написано, читать бы не смог, всё-таки не комиксы. Когда в ответ на простой вопрос переходят к сущностям, то сразу напрашивается аналогия с нашими депутатами, а значит, ответа не жди. Помните? - "Вы хочете песен? Их есть у меня!", так для сущностей у меня есть: Шопенгауэр, Монтень и вам советую, полезно даже программистам.


> а можно выкинуть условия. вообще...  ну не будут кнопки
> дизейблиться, но основной то вопрос ветки уже решен...
>


Если пользователь увидит, что кнопка не светится, то и нажимать её не станет. За пользователя ОБЯЗАН! думать программист, а иначе можно было и кнопки не ставить, пусть шастает по сетке, я же не могу опуститься до его уровня. Так вот я могу, потому, что я не программист и знаю, какими идиотскими программами забит интернет, если из сотни найдёшь одну нормальную, то повезло, а ведь программистам, которые их создавали, они явно нравятся. Я буду, либо делать удобно и надёжно, либо не буду делать ничего.


> это в каких книжках? библия дельфи глазами хакера? ... в
> нормальных учат так НЕ писать.
>


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

sniknik, с кодом я ещё не закончил, думаю, он ещё требует внимания.



Страницы: 1 2 вся ветка

Текущий архив: 2009.05.03;
Скачать: CL | DM;

Наверх




Память: 0.82 MB
Время: 0.019 c
4-1209066995
Тыщ
2008-04-24 23:56
2009.05.03
ProcessID и иконка родительской консольной программы


2-1238008511
cyber-pilot
2009-03-25 22:15
2009.05.03
Количество единиц в байте


2-1237207108
Дмитрий
2009-03-16 15:38
2009.05.03
CheckListBox с Columns = 2 без Horizontal Scroll


15-1236073702
Юрий
2009-03-03 12:48
2009.05.03
С днем рождения ! 29 февраля 2009


3-1220360791
Медвежонок Пятачок
2008-09-02 17:06
2009.05.03
Трункануть дату/время в дату на ноль часов ноль минут