Lazarus 2.0.8 (2020.04.16.)
Letöltés

file DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása

  • progmokus
  • progmokus profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 12
  • Köszönetek: 0

progmokus válaszolt a témára: DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása

Virtuális pálesz + sör Gábornak! :)
#2355

  • progmokus
  • progmokus profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 12
  • Köszönetek: 0

progmokus válaszolt a témára: DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása

Végül is úgy jobb lett ahogy Gábor javasolta!
//adatmodulban
var
  BufDataSet1: TBufDataset; 
....
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  BufDataSet1 := TBufDataset.Create(nil);
  BufDataSet1.FieldDefs.Add('ID', ftInteger,3);
  BufDataSet1.FieldDefs.Add('FIELDKOD',ftString,13);
  BufDataSet1.FieldDefs.Add('FIELDNEV',ftString,50);
  BufDataSet1.IndexFieldNames:='ID';
  BufDataSet1.CreateDataset;
  MemDataSource1.DataSet:= BufDataSet1;
end;               
 
//unit1-ben
 
var szamlalo: integer = 0;
 
//DBGrid aktuális elemét másolom át a BufDataSet-be
procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
  BufDataset1.Append;
  inc(szamlalo);
  BufDataset1.Fields.Fields[0].Value:= szamlalo;
  BufDataset1.Fields.Fields[1].Value:= DataModule1.ZTableCKT.FieldByName('CKTKOD').Value;
  BufDataset1.Fields.Fields[2].Value:= DataModule1.ZTableCKT.FieldByName('CKTNEV').Value;
  BufDataset1.Post;
end;   
 
//felfelé mozgatás
procedure TForm1.ButtonFelClick(Sender: TObject);
var temp1, temp2: integer;
begin
  temp1:= BufDataSet1.FieldByName('ID').Value;
  BufDataSet1.Prior;
  temp2:= BufDataSet1.FieldByName('ID').Value;
  if BufDataSet1.BOF then
    exit
  else
  begin
    BufDataSet1.Edit;
    BufDataSet1.FieldByName('ID').Value:= temp1;
    BufDataSet1.Post;
    BufDataSet1.Next;
    BufDataSet1.Edit;
    BufDataSet1.FieldByName('ID').Value:= temp2;
    BufDataSet1.Post;
  end;
end;
 
//lefelé mozgatás
procedure TForm1.ButtonLeClick(Sender: TObject);
var temp1, temp2: integer;
begin
  temp1:= BufDataSet1.FieldByName('ID').Value;
  BufDataSet1.Next;
  temp2:= BufDataSet1.FieldByName('ID').Value;
  if BufDataSet1.EOF then
    exit
  else
  begin
    BufDataSet1.Edit;
    BufDataSet1.FieldByName('ID').Value:= temp1;
    BufDataSet1.Post;
    BufDataSet1.Prior;
    BufDataSet1.Edit;
    BufDataSet1.FieldByName('ID').Value:= temp2;
    BufDataSet1.Post;
  end;
end;                           
 

És lám jó lett!
Köszi!
#2354

  • progmokus
  • progmokus profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 12
  • Köszönetek: 0

progmokus válaszolt a témára: DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása

Kicsit ágyuval verébre lövős lett.
Lehet Gábornak van igaza és index oszlopot kellene használni..., és másolgatni az indexet?
Majd kipróbálom úgy is....
#2353

  • progmokus
  • progmokus profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 12
  • Köszönetek: 0

progmokus válaszolt a témára: DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása

Sokat filóztam, mit kéne tenni.
Hát elég érdekesen oldottam meg a dolgot, de működik!
Létrehoztam még egy MemDataSet komponenst TempMemDataset néven aminek 2 sort hozok létre induláskor és ezekbe másolgatok.
//adatmodulban
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  TempMemDataset.Append;
  TempMemDataset.Fields.Fields[0].Value:= '';
  TempMemDataset.Fields.Fields[1].Value:= '';
  TempMemDataset.Post;
  TempMemDataset.Append;
  TempMemDataset.Fields.Fields[0].Value:= '';
  TempMemDataset.Fields.Fields[1].Value:= '';
  TempMemDataset.Post;
end;
 
//unit1-ben
procedure TForm1.ButtonFelClick(Sender: TObject);
begin
 
  DataModule1.TempMemDataset.First;  //temp első record
  DataModule1.TempMemDataset.Edit;   //szerkeszt, az aktuális rekord másol ide
  DataModule1.TempMemDataset.Fields.Fields[0].Value:= DataModule1.MemDataset1.FieldByName('FIELDKOD').Value;
  DataModule1.TempMemDataset.Fields.Fields[1].Value:= DataModule1.MemDataset1.FieldByName('FIELDNEV').Value;
  DataModule1.TempMemDataset.post;
 
  DataModule1.MemDataset1.Prior; //aktuális előttire áll
  if (DataModule1.MemDataset1.BOF <> true) then
  begin
 
    DataModule1.TempMemDataset.Next; //temp másodikra áll
    DataModule1.TempMemDataset.Edit; //másolás
    DataModule1.TempMemDataset.Fields.Fields[0].Value:= DataModule1.MemDataset1.FieldByName('FIELDKOD').Value;
    DataModule1.TempMemDataset.Fields.Fields[1].Value:= DataModule1.MemDataset1.FieldByName('FIELDNEV').Value;
    DataModule1.TempMemDataset.post;
    DataModule1.TempMemDataset.First;
 
    DataModule1.MemDataset1.Edit;
    DataModule1.MemDataset1.Fields.Fields[0].Value:= DataModule1.TempMemDataset.FieldByName('TEMPKOD').Value;
    DataModule1.MemDataset1.Fields.Fields[1].Value:= DataModule1.TempMemDataset.FieldByName('TEMPNEV').Value;
    DataModule1.MemDataset1.Post;
 
    DataModule1.MemDataset1.next;
    DataModule1.TempMemDataset.Next;
 
    DataModule1.MemDataset1.Edit;
    DataModule1.MemDataset1.Fields.Fields[0].Value:= DataModule1.TempMemDataset.FieldByName('TEMPKOD').Value;
    DataModule1.MemDataset1.Fields.Fields[1].Value:= DataModule1.TempMemDataset.FieldByName('TEMPNEV').Value;
    DataModule1.MemDataset1.Post;
 
    DataModule1.MemDataset1.Prior;
  end;
 
