Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-16375
Iron Maiden
2004-01-23 21:03
2004.02.06
Абзацы


1-16287
SkullNet
2004-01-25 22:17
2004.02.06
Иконка в строке состояния.


4-16816
Вадим
2003-12-02 05:10
2004.02.06
Как убрать прозрачность окна?


1-16358
MadGhost
2004-01-24 23:12
2004.02.06
Научите работать с потоками нормально или ссылку дайте?


14-16617
Думкин
2004-01-15 06:14
2004.02.06
С днем рождения! 15 января.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский