Модератор: Модераторы
jotto писал(а):Как узнать число выводимых строк в dbgrid? Заодно и номер текущей строки?
// --------- Записи должны быть отфетчены--------------------
// Для лазаруса:
// RowCount := IntToStr(TCustomDrawGrid(DbGrid1).VisibleRowCount
// Row := IntToStr(TCustomDrawGrid(DbGrid1).Row
// -----------------------------------------------------------
unit sgpMain;
interface
uses
Math,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids, Buttons, IBCustomDataSet, IBQuery,
IBDatabase, IBUpdateSQL, StdCtrls, ExtCtrls;
type
TMyDBGrid = class(TDBGrid);
TGridPos = record
Row: Integer;
RowCnt: Integer;
end;
TForm1 = class(TForm)
DBGrid1: TDBGrid;
sbtReOpen: TSpeedButton;
sbtOK: TSpeedButton;
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBQuery1: TIBQuery;
DataSource1: TDataSource;
rdgHow: TRadioGroup;
procedure sbtReOpenClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure sbtOKClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
function GetGridPos(Grid: TDBGrid): TGridPos;
procedure SetGridPos(Grid: TDBGrid; gp: TGridPos);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
gridPos: TGridPos;
recID: Int64;
implementation
{$R *.dfm}
function TForm1.GetGridPos(Grid: TDBGrid): TGridPos;
begin
with Result do
begin
Row := TMyDBGrid(Grid).Row;
RowCnt := TMyDBGrid(Grid).RowCount;
end;
end;
procedure TForm1.SetGridPos(Grid: TDBGrid; gp: TGridPos);
var
gOffSet, rOffSet: Integer;
begin
with TIBQuery(Grid.DataSource.DataSet) do
{----------------------------------}
if (RecordCount > gp.RowCnt) then
begin
FetchAll;
rOffset := RecordCount - RecNo;
gOffSet := (gp.RowCnt - 1 - gp.Row);
MoveBy(gOffSet);
gOffSet := - Min(gOffSet, rOffset);
MoveBy(gOffSet);
end;
{------------------или так-----------------}
with TADOQuery(Grid.DataSource.DataSet) do
if (gp.Row<=gp.RowCnt/2) then
begin
rOffset := RecordCount - RecNo;
gOffSet := (gp.RowCnt - 1 - gp.Row);
MoveBy(gOffSet);
gOffSet := - Min(gOffSet, rOffset);
MoveBy(gOffSet);
end
else
begin
rOffset := RecordCount - RecNo;
gOffSet := (gp.Row - 1);
ShowMessage(IntToStr(-gOffSet));
MoveBy(-gOffSet);
gOffSet := Max(gOffSet, rOffset);
MoveBy(gOffSet);
ShowMessage(IntToStr(-gOffSet));
end;
{----------------------------------------------}
end;
procedure TForm1.FormShow(Sender: TObject);
begin
with IBDatabase1 do
begin
DatabaseName :=
'LocalHost:C:\Program Files\Common Files\Borland Shared\Data\EMPLOYEE.GDB';
Connected := True;
end;
with IBQuery1 do
begin
SQL.Text := 'SELECT EMP_NO, FULL_NAME FROM EMPLOYEE';
Open;
end;
with rdgHow.Items do
begin
Clear;
Add('Close-Open ïðîñòîé');
Add('Close-Open ñ Locate');
Add('Close-Openñ Locate è ñîõðàíåíèåì ïîçèöèè');
end;
end;
procedure TForm1.sbtReOpenClick(Sender: TObject);
begin
with IBQuery1 do
begin
DisableControls;
case rdgHow.ItemIndex of
1: recID := IBQuery1.Fields[0].AsInteger;
2: begin
recID := IBQuery1.Fields[0].AsInteger;
gridPos := GetGridPos(DBGrid1);
end;
end;
Close;
Open;
case rdgHow.ItemIndex of
1: Locate('EMP_NO', recID, []);
2: if Locate('EMP_NO', recID, []) then
SetGridPos(DBGrid1, gridPos);
end;
EnableControls;
end;
end;
procedure TForm1.sbtOKClick(Sender: TObject);
begin
Self.Close;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IBDatabase1.Connected := False;
end;
end.
Сейчас этот форум просматривают: Yandex [Bot] и гости: 246