Przesuwanie rekordu o 1 w górę lub w dół

0

Czy ktoś zna jakiś sposób na przesuwanie rekordu o 1 w górę lub w dół w DBGrid w Lazarusie?
Plik .dbf utworzyłem w sposób

          Dbf:=TDbf.Create(Self);
          Dbf.FilePath:=ExePath + 'tablice';
          Dbf.TableName:='tablice_d.dbf';
          Dbf.FieldDefs.Add('_numer', ftString, 100, False);
          Dbf.FieldDefs.Add('_ozn', ftString, 100, False);
          Dbf.FieldDefs.Add('_opis', ftString, 100, False);
          Dbf.CreateTable;
          Dbf.Close;
          Dbf.Free;

Oprogramowałem dwa przyciski (W górę i W dół) i to mi fajnie działa dopóki nie jest zaznaczony pierwszy lub ostatni rekord.
Przycisk w górę

procedure TForm27.ToolButton9Click(Sender: TObject);
var cur_nu, cur_oz, cur_op, up_nu, up_oz, up_op: string;
begin
  cur_nu:=Dbf2.FieldByName('_numer').AsString;
  cur_oz:=Dbf2.FieldByName('_ozn').AsString;
  cur_op:=Dbf2.FieldByName('_opis').AsString;
  Dbf2.MoveBy(-1);
  up_nu:=Dbf2.FieldByName('_numer').AsString;
  up_oz:=Dbf2.FieldByName('_ozn').AsString;
  up_op:=Dbf2.FieldByName('_opis').AsString;
  Dbf2.MoveBy(1);

  Dbf2.Edit;
  Dbf2.FieldByName('_numer').AsString:=up_nu;
  Dbf2.FieldByName('_ozn').AsString:=up_oz;
  Dbf2.FieldByName('_opis').AsString:=up_op;
  Dbf2.Post;

  Dbf2.MoveBy(-1);

  Dbf2.Edit;
  Dbf2.FieldByName('_numer').AsString:=cur_nu;
  Dbf2.FieldByName('_ozn').AsString:=cur_oz;
  Dbf2.FieldByName('_opis').AsString:=cur_op;
  Dbf2.Post;
end;         

I przycisk w dół

procedure TForm27.ToolButton10Click(Sender: TObject);
var cur_nu, cur_oz, cur_op, up_nu, up_oz, up_op: string;
begin

  cur_nu:=Dbf2.FieldByName('_numer').AsString;
  cur_oz:=Dbf2.FieldByName('_ozn').AsString;
  cur_op:=Dbf2.FieldByName('_opis').AsString;
  Dbf2.MoveBy(1);
  up_nu:=Dbf2.FieldByName('_numer').AsString;
  up_oz:=Dbf2.FieldByName('_ozn').AsString;
  up_op:=Dbf2.FieldByName('_opis').AsString;
  Dbf2.MoveBy(-1);

  Dbf2.Edit;
  Dbf2.FieldByName('_numer').AsString:=up_nu;
  Dbf2.FieldByName('_ozn').AsString:=up_oz;
  Dbf2.FieldByName('_opis').AsString:=up_op;
  Dbf2.Post;

  Dbf2.MoveBy(1);

  Dbf2.Edit;
  Dbf2.FieldByName('_numer').AsString:=cur_nu;
  Dbf2.FieldByName('_ozn').AsString:=cur_oz;
  Dbf2.FieldByName('_opis').AsString:=cur_op;
  Dbf2.Post;
end;          

To mi fajnie działa, ale nie radzę sobie jak zablokować możliwość przesunięcia rekordu w górę jeżeli jest zaznaczony pierwszy górny rekord w DBGrid oraz jak zablokować możliwość przesunięcia rekordu w dół jeżeli jest zaznaczony ostatni dolny rekord w DBGrid.
A może jest całkiem inny sposób na przesuwanie rekordów?

3

Ale po co przesuwać rekordy? Takich rzeczy się nie robi. Jeśli zależy Ci na zmiennej kolejności rekordów to dodaj pole Nr i zamieniaj wartości pól. To jest o wiele sensowniejsze rozwiązanie. Takie coś to programistyczny WTF i nie jestem w stanie sobie wyobrazić do czego to miałoby służyć. Potem w aplikacji wyświetlasz rekordy posortowane w/g tego pola i po problemie.

Co więcej, po co sobie utrudniać życie bawiąc się z plikami dbf? Czemu nie użyjesz czegoś wygodniejszego jak SQLite czy chociażby Firebird Embedded. Będziesz miał dostęp do SQL'a a tam coś takiego to kilka update'ów na rekordach.

