Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

TDBGrid rendezése 2013 aug. 12 10:32 #1273

  • juhasza
  • juhasza profilkép
  • Új tag
  • Új tag
  • Hozzászólások: 3
  • Köszönetek: 0
Hello
a fenti pédát nem értem sajnos,nekem arra lenne szükségem hogy egy dbgrid titleclick -re a kattintott mező szerint rendezzem a sorokat.
a datasource dbf ,és nincsenek indexek .(egysem)
állítólag delphi -ben van rá fv
csinált már ilyet valaki ?
köszi
ja

Válasz:TDBGrid rendezése 2012 ápr. 13 20:42 #1042

  • pernyei
  • pernyei profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • In Lazarus We Trust
  • Hozzászólások: 54
  • Köszönetek: 1
Sajnos így sem engedi, de közben kínomban én is valami hasonlóra
jutottam:

Type
TSortDBGrid = Class( TDBGrid )
protected
procedure Sort(ColSorting: Boolean; index, IndxFrom,
IndxTo: Integer);override;
end;
PSortDBGrid = ^TSortDBGrid ;
.
.
.
Procedure TSortDBGrid.Sort(ColSorting: Boolean; index,
IndxFrom, IndxTo: Integer);
Begin
INHERITED Sort( ColSorting, index, IndxFrom, IndxTo );
end;
.
.
.
procedure TForm1.GridSort;
Var PGrid: PSortDBGrid;
begin
PGrid := @(dbg_Places);
PGrid^.Sort( ColSort, Idx, IdxFrom, IdxTo );
end;


A dolog szemmel láthatólag müködik, de úgy látszik, a SORT
rutin még fejlesztésre szorul. :(
ColSorting = True esetén, a többi paramétertöl függetlenül,
semmit sem csinál. :(
ColSorting = False esetén az "index" paramétertöl függetlenül,
fogja az IndexFrom-tól IndexTo-ig terjedö oszloptartományt,
megfelezi, és a két felet felcseréli.
Tehát pl. az 1,2 oszlopsorrendböl 2,1 lesz, az 1,2,3-ból 3,2,1,
az 1,2,3,4 -böl 3,4,1,2, az 1,2,3,4,5-böl 4,5,3,1,2, stb.

De ennyiböl már el tudok indulni; ha van lehetőség a TDBGrid
sorinak felcserélésre (mint az oszlopokéra), akkor írhatok
saját Sort rutint, ami a sorokat rendezi...

Nagyon köszönöm a segítségedet! :)

Válasz:TDBGrid rendezése 2012 ápr. 13 18:40 #1041

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Hú... az előbb csak azt nem írtam amit igazából akartam. :S

Próbáld meg typecasting-olni a TDBGrid típusú változót, így:
TCustomGrid(DBGrid1).Sort( ... );
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

Válasz:TDBGrid rendezése 2012 ápr. 13 17:57 #1040

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Sajnos a dokumentáció nem teljesen naprakész, mert a fejlesztés szédületes tempóban halad, ezért sok esetben a forráskódok átnézése valóban többet segít.

A TCustomGrid.Sort() (grids.pas) forráskódja alapján a paraméterek értelmezése szerintem is a következő:

ColSorting ==> sorok vagy oszlopok legyenek rendezve
Index ==> a rendezés alapjául szolgáló mező indexe
IndexFrom ==> rendezés ettől kezdve (sor vagy mező a ColSorting értékétől függően)
IndexTo ==> rendezés eddig (sor vagy mező a ColSorting értékétől függően)

(a tévedés joga fenntartva)
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

Válasz:TDBGrid rendezése 2012 ápr. 13 14:50 #1039

  • pernyei
  • pernyei profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • In Lazarus We Trust
  • Hozzászólások: 54
  • Köszönetek: 1
Sikerült a Sort-ot müködésre bírnom:
Procedure TMyGrid.Sort( ColSorting: Boolean; index: Integer;
IndxFrom: Integer; IndxTo: Integer );
Begin
inherited Sort( ColSorting, index, IndxFrom, IndxTo );
End;

- Gondolom, ez neked nem újdonság. :)

Viszont a paraméterezésével nem boldogulok. :( Vagy egy "grid index out of range" az eredmény (a gridnek több száz sora van, a legnagyobb paraméter, amit megadok: 10), vagy semmi eredmény. :S

Válasz:TDBGrid rendezése 2012 ápr. 13 13:53 #1038

  • pernyei
  • pernyei profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • In Lazarus We Trust
  • Hozzászólások: 54
  • Köszönetek: 1
Köszi a kimerítö választ! :)

Nem, nem értettél félre, a SORT() -ot szeretném müködésre bírni, vagy hasonló eredményt elérni valahogy.

"Nem írtam, de a linkelt oldalon látható, hogy a Sort() egy virtuális metódus... úgy is kell használni. "

