Передать положение курсора Tabla через объект?

RY
Дата: 18.02.2003 16:37:53
Здорово всем! :)
Пытаюсь редактировать значение в гриде. Для этого создаю диалог, и в нем редактирую, через DBEdit'ы.
Загвоздка в том что курсор, в диалоге всегда прыгает на 1'ю запись.
Пробовал сделать так.
Создал новый модуль UnProg, в нем описал объект:

type
TMyRecSet=class(TObject)
constructor Create;
function GetCurRec:Integer;
procedure SetCurRec(Value:Integer);
property CurRec: Integer read GetCurRec write SetCurRec default 0;
end;

constructor TMyRecSet.Create;
begin
inherited Create;
end;

function TMyRecSet.GetCurRec:Integer;
begin
GetCurRec:=CurRec;
end;

procedure TMyRecSet.SetCurRec(Value:Integer);
begin
CurRec:=Value;
end;

Дальше делаю так.
Подключаю модуль, описываю переменную объектного типа MyRecSet.

В модуле формы с гридом пишу:

procedure TFormSprApplicants.ToolButton2Click(Sender: TObject);
begin
MyRecSet:=TMyRecSet.Create;
MyRecSet.CurRec:=DataMdlGlobus.ADOTblTenants.RecNo;
BttmDlgApplicant.ShowModal;
DataMdlGlobus.ADOTblTenants.Edit;
end;

Чтобы затем в модуле диалога сделать так:

procedure TBttmDlgApplicant.FormActivate(Sender: TObject);
begin
DataMdlGlobus.ADOTblTenants.MoveBy(MyRecSet.CurRec);
end;
Т.е. питаюсь присвоить нужный номер записи.

Выполнение проги останавливается сообщеним "Stacs overflow" (после некоторой паузы), с указанием на:

GetCurRec:=CurRec;

моего объекта.

Ума не приложу, в чем дело, вроде свойство описано правильно.
Может глюки с ADO?
Подскажите люди добрые!
pkarklin
Дата: 18.02.2003 16:51:44
Вопрос первый, а что, напрямую в гриде редактировать нельзя.
tygra
Дата: 18.02.2003 16:55:14
И второй: при чем тут указатели на запись? Что значит курсор, в диалоге всегда прыгает на 1'ю запись? Как это? Может написал не то- вот и прыгает :)

Ты информации побольше - чего вообще нужно, как делаешь сейчас (без указателей) и т.п.

ЗЫ Пытаюсь редактировать значение в гриде. Для этого создаю диалог, и в нем редактирую, через DBEdit'ы.
Значения в гриде нельзя отредактировать - там их нет Они в датасете :)
m_kus
Дата: 19.02.2003 08:22:42
Курсор прыгает на первую запись, например, когда происходт Refresh или таблица закрывается/открывается...
А stack overflow после паузы - при бесконечной рекурсии, например, когда одна процедура вызывает вторую, а вторая - первую, без дополнительных проверок. В этом случае надо заглянуть в окно Call Stack (вызываемое комбинацией Ctrl-Alt-S сразу после ошибки) и посмотреть, что запускается и в каком порядке...
Может быть у тебя на DataSet.OnDataChange стоит вызов Toolbutton2click, а на активации диалога - Refresh... Неявно, конечно, но чем чёрт не шутит?
pkarklin
Дата: 19.02.2003 08:54:21
To tygra

>Значения в гриде нельзя отредактировать - там их нет Они в датасете :)

Ты же прекрасно понял, что я хотел сказать. Ёрничать то за чем.
RY
Дата: 19.02.2003 09:48:24
To pkarklin.
Конечно ты прав что значения в DataSete, но ведь отображаются они в Gride.
Конечно можно редактировать и непосредственно DataSet через Grid (если уж на то пошло).
Но разве не удобнее создать диалог, в котором будет отображаться редактируемая запись из Grida (тобишь из DataSeta).
В DBEdit'ах этого диалога и будут видны все значения полей текущей записи, там их и редактировать.
Суть в том, что если в Gride я хочу редактировать запись под номером 3, то после генерации диалога, в его DBEdit'ах отображаются значения полей записи номер 1. Как синхронизировать, чтобы при генерации диалога отображались поля 3 записи?
LexusR
Дата: 19.02.2003 10:17:01
Если DBEdit-ы прицеплены к тому же DataSet-у что и DBGrid
то значения в них всегда синхронизированно с курсором в DBGRid
а если они имеют собственный DataSet то имеете-то что имеете.
Если избежать двух DataSet-ов никак нельзя
то после открытия редактируемого DataSet-необходимо
его спозиционировать по значению ключевого поля текущей записи
DBGrid-а методом TDataSet.Locate(Field,Value)
LexusR
Дата: 19.02.2003 10:26:53

type
TMyRecSet=class(TObject)
constructor Create;
function GetCurRec:Integer;
procedure SetCurRec(Value:Integer);
property CurRec: Integer read GetCurRec write SetCurRec default 0;
end;

constructor TMyRecSet.Create;
begin
inherited Create;
end;

function TMyRecSet.GetCurRec:Integer;
begin
GetCurRec:=CurRec; // Вот здесь у тебя и циклится
// метод чтения свойства НИКОГДА НЕ ДОЛЖЕН ОБРАЩАТЬСЯ К ЭТОМУ ЖЕ СВОЙСТВУ

end;

procedure TMyRecSet.SetCurRec(Value:Integer);
begin
CurRec:=Value; //
end;


Данный класс должен быть написан так

TMyRecSet=class(TObject)
FCurrRec : integer
private
function GetCurRec :Integer;
procedure SetCurRec(Value:Integer);
public
constructor Create;
property CurRec: Integer read GetCurRec write SetCurRec default 0;
end;

constructor TMyRecSet.Create;
begin
inherited Create;
end;

function TMyRecSet.GetCurRec:Integer;
begin
GetCurRec:=FCurRec;
end;

procedure TMyRecSet.SetCurRec(Value:Integer);
begin
FCurRec:=Value;
end;

tygra
Дата: 19.02.2003 10:30:25
2 pkarklin
Так я не тебе же :)

2 RY
Так покажи код, как ты вызываешь диалог. Если не делать ненужных вещей, запись остается на том же месте.
pkarklin
Дата: 19.02.2003 10:50:45
>Конечно можно редактировать и непосредственно DataSet через Grid (если уж на то пошло).

Не моно, а нуно. А так ты себе лишний геморой второй день имеешь. Что в гриде нельзя сделать, чего ты сделал через отдельные dbaware контролы?