Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Вниз

Так всё-таки, что такое TBookMark?   Найти похожие ветки 

 
Ega23 ©   (2005-07-08 13:14) [0]

Вот столкнулся с такой штукой:

Function QuOpen(Qu: TDataSet;sql:string="*";refr:boolean=true;mess:string="*"):integer;
//  Открытие запроса с возможностями
//  - замены текста(sql),
//  - рефреша с восстанавлением текущей позиции
//  - вывода сообщения об ошибке
// Параметры
//sql:  "*"  (default)  - не менять текст запроса
//refr: true (default) производить  рефреш данных
//mess : "*" (default) - standart mess;
//       ""            - no mess
//       "..some mess" - custom message
//result:  Ok -RecordCount; can"t open -1;
var  realsqltext:string;
   BookMk: TBookmark;
begin
result:=-1;
 if GpNoConnectGlb then exit;
 BookMk:=nil;
Try
try
 qu.DisableControls;
 //заложить закладку и закрыть
  if Qu.Active then
  begin
    BookMk := Qu.GetBookmark;
    Qu.Close;
  end;
 //текст запроса
  if sql<>"*" then (Qu as TADOQuery).sql.text:=sql;
  realsqltext:=sql;
  //Уже Открыть !
  Qu.open;
except on E:exception do
      Begin
        if mess="*" then ShowMessage("Ошибка запроса")
                     else  if mess<>"" then ShowMessage(Mess);
         raise EGPException.Create(e.message+" "+mess+ " "+realsqltext);
       End;
end;//try

  // ЕСли просят рефреша - вот он
  if refr then
   try
    if Qu.Active and (BookMk <> nil) and not (qu.Bof and qu.Eof) and
      qu.BookmarkValid(BookMk)
      then  qu.GotoBookmark(BookMk);
    except
    end;
result:=Qu.recordcount;
if result< 0 then exit;
Finally
  qu.EnableControls;
    if BookMk <> nil then qu.FreeBookmark(BookMk);
End; //try fin
end;


При использовании данной функции для обновления НД в собственном компоненте, вижу, что данные не обновляются. Точнее, не происходит событие TDataLink.activeChanged

С другой стороны, если для обновления НД сделать элементарное Close/Open - событие возникает.

Есть вопрос: в каком контексте используется TBookMark? Чей это атрибут? Непосредственно текущего набора данных, или всё-таки "вещь в себе"?


 
Val ©   (2005-07-08 13:32) [1]

заложить закладку и закрыть. отлично. и что поимеем?


 
Digitman ©   (2005-07-08 13:45) [2]


> что такое TBookMark?


TBookmark identifies a record in a dataset for later navigation

как только ты вызвал close, набор данных (на одну из записей которого закладка "ссылалась") перестал существовать и закладка стала попросту бессмысленной.


 
Desdechado ©   (2005-07-08 13:48) [3]

по сабжу - это адрес, по которому расположена запись открытого датасета
после закрытия/переоткрытия по тому адресу будет хз что


 
Ega23 ©   (2005-07-08 13:52) [4]

2 Digitman ©   (08.07.05 13:45) [2]
как только ты вызвал close, набор данных (на одну из записей которого закладка "ссылалась") перестал существовать и закладка стала попросту бессмысленной.

Не совсем так получается.
Простой пример: ADOQery, запрос на Select, DataSource, DBGrid.
Открываем запрос. Встаём в гриде на, скажем, третью запись. Переоткрываем запрос с помощью функции (см. [0]). курсор остался на третьей записи.
Переоткрываем запрос с помощью Close - Open. Курсор встал на первую запись.
Значит всё-таки букмарки не совсем "убиваются"?


 
Digitman ©   (2005-07-08 13:57) [5]


> Ega23 ©   (08.07.05 13:52) [4]


в [0] тобой точно так же используются те же Close-Open

??


 
Ega23 ©   (2005-07-08 14:04) [6]

в [0] тобой точно так же используются те же Close-Open

Да, но с сохранением bookmark"а.


function TDataSet.GetBookmark: TBookmark;
begin
 if BookmarkAvailable then
 begin
   GetMem(Result, FBookmarkSize);
   GetBookmarkData(ActiveBuffer, Result);
 end else
   Result := nil;
end;

procedure TCustomADODataSet.GetBookmarkData(Buffer: PChar; Data: Pointer);
begin
 Initialize(POleVariant(Data)^);
 POleVariant(Data)^ := PRecInfo(Buffer).Bookmark;