Gondolom, itt erre gondolsz:
type
TMyGrid = Class( TDBGrid )
protected
procedure Sort( ColSorting: Boolean; index: Integer;
IndxFrom: Integer; IndxTo: Integer ); override;
end;
.
.
.
Procedure TMyGrid.Sort( ColSorting: Boolean; index: Integer;
IndxFrom: Integer; IndxTo: Integer );
Begin
End;

Ezzel több gondom is adódott.
Az egyik, hogy nem találtam leírást a paraméterekröl. A GRIDS.PAS alapján úgy gondolom, ha az elsö paraméter FALSE, akkor teljes sort rendez, a második par. jelöli az oszlopot, ami alapján rendez, a többi a rekordok tól-ig sorszámát, ami a griden belül rendezendö.
De semmi hatást nem tapasztaltam, hiába hívtam meg a procedúrát. (A Begin...End közé írt utasítások lefutottak, de a rendezés nem történt meg.)

Tudom, én csinálok valamit rosszul, de nem jöttem rá, mit, internettel-guglival együtt sem.

A másik, hogy a TMyGrid-et nem tudom kitenni a Form View-ban, mint a TDBGrid-et, legfeljebb az .lfm-ben írhatom át kézzel, ami után ugyan lefordul és fut is, de a Form View-ról lemondhatok.
:(

Talán megoldás lehetne, ha saját package-et csinálnék belöle, de ha ennyivel se boldogulok, alighanem utópisztikus célkitüzés lenne belevágnom.

Válasz:TDBGrid rendezése 2012 ápr. 13 11:38 #1037

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Lehet én értettelek félre...

Nem írtam, de a linkelt oldalon látható, hogy a Sort() egy virtuális metódus... úgy is kell használni.

A jelek szerint azonban valami másra van szükséged...

A TDBGrid-ben nem támogatott a sorok és oszlopk (cellák) véletlenszerű elérése... ha az aktuális rekord mezőit el akarod érni azt a DataSet (például: TSQLQuery) használatával tedd, így:
osszeg := dataset.fieldbyname('ar').asFloat * dataset.fieldbyname('mennyiseg').asFloat;

Az aktuális rekord váltásához szintén a TDataSet-et metódusait kell használnod First(), Previous(), Next(), Last(), GetRecNo(), SetRecNo(), EOF().

Ha számolgatni kell több rekord adataiból akkor valami ilyesmire van szükséged:
dataset.disablecontrols; // így a dbgrid nem változik közben
osszeg:=0;
dataset.first; // kezdjük elölről
while not dataset.eof do begin
  osszeg := osszeg + (dataset.fieldbyname('ar').asFloat * dataset.fieldbyname('mennyiseg').asFloat);
  dataset.next;
end;
dataset.first; // vissza az elejére
dataset.enablecontrols; // dbgrid újra követheti amit teszünk

Egy tömb elemeit pedig ehhez hasonlóan tudod sorba rendezni:
for i := elemekszama-1 downto 1 do
  for j := 2 to i do
    if (elemek[j-1] > elemek[j]) then begin
      tmp := elemek[j-1];
      elemek[j-1] := elemek[j];
      elemek[j] := tmp;
    end;

Esetleg olvasd el ezt a fórum bejegyzést a fejlécre kattintással történő sorbarendezésről: sorting columns, on OnTitleClick


Remélem valamelyik alapján sikerül összeraknod amit szeretnél.
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

Válasz:TDBGrid rendezése 2012 ápr. 13 07:10 #1036

  • pernyei
  • pernyei profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • In Lazarus We Trust
  • Hozzászólások: 54
  • Köszönetek: 1
Vagy nem stimmel valami, vagy még kevésbé értek hozzá, mint gondoltam (mondjuk, ez sanszos. :S Lazarusban kezdö vagyok.)
A fordító nekem erre ezt mondja:
'identifier idents no member "sort"'
Már a beíráskor sem látható a "." után felbukkanó ablakban. :(

Válasz:TDBGrid rendezése 2012 ápr. 13 04:43 #1035

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Ezzel: TDBGrid.Sort()

A fenti hivatkozás a TCustomGrid.Sort()-ra mutat, de ettől ne ijedj meg, mert a TDBGrid is ennek a leszármazottja.
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

TDBGrid rendezése 2012 ápr. 12 18:21 #1034

  • pernyei
  • pernyei profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • In Lazarus We Trust
  • Hozzászólások: 54
  • Köszönetek: 1
Van valakinek ötlete rá, hogyan lehetne egy TDBGrid sorait (TSQLite3DataSet kapcsolattal) egy computed field szerint rendezni...? A rendezést az SQL-be rakott "Order By" résszel nem tudom megoldani, a sorrend nem a mezök egyszerü értékétöl függ.

  • Oldal:
  • 1