Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сохранить текущую позицию курсора в DBGrid

286
26 марта 2008 года
misha_turist
572 / / 28.11.2005
Доброго времени суток!

Мне нужно, что бы после 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 |
-------------------------------

Может быть кто знает, как это сделать.

Сзаранее спасибо.
11
26 марта 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: 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 |
-------------------------------

Может быть кто знает, как это сделать.

Сзаранее спасибо.



вот здесь под билдер написано, но при желании под дельфи перевести легко

286
26 марта 2008 года
misha_turist
572 / / 28.11.2005
Уважаемые модераторы подправте название темы пожалуйста не "курсок в DBGrid", а "Курсор в DBGrid" :o
286
27 марта 2008 года
misha_turist
572 / / 28.11.2005
Переписанный под 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.
1
29 марта 2008 года
kot_
7.3K / / 20.01.2000
Цитата: 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.


В принципе работать будет (наверное :)) но вобщето, для этих целей существует TBookmark. Пример работы с ним достаточно подробно описан в хелпе.

11
29 марта 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: kot_
В принципе работать будет (наверное :)) но вобщето, для этих целей существует TBookmark. Пример работы с ним достаточно подробно описан в хелпе.



нужно не только сохранять позицию курсора относительно номеру записи, но и относительно контрола, т.е. чтоб курсор (синяя полоска в ДБГрид) был неподвижен относительно других контролов

286
30 марта 2008 года
misha_turist
572 / / 28.11.2005
Спасибо всем, но переписанный мной код работает, и работает хорошо.
47K
28 февраля 2009 года
roma1141
3 / / 28.02.2009
Здравствуйте!
Есть DBgrid1 - основная таблица и DBgrid2 которая вызывается на отдельной форме после нажатия кнопки поиск в ней отображаються найденные
записи
1 ая работает через DataSource 2 ая через Query.
Вопрос как сделать чтобы выбрав запись во второй перейти к этой же записи в первой? (в первой у мя возможно редактирование а во второй нет.)
Т.Е. Я делаю двойной клик на записи во 2 таблице, форма с этой таблицей закрываеться, а в первой курсор становиться на запись которую я выбрал во второй.
Прошу прощения если непонятно объяснил я новичок в этом деле и немогу реализовать это сам.....
Если можно пример кода..
Заранее спасибо!
303
01 марта 2009 года
makbeth
1.0K / / 25.11.2004
У датасета (TTable, TQuery) есть замечательная функция Locate, с помощью которой можно найти нужную тебе запись по нужному полю(ям) (например, по первичному ключу). Берешь значение нужного поля (полей) выбранной записи второго грида, и вызываешь Locate на датасете первого грида.
47K
01 марта 2009 года
roma1141
3 / / 28.02.2009
Спасибо! Только как взять значение (первичный ключ например) на котором позиционируеться курсор можно с примером кусок как взять и кусок как использовать Locate меня синтаксис интересует лучше пример...
Я очень начинающий программист....
Топик выше читал но синтаксис непойму там он в общем виде да?
47K
01 марта 2009 года
roma1141
3 / / 28.02.2009
Пробовал сделать с помощью TBookmark не вышло потому что запоминается текущая позиция грида сверху, а не реальная строка на которую нужно перейти..
То есть во втором гриде выбрана 3 строка с (записью 45 к примеру) ,в первом то же выбираеться 3 только не та найденная с записью 45 а просто 3-я строка....
Примечание: Во 2 грид выводяться результаты запроса того что отображаеться в первом гриде и нужно (к примеру после клика) перейти опять в грид 1
к той же строке!

Help me please!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог