Lazarus 3.2 (2024.02.28.)
Letöltés

  • Oldal:
  • 1

TÉMA:

DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása 2020 ápr. 04 13:09 #2355

  • progmokus
  • progmokus profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 79
  • Köszönetek: 16
Virtuális pálesz + sör Gábornak! :)
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.2.6
CodeTyphon 8.2

DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása 2020 ápr. 04 13:07 #2354

  • progmokus
  • progmokus profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 79
  • Köszönetek: 16
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!
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.2.6
CodeTyphon 8.2

DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása 2020 ápr. 03 17:58 #2353

  • progmokus
  • progmokus profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 79
  • Köszönetek: 16
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....
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.2.6
CodeTyphon 8.2

DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása 2020 ápr. 03 17:20 #2352

  • progmokus
  • progmokus profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 79
  • Köszönetek: 16
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!
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.2.6
CodeTyphon 8.2

DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása 2020 ápr. 03 12:28 #2351

  • progmokus
  • progmokus profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 79
  • Köszönetek: 16
Kipróbálom és jelentkezem!
Köszi!
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.2.6
CodeTyphon 8.2

DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása 2020 ápr. 03 08:20 #2350

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
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.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64
Megköszönték: progmokus

DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása 2020 ápr. 01 20:15 #2347

  • progmokus
  • progmokus profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 79
  • Köszönetek: 16
Itt egy kép, hogy mit is akarok!
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.2.6
CodeTyphon 8.2
Mellékletek:

DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása 2020 ápr. 01 15:40 #2346

  • progmokus
  • progmokus profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 79
  • Köszönetek: 16
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?
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.2.6
CodeTyphon 8.2

DBGrid kijelölt elemének egyel fel vagy egyel le mozgatása 2020 ápr. 01 15:10 #2345

  • progmokus
  • progmokus profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 79
  • Köszönetek: 16
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!
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.2.6
CodeTyphon 8.2

  • Oldal:
  • 1