end;
 
procedure TForm1.ButtonLeClick(Sender: TObject);
begin
  DataModule1.TempMemDataset.First;  //temp első record
  DataModule1.TempMemDataset.Edit;   //szerkeszt, az aktuális rekord másol ide
  DataModule1.TempMemDataset.Fields.Fields[0].Value:= DataModule1.MemDataset1.FieldByName('FIELDKOD').Value;
  DataModule1.TempMemDataset.Fields.Fields[1].Value:= DataModule1.MemDataset1.FieldByName('FIELDNEV').Value;
  DataModule1.TempMemDataset.post;
 
  DataModule1.MemDataset1.Next; //aktuális utánira áll
  if (DataModule1.MemDataset1.EOF <> true) then
  begin
 
    DataModule1.TempMemDataset.Next; //temp másodikra áll
    DataModule1.TempMemDataset.Edit; //másolás
    DataModule1.TempMemDataset.Fields.Fields[0].Value:= DataModule1.MemDataset1.FieldByName('FIELDKOD').Value;
    DataModule1.TempMemDataset.Fields.Fields[1].Value:= DataModule1.MemDataset1.FieldByName('FIELDNEV').Value;
    DataModule1.TempMemDataset.post;
 
    DataModule1.MemDataset1.Prior;
 
    DataModule1.MemDataset1.Edit;
    DataModule1.MemDataset1.Fields.Fields[0].Value:= DataModule1.TempMemDataset.FieldByName('TEMPKOD').Value;
    DataModule1.MemDataset1.Fields.Fields[1].Value:= DataModule1.TempMemDataset.FieldByName('TEMPNEV').Value;
    DataModule1.MemDataset1.Post;
 
    DataModule1.MemDataset1.next;
    DataModule1.TempMemDataset.First;
 
    DataModule1.MemDataset1.Edit;
    DataModule1.MemDataset1.Fields.Fields[0].Value:= DataModule1.TempMemDataset.FieldByName('TEMPKOD').Value;
    DataModule1.MemDataset1.Fields.Fields[1].Value:= DataModule1.TempMemDataset.FieldByName('TEMPNEV').Value;
    DataModule1.MemDataset1.Post;
  end;
end;                                   

Nem tudom, hogy kevesebb lépésből meg lehet e csinálni egyszerübben, de egyenlőre a feladatát elvégzi.
Persze nem jó minden táblára..., de ha van egyszerübb általános megoldás, akkor érdekel!
#2352

  • progmokus
  • progmokus profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 12
  • Köszönetek: 0

progmokus válaszolt a témára: DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása

Kipróbálom és jelentkezem!
Köszi!
#2351

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 426
  • Karma: 8
  • Köszönetek: 68

Gábor válaszolt a témára: DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása

Szia!
Javaslom, hogy a TMemDataset helyett használj TBufDataset komponenst, amivel megoldható az indexelés (TBufDataSet.IndexFieldNames)
Egy extra 'sorrend' oszlop hozzáadása és az indexelés alapjaként történő megadása után, annak értékét változtatva, a sorrend a táblázatban is változik... elvileg.
Most szűkösen vagyok idővel ezért nem tudtam tesztelni az elgondolásomat.
#2350
Megköszönték: progmokus

  • progmokus
  • progmokus profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 12
  • Köszönetek: 0

progmokus válaszolt a témára: DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása

Itt egy kép, hogy mit is akarok!
#2347
Mellékletek:

  • progmokus
  • progmokus profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 12
  • Köszönetek: 0

progmokus válaszolt a témára: DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása

Gondolom, hogy a DBGrid alatt a MemDataSet elemeit kell mozgatni, csak még nem jöttem rá hogyan.
A MemDataSet.Prior és a Next az csak visszább vagy előrébb megy egy rekorddal.
Az aktuális rekordnak van valami dataset beli indexe?
#2346

  • progmokus
  • progmokus profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 12
  • Köszönetek: 0

progmokus létrehozta a témát: DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása

Sziasztok!

Egy DBGrid kijelölt sorát szeretném gombnyomásra egyel fel vagy másik gombra le mozgatni.
A DBGrid egy MemDataSet-hez van kapcsolva amibe összekattintgattam más datasetekből sorokat.
10-30 sor is összejöhet és néha valamelyik sort előrébb vagy hátrébb kellene rakni. A dataset nincs rendezve, nem is kell, akciós élelmiszerlista lenne, minden napra egy sor, ezért nem jó rendezett lista.

Nem birtam rájönni hogy lehet elemeket felcserélni vagy csak nem látom a fától az erdőt....
Ötletek jöhetnek, köszike!
#2345