Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 júl. 26 12:06 #2059

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
// cell all clear checked
procedure TForm.DBGridCellClear;
begin
  // check all
  SQLQuery.Close;
  SQLQuery.Open;
  SQLQuery.First;
  while not SQLQuery.EOF do begin
        RecList.CurrentRowSelected := False;
        SQLQuery.Next;
  end; // while
end;

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 jún. 03 12:59 #2025

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Végülis ezzel megy:
  Dataset.First;
  while not ( Dataset.EOF ) do begin
    DBGridCellClick( DBGrid.Columns[0] );
    Dataset.Next;
  end;

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 jún. 03 12:45 #2024

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
A linkelt mintában hogyan lehet becsekkolni (és vissza) az összes sort? (select all)
Én úgy próbáltam, hogy meghívtam egy while ciklusban (DataSet-en) a DBGridCellClick() eseményt, de nem egészen jó.

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 máj. 30 13:49 #2014

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
A leírásban is bent volt amit belinkeltem.
ButtonStyle -> cbsCheckBoxColumn

:)

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 máj. 30 13:47 #2013

  • JohnnyK
  • JohnnyK profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 16
Nos, ezek szerint van boolean tartalmú oszlopod a lekérdezésedben ('q'). Ilyen esetben viszont elég a DBGrid megfelelő oszlopának ButtonStyle értékét cbsCheckBoxColumn értékre állítani, és checkbox-szerűen fog kinézni. A kiindulási link olyan kerülőmegoldást mutat be, amikor nincsen ilyen boolean oszlop, mégis szükség volna valamiért egy checkbox oszlopra a DBGridben.

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 máj. 30 13:08 #2012

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Vagy:
  SQLQuery.First;
  while not SQLQuery.EOF do begin
        q:= SQLQuery.FieldByName('q').AsBoolean;
        if (  q ) then
           // checked the checkbox
           DBGridCellClick( DBGrid.Columns[0] );
        SQLQuery.Next;
  end; // while               

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 máj. 30 12:36 #2011

  • JohnnyK
  • JohnnyK profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 16
Ha a kódomat használod, amiben BooleanArray tárolja a checkbox-ok állapotát, akkor pl. a második checkbox bepipálásához ennyit elég beírni egy valamilyen eseménynél:
BooleanArray[2] := True;
DBGrid.Refresh;

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 máj. 30 12:21 #2010

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Hogyan tudok ebbe a DBGrid-be checkbox-okat bekapcsolni, tehát kódból checked-re állítani.

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 máj. 26 12:07 #2009

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 499
  • Köszönetek: 86
Csak egy tipp a könyvjelzőlista elemeinek felhasználására:
procedure KonyvjelzozottRekordokKezelese;
var I:Integer;
begin
	DBGrid1.DataSource.Dataset.DisableControls; { DBGrid1 ne ugráljon amíg alkotunk }
	for I:=0 to DBGrid1.SelectedRows.Count-1 do begin
	 	DBGrid1.DataSource.Dataset.GotoBookmark(TBookmark(DBGrid1.SelectedRows[I]));
  		{ itt azt teszel a rekorddal amit akarsz }
	end;
	DBGrid1.DataSource.Dataset.EnableControls; { DBGrid1 újra követheti az adatforrás változásait }
end;
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

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 máj. 26 11:49 #2008

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Köszönöm! Én is hasonlóra jutottam, annyi különbséggel, hogy egy StringList-be tároltam el a checkbox-al megjelölt ID-ket.

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 máj. 26 10:57 #2007

  • JohnnyK
  • JohnnyK profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 16
Az említett honlapon TBookmarkList objektumot illesztenek a DBGrid-hez RecList néven. Én is úgy tapasztalom, hogy ez önmagában nem alkalmas arra, hogy meg lehessen tudni, hogy pontosan mely sorok lettek kijelölve a DBGrid-ben, legfeljebb annyit lehet megtudni belőle, hogy hány darab pipa lett kiosztva (RecList.Count) összesen.
A RecList és vele együtt a TBookmarkList használata helyett egy olyan ötletem volna, hogy lehetne készíteni egy boolean array-t, ami majd tartalmazza, hogy melyik checkbox milyen állapotú, és könnyű is lekérdezni az állapotát. A linkelt honlapon szereplő példát így írnám át:
var BooleanArray: array of boolean
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
var  i: integer;
begin
  SQLQuery.Last;
  SetLength(BooleanArray, SQLQuery.RecordCount); // hogy pontos legyen a RecordCount értéke
  SQLQuery.First;
  for i := 0 to Length(BooleanArray) - 1 do BooleanArray[i] := False;
end;
 
procedure TForm1.DBGridCellClick(Column: TColumn);
begin
  if Column.Index = 0 then BooleanArray[DBGrid.DataSource.DataSet.RecNo] := not BooleanArray[DBGrid.DataSource.DataSet.RecNo];
end;
 
procedure TForm1.DBGridUserCheckboxState(Sender: TObject; Column: TColumn; var AState: TCheckboxState);
begin
  if BooleanArray[TDBGrid(Sender).DataSource.DataSet.RecNo] = True then AState := cbChecked else AState := cbUnChecked;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  SetLength(BooleanArray, 0);
end;

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 máj. 26 08:02 #2006

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Próbáltam, hogy a 0. mező (checkbox) értékét megnézem:
var x: boolean;// x: variant;
...
x := DBGrid.Columns[0].Field.Value;
...
de elszáll "sigsegv"-vel az alkalmazás. Mit csinálok rosszul?
Ha DBGrid.Columns[1].Field.Value v. DBGrid.Columns[2].Field.Value próbálom, akkor nem száll el a progi. A checkbox mezővel van valami gondja. De nem tudom mi. :(

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 máj. 25 12:37 #2005

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Próbáltam így, de mindig 'False'-ot kaptam:
  SQLQuery.First;
  while not SQLQuery.EOF do begin
    if ( DBGrid.SelectedRows.CurrentRowSelected )
       then
         ShowMessage( 'True' )
       else
         ShowMessage( 'False' );
    SQLQuery.Next;
  end; // for
A megjelölt sorok esetén is 'False' maradt.

DBGRid + Checkbox + TBookmarklist items + CurrentRowSelected 2016 máj. 25 11:38 #2004

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Üdv!
Ez alapján egy DBGridbe tettem checkbox-okat.
Működik is, csak azt nem tudom, hogyan szedjem ki a RecList-ből a kiválasztott rekordokat.
Hogyan tudom elérni azt a CurrentRowSelected property-t a DBGrid-ben?
Az első oszlop (0.) a checkbox, a második (1.) pedig egy id. Azt szeretném megtudni, hogy melyik id-t jelölték be.

  • Oldal:
  • 1