Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

Переопределить метод 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
1-16495
Lt
2004-01-26 10:52
2004.02.06
Вставка рисунка в Word


3-16191
чайник1
2004-01-13 14:48
2004.02.06
Код ошибки пустой


4-16806
dcii
2003-11-29 20:38
2004.02.06
Спящий режим


14-16656
Magician
2004-01-17 16:41
2004.02.06
Как закачать файл с интернета используя несколько потоков.


3-16169
korvin
2004-01-13 09:21
2004.02.06
dxDBGrid событие смены активного колумна