end;


Получается, что при наличии букмарка, мой экземпляр TDataLink моего компонента не ловит событие TDataLink.ActiveChanged

Вопрос: а если я захочу пройтись отладчиком по внутренним методам TADOQuery, то как мне это сделать? Сейчас я по F7 туда не проваливаюсь, да и если точку останова ставлю, то всё равно к ней не прихожу. Может, чё-то в настройках Delphi надо поставить?


 
Digitman ©   (2005-07-08 14:11) [7]


> Да, но с сохранением bookmark"а


до тех пор пока текст сиквел-запроса между смежными close-open не изменился, букмарк м.б. и будет при этом оставаться валидным, но полагаться на это нельзя

если интересно, исследуй упр.структуру, скрывающуюся за букмарк-указателем для конкретного наследника TDataSet


> как мне это сделать?


Project -> Options -> Compiler -> Use Debug DCU"s = Yes


 
Ega23 ©   (2005-07-08 14:15) [8]

Project -> Options -> Compiler -> Use Debug DCU"s = Yes

Спасибо. Для финальной сборки, как я понимаю, эту опцию потом надо будет снять? Или неважно?

до тех пор пока текст сиквел-запроса между смежными close-open не изменился, букмарк м.б. и будет при этом оставаться валидным, но полагаться на это нельзя

А если не текст, а сам НД на сервере изменился? Допустим, я Insert в эту таблицу сделал?


 
Digitman ©   (2005-07-08 14:22) [9]


> А если не текст, а сам НД на сервере изменился?


тем более на закладку полагаться нельзя !


> Для финальной сборки, как я понимаю, эту опцию потом надо
> будет снять?


крайне желательно


 
Ega23 ©   (2005-07-08 15:15) [10]

2 Digitman ©   (08.07.05 14:11) [7]
Project -> Options -> Compiler -> Use Debug DCU"s = Yes

Спасибо, очень помогло.
Действительно, функция, описанная в [0] работает некорректно.
Как её переделать - это отдельный вопрос (чтобы при рефреше оставалась нужная позиция), кое-какие идеи уже появились.


 
Digitman ©   (2005-07-08 15:18) [11]


> чтобы при рефреше оставалась нужная позиция


рефреш и close+open - некоторым образом разные разницы


 
Ega23 ©   (2005-07-08 15:21) [12]

рефреш и close+open - некоторым образом разные разницы

Я имел ввиду не TDataSet.Refresh, а само понятие "обновление".


 
Digitman ©   (2005-07-08 15:28) [13]

Refresh и есть "обновление открытого набора данных".

о каком еще обновлении ты ведешь речь ?


 
atruhin ©   (2005-07-08 17:53) [14]

>>Digitman ©   (08.07.05 13:45) [2]
>>как только ты вызвал close, набор данных (на одну из записей >>которого закладка "ссылалась") перестал существовать и закладка >>стала попросту бессмысленной.
В общем случае не совсем верно, т.к. закладка реализуется наследником датасета, он лишь должен ее реализовать. В наследнике закладка может быть реализована как указатель, например если буфер хранится в виде списка, а может быть просто порядковым номером записи в текущем буфере, тогда валидность сохраняется и после переоткрытия.


 
Val ©   (2005-07-08 18:01) [15]

угу. было 5 записей, после переоткрытия 3. закладка стояла на 4 номере.


 
atruhin ©   (2005-07-08 19:17) [16]

>>Val ©   (08.07.05 18:01) [15]
>>угу. было 5 записей, после переоткрытия 3. закладка стояла на 4 >>номере.
Поставит на последнюю. Вообще я полностью согласен что так делать нельзя. Просто попытался прояснить по САБЖу. Хотя в некоторых случаях, например переоткрытие не меняет ни порядок, ни кол-во, а только некоторое поле, это может пройти на конкретном потомке датасета.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.013 c
14-1121456065
Магнум
2005-07-15 23:34
2005.08.14
На что потратить свои WebMoney?


1-1122188478
tttyu
2005-07-24 11:01
2005.08.14
как получить текущую позицию ScrollBar а в Richedit?


1-1122498912
Olegha
2005-07-28 01:15
2005.08.14
Цвет


14-1121764709
reticon
2005-07-19 13:18
2005.08.14
Загрузка процессора и svchost.exe


8-1113065140
Comrade
2005-04-09 20:45
2005.08.14
Эквалайзер Звука





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский