unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls, ExtCtrls, DB, IBCustomDataSet,
IBTable, IBDatabase;
type
tmpTDBGrid2 = class(TCustomGrid)
public
function Row1 : integer;
function RowCount1 : integer;
end;
tmpTDBGrid = class(TDBGrid)
public
function GetRow : integer;
function GetRowCount : integer;
end;
TForm1 = class(TForm)
DBGrid1: TDBGrid;
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBTable1: TIBTable;
DataSource1: TDataSource;
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function tmpTDBGrid2.Row1 : integer;
begin
result:=Row;
end;
function tmpTDBGrid2.RowCount1 : integer;
begin
result:=RowCount;
end;
function tmpTDBGrid.GetRow : integer;
begin
result:= tmpTDBGrid2(self).Row;
end;
function tmpTDBGrid.GetRowCount: integer;
begin
if dgTitles in Options
then result:= tmpTDBGrid2(self).RowCount - 1
else result:= tmpTDBGrid2(self).RowCount;
end;
procedure TForm1.Button1Click(Sender: TObject);
var grd :TDBGrid;
ds :TDataSet;
tgrd :tmpTDBGrid;
oldri, oldID, newri,vrc : integer;
LocateOptions:TLocateOptions;
begin
grd := DBGrid1;
ds := grd.DataSource.DataSet;
if ds = nil then exit;
if not ds.Active then
begin
ds.Active:= true;
exit;
end;
// Запомнить текущую строку в сетке
tgrd := tmpTDBGrid(grd);
oldri := tgrd.GetRow();
oldID := ds.FieldByName('BOLD_ID').AsInteger;
ds.DisableControls();
try
ds.Active := false;
ds.Active := true;
// Восстановить позицию на запись
ds.Locate('BOLD_ID', oldID, LocateOptions);
newri:= tgrd.GetRow();
vrc:= tgrd.GetRowCount();
if (oldri > vrc {div 2}) // строка из нижней половины - крутить назад
then
begin ds.MoveBy((1-newri) - (oldri - newri));
ds.MoveBy(oldri-1);
end
else // строка из верхней половины - крутить вперед
begin ds.MoveBy(vrc - oldri);
ds.MoveBy(oldri - vrc);
end
finally
ds.EnableControls();
end;
grd.SetFocus();
end;
end.
Сохранить текущую позицию курсора в DBGrid
Мне нужно, что бы после Refresh таблици/запроса курсор в DBGrid оставался на том же месте. Обращаю внимание на то, что не только на тойже записи, но и в томже месте внутри компонента....
т.е.
до
___________________________
1 : asd | 1 |
2 : fgh | 2 | - курсор сдесь.
3 : zxc | 1 |
-------------------------------
после
___________________________
1 : jb | 1 |
2 : fgh | 2 | - курсор сдесь.
3 : zxc | 1 |
-------------------------------
но не так....
___________________________
1 : fgh | 2 | - курсор сдесь.
2 : zxc | 1 |
3 : ;klk | 5 |
-------------------------------
Может быть кто знает, как это сделать.
Сзаранее спасибо.
Цитата: misha_turist
Доброго времени суток!
Мне нужно, что бы после Refresh таблици/запроса курсор в DBGrid оставался на том же месте. Обращаю внимание на то, что не только на тойже записи, но и в томже месте внутри компонента....
т.е.
до
___________________________
1 : asd | 1 |
2 : fgh | 2 | - курсор сдесь.
3 : zxc | 1 |
-------------------------------
после
___________________________
1 : jb | 1 |
2 : fgh | 2 | - курсор сдесь.
3 : zxc | 1 |
-------------------------------
но не так....
___________________________
1 : fgh | 2 | - курсор сдесь.
2 : zxc | 1 |
3 : ;klk | 5 |
-------------------------------
Может быть кто знает, как это сделать.
Сзаранее спасибо.
Мне нужно, что бы после Refresh таблици/запроса курсор в DBGrid оставался на том же месте. Обращаю внимание на то, что не только на тойже записи, но и в томже месте внутри компонента....
т.е.
до
___________________________
1 : asd | 1 |
2 : fgh | 2 | - курсор сдесь.
3 : zxc | 1 |
-------------------------------
после
___________________________
1 : jb | 1 |
2 : fgh | 2 | - курсор сдесь.
3 : zxc | 1 |
-------------------------------
но не так....
___________________________
1 : fgh | 2 | - курсор сдесь.
2 : zxc | 1 |
3 : ;klk | 5 |
-------------------------------
Может быть кто знает, как это сделать.
Сзаранее спасибо.
вот здесь под билдер написано, но при желании под дельфи перевести легко
Уважаемые модераторы подправте название темы пожалуйста не "курсок в DBGrid", а "Курсор в DBGrid" :o
Переписанный под Delphi 7 вариант
Цитата: misha_turist
Переписанный под Delphi 7 вариант
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls, ExtCtrls, DB, IBCustomDataSet,
IBTable, IBDatabase;
type
tmpTDBGrid2 = class(TCustomGrid)
public
function Row1 : integer;
function RowCount1 : integer;
end;
tmpTDBGrid = class(TDBGrid)
public
function GetRow : integer;
function GetRowCount : integer;
end;
TForm1 = class(TForm)
DBGrid1: TDBGrid;
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBTable1: TIBTable;
DataSource1: TDataSource;
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function tmpTDBGrid2.Row1 : integer;
begin
result:=Row;
end;
function tmpTDBGrid2.RowCount1 : integer;
begin
result:=RowCount;
end;
function tmpTDBGrid.GetRow : integer;
begin
result:= tmpTDBGrid2(self).Row;
end;
function tmpTDBGrid.GetRowCount: integer;
begin
if dgTitles in Options
then result:= tmpTDBGrid2(self).RowCount - 1
else result:= tmpTDBGrid2(self).RowCount;
end;
procedure TForm1.Button1Click(Sender: TObject);
var grd :TDBGrid;
ds :TDataSet;
tgrd :tmpTDBGrid;
oldri, oldID, newri,vrc : integer;
LocateOptions:TLocateOptions;
begin
grd := DBGrid1;
ds := grd.DataSource.DataSet;
if ds = nil then exit;
if not ds.Active then
begin
ds.Active:= true;
exit;
end;
// Запомнить текущую строку в сетке
tgrd := tmpTDBGrid(grd);
oldri := tgrd.GetRow();
oldID := ds.FieldByName('BOLD_ID').AsInteger;
ds.DisableControls();
try
ds.Active := false;
ds.Active := true;
// Восстановить позицию на запись
ds.Locate('BOLD_ID', oldID, LocateOptions);
newri:= tgrd.GetRow();
vrc:= tgrd.GetRowCount();
if (oldri > vrc {div 2}) // строка из нижней половины - крутить назад
then
begin ds.MoveBy((1-newri) - (oldri - newri));
ds.MoveBy(oldri-1);
end
else // строка из верхней половины - крутить вперед
begin ds.MoveBy(vrc - oldri);
ds.MoveBy(oldri - vrc);
end
finally
ds.EnableControls();
end;
grd.SetFocus();
end;
end.
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls, ExtCtrls, DB, IBCustomDataSet,
IBTable, IBDatabase;
type
tmpTDBGrid2 = class(TCustomGrid)
public
function Row1 : integer;
function RowCount1 : integer;
end;
tmpTDBGrid = class(TDBGrid)
public
function GetRow : integer;
function GetRowCount : integer;
end;
TForm1 = class(TForm)
DBGrid1: TDBGrid;
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBTable1: TIBTable;
DataSource1: TDataSource;
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function tmpTDBGrid2.Row1 : integer;
begin
result:=Row;
end;
function tmpTDBGrid2.RowCount1 : integer;
begin
result:=RowCount;
end;
function tmpTDBGrid.GetRow : integer;
begin
result:= tmpTDBGrid2(self).Row;
end;
function tmpTDBGrid.GetRowCount: integer;
begin
if dgTitles in Options
then result:= tmpTDBGrid2(self).RowCount - 1
else result:= tmpTDBGrid2(self).RowCount;
end;
procedure TForm1.Button1Click(Sender: TObject);
var grd :TDBGrid;
ds :TDataSet;
tgrd :tmpTDBGrid;
oldri, oldID, newri,vrc : integer;
LocateOptions:TLocateOptions;
begin
grd := DBGrid1;
ds := grd.DataSource.DataSet;
if ds = nil then exit;
if not ds.Active then
begin
ds.Active:= true;
exit;
end;
// Запомнить текущую строку в сетке
tgrd := tmpTDBGrid(grd);
oldri := tgrd.GetRow();
oldID := ds.FieldByName('BOLD_ID').AsInteger;
ds.DisableControls();
try
ds.Active := false;
ds.Active := true;
// Восстановить позицию на запись
ds.Locate('BOLD_ID', oldID, LocateOptions);
newri:= tgrd.GetRow();
vrc:= tgrd.GetRowCount();
if (oldri > vrc {div 2}) // строка из нижней половины - крутить назад
then
begin ds.MoveBy((1-newri) - (oldri - newri));
ds.MoveBy(oldri-1);
end
else // строка из верхней половины - крутить вперед
begin ds.MoveBy(vrc - oldri);
ds.MoveBy(oldri - vrc);
end
finally
ds.EnableControls();
end;
grd.SetFocus();
end;
end.
В принципе работать будет (наверное :)) но вобщето, для этих целей существует TBookmark. Пример работы с ним достаточно подробно описан в хелпе.
Цитата: kot_
В принципе работать будет (наверное :)) но вобщето, для этих целей существует TBookmark. Пример работы с ним достаточно подробно описан в хелпе.
нужно не только сохранять позицию курсора относительно номеру записи, но и относительно контрола, т.е. чтоб курсор (синяя полоска в ДБГрид) был неподвижен относительно других контролов
Спасибо всем, но переписанный мной код работает, и работает хорошо.
Есть DBgrid1 - основная таблица и DBgrid2 которая вызывается на отдельной форме после нажатия кнопки поиск в ней отображаються найденные
записи
1 ая работает через DataSource 2 ая через Query.
Вопрос как сделать чтобы выбрав запись во второй перейти к этой же записи в первой? (в первой у мя возможно редактирование а во второй нет.)
Т.Е. Я делаю двойной клик на записи во 2 таблице, форма с этой таблицей закрываеться, а в первой курсор становиться на запись которую я выбрал во второй.
Прошу прощения если непонятно объяснил я новичок в этом деле и немогу реализовать это сам.....
Если можно пример кода..
Заранее спасибо!
У датасета (TTable, TQuery) есть замечательная функция Locate, с помощью которой можно найти нужную тебе запись по нужному полю(ям) (например, по первичному ключу). Берешь значение нужного поля (полей) выбранной записи второго грида, и вызываешь Locate на датасете первого грида.
Я очень начинающий программист....
Топик выше читал но синтаксис непойму там он в общем виде да?
То есть во втором гриде выбрана 3 строка с (записью 45 к примеру) ,в первом то же выбираеться 3 только не та найденная с записью 45 а просто 3-я строка....
Примечание: Во 2 грид выводяться результаты запроса того что отображаеться в первом гриде и нужно (к примеру после клика) перейти опять в грид 1
к той же строке!
Help me please!