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


Mishechka   (2009-03-20 18:06:00) [1]


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


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


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


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


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


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


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


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


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


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

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


sniknik   (2009-03-20 13:58:00) [2]

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

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

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

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

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

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


MsGuns   (2009-03-20 13:04:00) [3]

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

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

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

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


Mishechka   (2009-03-20 11:22:00) [4]

Ты меня не понял. Я отключал ключ, когда искал причину, потом снова включил, иначе какой смысл?
На 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;

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


sniknik   (2009-03-19 21:20:00) [5]

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

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

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

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


Mishechka   (2009-03-19 20:57:00) [6]


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


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

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;

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


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


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

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


sniknik   (2009-03-19 02:15:00) [8]

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


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


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

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


sniknik   (2009-03-18 22:53:00) [10]

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


MsGuns   (2009-03-18 21:27:00) [11]

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

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

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

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


Mishechka   (2009-03-18 18:42:00) [12]


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


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

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


sniknik   (2009-03-18 17:42:00) [13]

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


Mishechka   (2009-03-18 15:42:00) [14]


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

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


sniknik   (2009-03-18 12:43:00) [15]

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


Mishechka   (2009-03-18 12:34:00) [16]

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


sniknik   (2009-03-18 11:06:00) [17]

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


sniknik   (2009-03-18 08:07:00) [19]

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

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

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


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

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


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

Наверх

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