Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2011, 19:12   #1
shadowmaker
Пользователь
 
Регистрация: 21.07.2009
Сообщений: 21
По умолчанию перемещение строк в dbedit

приветствую, коллеги!

есть mdb-база (ms acces). я ее подключил через adoquery и вывел в dbgrid. хочу сделать чтобы по клику на кнопку выделенная строка перемещалась на одно положение вверх, а та вставала на место первой (кароче разменять местами).

настроил 2 dbedita и срисовал их значения в 2 edita (которые пока что использую в качестве буфера). потом двигался по таблице и вытаскивал из эдитов данные и передавал в таблицу.

Код:
procedure TForm1.Button4Click(Sender: TObject);
begin
  if adoquery1.Fields[0].Value<>1 then
  begin
    edit1.Text:=dbgrid1.Fields[1].Value;
    edit2.Text:=dbgrid1.Fields[2].Value;
    adoquery1.prior;
    //adoquery1.Recordset.MovePrevious;
    edit3.Text:=dbgrid1.Fields[1].Value;
    edit4.Text:=dbgrid1.Fields[2].Value;
    adoquery1.Recordset.MovePrevious;
    dbedit1.Text:=edit1.Text;
    dbedit2.Text:=edit2.Text;
    adoquery1.Recordset.Fields[1].Value:=dbedit1.Text;
    adoquery1.Recordset.Fields[2].Value:=dbedit2.Text;
    //adoquery1.next;
    adoquery1.Recordset.MoveNext;
    dbedit1.Text:=edit3.Text;
    dbedit2.Text:=edit4.Text;
    adoquery1.Recordset.Fields[1].Value:=dbedit1.Text;
    adoquery1.Recordset.Fields[2].Value:=dbedit2.Text;
    adoquery1.Refresh;
  end;
end;
в один момент вроде работало в середине таблицы, но при попытке двигать вторую и третью запись, они уходили в конец таблицы... потом я где-то запутался и теперь вообще не работает.

помогите, плз.
shadowmaker вне форума Ответить с цитированием
Старый 09.02.2011, 19:44   #2
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

не знаю об dbgrid1, но что б в едитах поменять местами текст, нужна строковая переменая, происходит так
строка = едит1
едит1 = едит2
едит2 = строка
надеюсь хоть чемто помог
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 10.02.2011, 12:48   #3
shadowmaker
Пользователь
 
Регистрация: 21.07.2009
Сообщений: 21
По умолчанию

Цитата:
Сообщение от ArtGrek Посмотреть сообщение
не знаю об dbgrid1, но что б в едитах поменять местами текст, нужна строковая переменая, происходит так
строка = едит1
едит1 = едит2
едит2 = строка
надеюсь хоть чемто помог

спасибо за попытку, но мне не это надо.
мне надо в базе данных разменять значения полей двух записей
shadowmaker вне форума Ответить с цитированием
Старый 10.02.2011, 12:59   #4
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Здесь возможны 2 варианта.
1. Поменять местами значение ключевого поля по которому производится сортировка (правда, я не помню, можно ли значение счетчика менять в Access... кажется, нельзя)
2. Поменять местами все остальные значения полей.
Вот, пример процедуры, которая делает это
Код:
procedure MoveRow(Dataset: TDataSet; MoveUp: Boolean);
var bmOld, bmNew: TBookmark;
   v_new, v_old: array[0..50] of Variant; i: Integer;
begin
   with Dataset do
   begin
      bmOld := GetBookmark;
      for i := 0 to FieldCount - 1 do if Fields[i].DataType <> ftAutoInc then v_old[i] := Fields[i].AsVariant;
      if MoveUp then Prior else Next;
      if (Eof) or (Bof) then Exit;
      bmNew := GetBookmark;
      for i := 0 to FieldCount - 1 do if Fields[i].DataType <> ftAutoInc then v_new[i] := Fields[i].AsVariant;

      Edit;
      for i := 0 to FieldCount - 1 do if Fields[i].DataType <> ftAutoInc then Fields[i].AsVariant := v_old[i];
      Post;
      GotoBookmark(bmOld);
      Edit;
      for i := 0 to FieldCount - 1 do if Fields[i].DataType <> ftAutoInc then Fields[i].AsVariant := v_new[i];
      Post;
      GotoBookmark(bmNew);
   end;
end;

Последний раз редактировалось _SERGEYX_; 10.02.2011 в 13:04.
_SERGEYX_ вне форума Ответить с цитированием
Старый 10.02.2011, 14:04   #5
shadowmaker
Пользователь
 
Регистрация: 21.07.2009
Сообщений: 21
По умолчанию

благодарю!
не все в процедуре понял, но работает прекрасно!
спасибо большое.
shadowmaker вне форума Ответить с цитированием
Старый 10.02.2011, 16:25   #6
shadowmaker
Пользователь
 
Регистрация: 21.07.2009
Сообщений: 21
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
Код:
procedure MoveRow(Dataset: TDataSet; MoveUp: Boolean);
var bmOld, bmNew: TBookmark;
   v_new, v_old: array[0..50] of Variant; i: Integer;
поковырялся в процедуре...
маленькое уточнение:

Код:
v_new, v_old: array[0..50] of Variant;
количество элементов в массиве связано с количеством полей?
т.е. если у меня 5 полей, то мне хватит [0..4] массива?
я правильно все понял?
shadowmaker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение строк в таблице (Access) chinara БД в Delphi 6 25.11.2010 13:46
Перемещение по ячейкам строк в DBGrid .Phoenix БД в Delphi 10 25.09.2009 14:32
Считывание строк из файла. перемещение по строкам "веред"-"назад" Larkin. Помощь студентам 2 15.06.2009 17:58
Значение в DBEdit artemavd БД в Delphi 1 15.05.2009 18:17
DBEdit TaTT DoGG Компоненты Delphi 5 19.05.2008 13:18