2

/ciach/

To mi fajnie działa, ale nie radzę sobie jak zablokować możliwość przesunięcia rekordu w górę jeżeli jest zaznaczony pierwszy górny rekord w DBGrid

https://docwiki.embarcadero.com/Libraries/Sydney/en/Data.DB.TDataSet.Bof

oraz jak zablokować możliwość przesunięcia rekordu w dół jeżeli jest zaznaczony ostatni dolny rekord w DBGrid.

https://docwiki.embarcadero.com/Libraries/Sydney/en/Data.DB.TDataSet.Eof

Poza tym w każdym z przypadków warto sprawdzać jeszcze IsEmpty
https://docwiki.embarcadero.com/Libraries/Sydney/en/Data.DB.TDataSet.IsEmpty

A może jest całkiem inny sposób na przesuwanie rekordów?

@Mr.YaHooo napisał co i jak.

0

Przysiadłem się do tematu bo musiałem to zrobić i udało mi się oprogramować dwa przyciski, w górę i w dół.

Przycisk w górę

procedure TForm27.ToolButton9Click(Sender: TObject);
var stack1_nu, stack1_oz, stack1_op,
    stack2_nu, stack2_oz, stack2_op: string;
begin
  stack1_nu:=Dbf2.FieldByName('_numer').AsString;
  stack1_oz:=Dbf2.FieldByName('_ozn').AsString;
  stack1_op:=Dbf2.FieldByName('_opis').AsString;
  Dbf2.MoveBy(-1);
  if not Dbf2.BOF then
  begin
  stack2_nu:=Dbf2.FieldByName('_numer').AsString;
  stack2_oz:=Dbf2.FieldByName('_ozn').AsString;
  stack2_op:=Dbf2.FieldByName('_opis').AsString;
  Dbf2.MoveBy(1);

  Dbf2.Edit;
  Dbf2.FieldByName('_numer').AsString:=stack2_nu;
  Dbf2.FieldByName('_ozn').AsString:=stack2_oz;
  Dbf2.FieldByName('_opis').AsString:=stack2_op;
  Dbf2.Post;

  Dbf2.MoveBy(-1);

  Dbf2.Edit;
  Dbf2.FieldByName('_numer').AsString:=stack1_nu;
  Dbf2.FieldByName('_ozn').AsString:=stack1_oz;
  Dbf2.FieldByName('_opis').AsString:=stack1_op;
  Dbf2.Post;

  end;
end;            

Przycisk w dół

procedure TForm27.ToolButton10Click(Sender: TObject);
var stack1_nu, stack1_oz, stack1_op,
    stack2_nu, stack2_oz, stack2_op: string;
begin
  stack1_nu:=Dbf2.FieldByName('_numer').AsString;
  stack1_oz:=Dbf2.FieldByName('_ozn').AsString;
  stack1_op:=Dbf2.FieldByName('_opis').AsString;
  Dbf2.MoveBy(1);
  if not Dbf2.EOF then
  begin
  stack2_nu:=Dbf2.FieldByName('_numer').AsString;
  stack2_oz:=Dbf2.FieldByName('_ozn').AsString;
  stack2_op:=Dbf2.FieldByName('_opis').AsString;
  Dbf2.MoveBy(-1);

  Dbf2.Edit;
  Dbf2.FieldByName('_numer').AsString:=stack2_nu;
  Dbf2.FieldByName('_ozn').AsString:=stack2_oz;
  Dbf2.FieldByName('_opis').AsString:=stack2_op;
  Dbf2.Post;

  Dbf2.MoveBy(1);

  Dbf2.Edit;
  Dbf2.FieldByName('_numer').AsString:=stack1_nu;
  Dbf2.FieldByName('_ozn').AsString:=stack1_oz;
  Dbf2.FieldByName('_opis').AsString:=stack1_op;
  Dbf2.Post;

  end;
end;        

Gdyby ktoś był w podobnej sytuacji i nie miał pomysłu na zrobienie tego, to proszę bardzo.
Może i to jest WTF...ale działa :)

1

@mcz.rpm:

Może i to jest WTF...ale działa

może i działa, ale nie podpisuję się pod tym rozwiązaniem
Twoje rozwiązanie nasuwa mi takie porównanie ,,
Masz listę nieruchomości (budynków) przy jednej ulicy i chcąc ją uporządkować wg jakiegoś klucza, więc fizycznie przy pomocy ekipy budowlanej przenosisz budynki zamiast zmienić ich numerację na liście

1 użytkowników online, w tym zalogowanych: 0, gości: 1