Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизПереопределить метод InternalPost компонента TCustomADODataSet Найти похожие ветки
← →
mvgfirst (2004-01-21 17:45) [0]Пробую создать совой компонент для доступа к данным на основании TCustomADODataSet. Мне нужно переопределить процедуру InternalPost - и запрерить добавлять записи через RecordSet.AddNew.
Вообщем то все получается - я просто скопировал тело метода и закоментировал ненужные мне строки. Но он нежелает компилироваться ввиду того что внутри метода используется доступ к пирватным данным класса TCustomADODataSet. А т.к. мой компонент не находится в одном и том же модуле - то понятное дело он доступ к ним получить неможет.
Подскажите как быть?
← →
mvg_first (2004-01-22 09:05) [1]Никто ничего не предложит? Как можно решить эту проблему, не переписывать же по новой еще и TCustomADODataSet?
← →
Polevi (2004-01-22 09:17) [2]procedure TMyDataset.InternalPost;
begin
if State<>dsInsert then inherited;
end;
← →
mvg_first (2004-01-22 12:07) [3]Понятно. При таком подходе компонент будет работать стандартно во всех случаях кроме добавления записи. Но если я добавляю запись мне ведь нужно будет и обнвоить данные в дата сете. Т.е. сделать так что бы вызвалась процедура UpdateData определенная внтури метода InternalPost в классе TCustomADODataSet. Именно эта процедура и пользуется приватными данными. И как я понимаю - без нее данные в датасете не обновляться?
← →
mvg_first (2004-01-23 17:17) [4]После очередной полуночной атаки на компонент TCustomADODataSet - получилось следующее.
1. Унаследовал класс от TCustomADODataSet
2. Скопировал все методы с TADOQuery (для совместимости)
3. Переопределил метод InternalPost таким образом.,
procedure TADOQueryEx.InternalPost;
var
OldCmdText : String;
begin
If Not FManualUpdate then
Inherited
else
begin
if State = dsInsert then
begin
UpdateCursorPos;
OldCmdText := Command.CommandText;
Command.CommandText := FInsertSQL.Text;
Command.Execute;
Command.CommandText := OldCmdText;
end else
Command.CommandText := FUpdateSQL.Text;
end;
// InternalRefresh;
end;
Так вот если FManualUpdate = false все работает
Чего б ему не работать
А если обратное - то записи не отображаются в гриде добавленные.
Если разкомментировать вызов метода InternalRefresh - запись в гриде появляетя но курсор прагает - в первую строку.
Объяните почему??? И как это предотвратить.
Заранее спасибо за помощь.
← →
Sandman25 (2004-01-23 17:22) [5]Судя по исходнику InternalPost, в нем делается очень многое... А не просто устанавливается Command.CommandText. Постарайтесь добиться нужной функциональности, изменяя по минимуму. Если переписываете метод полностью, нужно четко представлять, что он делает.
PS. Меня не спрашивайте, я не знаю.
← →
mvg_first (2004-01-23 17:31) [6]Не так уж он и много делает всег лишь две вещи Апдейт или Инсерт :) И просто заполняет поля рекордсета. Вот как потом на запись позиционируется я незнаю Проблема как раз в том что он у меня правильно рабоатет просто спрыгивает на первую запись.
Позиционировать через получение специльного индексного поля и потом по нему Locate делать - неочень хочется. Потому как накладывается ограничение на .... вообщем неудобно будет пользоваться. Поэтому ищу способ правильно его спозициоровать.
← →
Sandman25 (2004-01-23 17:36) [7]Посмотрите CheckForFlyAway.
Насколько я понимаю, это то, что Вам нужно.
← →
mvg_first (2004-01-26 17:05) [8]И всторону чего там ковырять?
Скопировал себе функцию CheckForFlyAway и ничего хорошего из этого не получилось. Вызываю ее после метода InternalReauery; но все равно запись улетает вверх. причем если отладчиком пройтись по вышеуказанному методу - то вообщем получается букмарк указывает уже совсем на другую запись.
По моим скромным догадкам - при вызове InternalRequery где то (я не могу понять где) происходит сброс толи букмарков то ли еще чего. В результат функция CheckAorFlyAway уже пробует позиционировать на первую запись.
← →
mvg_first (2004-01-26 18:04) [9]Ну - дальше что? Кто чего посоветует?
← →
Polevi (2004-01-26 20:36) [10]MoveLast не подойдет ?
← →
mvg_first (2004-01-27 08:44) [11]MoveLast - насколько я понимаю перемещает позицию на последнюю запись в датасете. А где гарантия что добавляемая строка в дата сет именно последняя?
← →
mvg_first (2004-01-27 13:25) [12]больше никто ничего не скажет?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.029 c