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

Вниз

Обновление в DbGrid   Найти похожие ветки 

 
Евгений Р.   (2008-07-19 15:30) [0]

dbGrid отражает информацию tIbQuery
необходимо обновить информацию
делаю:

key:=quKey.asInteger;
qu.close;
qu.open;
qu.locate("key",variant(key),[]);  (или BookMark)

все работает, но информация в гриде смещается. Можо ли сделать, сохранить одновременно позицию первой строки грида и текущей записи?


 
turbouser ©   (2008-07-19 16:24) [1]

Как-то все непонятно.
Скорее всего отсортировать нд по ид деск


 
Евгений Р.   (2008-07-19 17:16) [2]

наверное Вы не поняли. на примере:
1.в гриде отражается 20 записей
2.в нд - 100 записей
3.сейчас грид показывает записи с 51й по 70ю, курсор на 5й строке грида (запись 55)
4.закрываю-открываю нд
5.позиционирую курсор на 55ю запись (locate)
6.грид показывает с 55й по 74ю. курсор на первой строке грида (запись 55)
7.необходимо чтобы в п.6 грид отражался также, как и в п.3


 
MsGuns ©   (2008-07-19 18:02) [3]

См. дедушку грида TCustomGrid


 
Johnmen ©   (2008-07-19 19:24) [4]


> Евгений Р.   (19.07.08 17:16) [2]

Забей. Ибо существующая реализация того не стОит.


 
Евгений Р.   (2008-07-19 19:28) [5]


> MsGuns ©

речь ведете о дедушкином protected TopRow?


 
turbouser ©   (2008-07-19 19:48) [6]


> Евгений Р.   (19.07.08 19:28) [5]

Если внятно скажешь что надо - будут ответы. А так...


 
Евгений Р.   (2008-07-19 20:12) [7]

открыть дбГрид таким образом, чтобы в первой строке (topRow) была 51я запись НД, а выделенной была 55я строка НД (row=5).


 
Johnmen ©   (2008-07-19 20:21) [8]


> открыть дбГрид таким образом, чтобы в первой строке (topRow)
> была 51я запись НД

Если в НД всего 50, то можно 49?


 
Евгений Р.   (2008-07-19 20:26) [9]

в [7] разжован [2]. (в НД 100 записей)


 
MsGuns ©   (2008-07-19 21:30) [10]

>Евгений Р.   (19.07.08 19:28) [5]
>речь ведете о дедушкином protected TopRow?

Да, о нем. Но есть вероятность при перечитке получить не то кол-во записей, которое было до нее (см. [8]). В этом случае есть веротность, что "картинку" физически нельзя будет восстановить. Во всяком случае надо городить целый огород. А стОит ли оно того ?


 
Германн ©   (2008-07-20 01:21) [11]


> turbouser ©   (19.07.08 19:48) [6]
>
>
> > Евгений Р.   (19.07.08 19:28) [5]
>
> Если внятно скажешь что надо - будут ответы. А так...
>

<telepator>
Автор хочет чтоб "не моргало" при обновлении.
</telepator>


 
Евгений Р.   (2008-07-20 01:52) [12]


> MsGuns ©   (19.07.08 21:30) [10]

согласен, но это решается через пару ифов.
но указанные свойства - протектед
неужели в таких случаях обязательно городить наследника?


 
Германн ©   (2008-07-20 01:58) [13]


> неужели в таких случаях обязательно городить наследника?
>
>

Не обязательно "городить".
Но я пока не получил сведений, что это "тот" случай.


 
Евгений Р.   (2008-07-20 02:04) [14]


> Германн ©   (20.07.08 01:21) [11]


типа того. Но это не "моргание", а полная смена картинки. ([2] п.6)


 
Правильный$Вася   (2008-07-20 20:22) [15]


> qu.locate("key",variant(key),[]);  (или BookMark)

выделенное - глупость
букмарки имеют смысл только в рамках одного набора данных
переоткрытие дает много шансов смены адресов, что либо (в хорошем случае) позиционирует на неверную запись, либо (в плохом случае) бросит на AV


 
Плохиш ©   (2008-07-20 23:32) [16]


> Евгений Р.   (19.07.08 15:30)  

Если я всё правильно понял, то на

....
   grdInfo: TRxDBGrid;
....
type
 TMyDBGrid = class(TrxDBGrid)
 end;
...
procedure TfrmOwnerList.ScrollActiveToRow(AGrid: TDBGrid; ARow: Integer);
var
    FTitleOffset, SDistance : Integer;
    NewRect : TRect;
    NewRow : Integer;
begin
 with TMyDBGrid(AGrid) do
 begin
   NewRow:= Row;
   FTitleOffset:= 0;
   if dgTitles in Options then inc(FTitleOffset);
   if ARow = NewRow then Exit;
   with DataLink, DataSet do
   try
     BeginUpdate;
     Scroll(NewRow - ARow);
     if (NewRow - ARow) < 0 then
       ActiveRecord:= 0
     else
       ActiveRecord:= VisibleRowCount - 1;
     SDistance:= MoveBy(NewRow - ARow);
     NewRow:= NewRow - SDistance;
     MoveBy(ARow - ActiveRecord - FTitleOffset);
     NewRect:= BoxRect(0, FTitleOffset, ColCount - 1, 1000);
     ScrollWindowEx(Handle, 0,0, @NewRect, @NewRect, 0, nil, SW_Invalidate);
     MoveColRow(Col, NewRow, False, False);
   finally
     EndUpdate;
   end;
 end;
end;

procedure TfrmOwnerList.DBRefresh;
var
   save_Cur:   TCursor;
   save_LCol:  Integer;
   oldRow:     Integer;
   oldKey:     Variant;
   bRestore:   Boolean;
begin
 oldRow := 0;
 save_Cur := Screen.Cursor;
 if Active and CanRefresh then
 try
   Screen.Cursor := crSQLWait;
   bRestore := (not cdsInfo.IsEmpty) and (IndexField <> "");
   save_LCol := grdInfo.LeftCol;
   if bRestore then
   begin
     oldRow := grdInfo.Row;
     oldKey := cdsInfo.FieldByName(IndexField).Value;
   end;
   try
     cdsInfo.Active := false;
     qryInfo.Active := false;
     qryInfo.Active := true;
     cdsInfo.Active := true;
     if bRestore then
     begin
       if cdsInfo.Locate(IndexField, oldKey, [loCaseInsensitive]) then
         ScrollActiveToRow(grdInfo, oldRow);
     end;
   finally
     grdInfo.LeftCol := save_LCol;
   end;
 finally
   Screen.Cursor := save_Cur;
 end;
end;

думаю разберёшься.


 
MsGuns ©   (2008-07-21 15:13) [17]

>Плохиш ©   (20.07.08 23:32) [16]
>Если я всё правильно понял, то на
>type
TMyDBGrid = class(TrxDBGrid)

Замечательный совет ;)

ЗЫ Вот зачем давать заведомо неработающий код ?


 
Плохиш ©   (2008-07-21 17:19) [18]


> MsGuns ©   (21.07.08 15:13) [17]
> ЗЫ Вот зачем давать заведомо неработающий код ?

А я и не говорил, что этот код для копи-паста. Да и не собираюсь приглаживать работающие куски из проектов для использования кем-нибуть, каждый может довести их для себя. А возникающие вопросы задать.


 
Игорь Шевченко ©   (2008-07-21 21:38) [19]

MsGuns ©   (21.07.08 15:13) [17]


> ЗЫ Вот зачем давать заведомо неработающий код ?


А тебе влом или впадлу дать заведомо работающий ?


 
Германн ©   (2008-07-22 01:17) [20]


> MsGuns ©   (21.07.08 15:13) [17]
>
> >Плохиш ©   (20.07.08 23:32) [16]
> >Если я всё правильно понял, то на
> >type
> TMyDBGrid = class(TrxDBGrid)
>
> Замечательный совет ;)
>
> ЗЫ Вот зачем давать заведомо неработающий код ?
>

А в Д7 без TRxDBGrid и работать не стОит. Нормальный скролл в TDBGrid Борланд реализовал только в Д2005, если Джо не соврал. Я лично, его (нормальный скролл в TDBGrid) увидел только в BDS2006.


 
Vlad Oshin ©   (2008-07-22 09:55) [21]

а если спозиционировать на 50й записи и послать 5раз нажатие клавиши курсор_вниз?


 
MsGuns ©   (2008-07-22 11:49) [22]

>Германн ©   (22.07.08 01:17) [20]
>А в Д7 без TRxDBGrid и работать не стОит. Нормальный скролл в TDBGrid Борланд реализовал только в Д2005

Глупости.
Мне не "впадлу" (ИШ) написать 5 строчек кода (копи-пасте) в юните с гридами. Тащить же монстра RX ради скрола - все равно что не садиться за стол без жареного быка и ванны водки


 
Anatoly Podgoretsky ©   (2008-07-22 11:53) [23]

На наркотик сядет, потом постоянно будет по форумам бегать, дайте RX для ДельфиXXXX


 
Плохиш ©   (2008-07-22 12:18) [24]

Вообще-то в D7 TRxDBGrid скролится точно также как и нормальный...


 
dolmat   (2008-07-22 13:39) [25]

уж если менять grid то на devexpress ExpressQuantumGrid и более не мучится


 
Johnmen ©   (2008-07-22 17:40) [26]


> dolmat   (22.07.08 13:39) [25]
> уж если менять grid то на devexpress ExpressQuantumGrid
> и более не мучится

Вот так, по смешному чиху, увеличить ехешник на восемь метров...


 
Игорь Шевченко ©   (2008-07-22 21:16) [27]


> уж если менять grid то на devexpress ExpressQuantumGrid
> и более не мучится


Самолет продается только в комплекте с авианосцем


 
Petr V. Abramov ©   (2008-07-22 23:32) [28]

Удалено модератором


 
Евгений Р.   (2008-07-24 02:11) [29]

Большое спасибо всем, особенно Плохишу.
Не все понял, но в азах разобрался. Последовал совету, не использовать доп.компонентов. Сделал так:

type tMyGrid=class(TCustomDbGrid);
procedure TfzvkJourn.RefreshData;
  var idfD:integer;
      OldActiveRecord:integer;
Begin
  idfD:=quZvkIdfD.AsInteger;
  OldActiveRecord:=tMyGrid(dbg).DataLink.ActiveRecord;
  ta.Commit;
  quZvk.Open;
  quZvk.Locate("idfD",variant(idfD),[loPartialKey]);

  quZvk.MoveBy(tMyGrid(dbg).RowCount-OldActiveRecord-2);

  quZvk.MoveBy(-(tMyGrid(dbg).RowCount-OldActiveRecord-2));
End;{RefreshData}


работает так, как я хотел. Мерцание есть, но с ним пока мирюсь.
интересно послушать критику


 
Плохиш ©   (2008-07-24 11:21) [30]


> Евгений Р.   (24.07.08 02:11) [29]
> type tMyGrid=class(TCustomDbGrid);

Настойчиво советую убрать выделенное, т.к. нужен наследник TDBGrid-a, а не его брат :-)

PS. И куда делись BeginUpdate/EndUpdate?


 
Евгений Р.   (2008-07-24 12:05) [31]


> Плохиш ©   (24.07.08 11:21) [30]

TDBGrid - согласен, но не понимаю. Для доступа к Row работало даже при tCustomGrid.

BeginUpdate/EndUpdate - часто встречаю, но не понимаю их назначения. Если возможно - киньте где почитать. Но, к статьи и без них все работает.


 
Плохиш ©   (2008-07-24 14:00) [32]


> TDBGrid - согласен, но не понимаю. Для доступа к Row работало
> даже при tCustomGrid.

Для доступа к protected-свойствам необходимо создавать класс-наследник от класса, к свойствам которого мы хотим получить доступ. В данном случае тебе просто повезло :-)

> BeginUpdate/EndUpdate - часто встречаю, но не понимаю их
> назначения. Если возможно - киньте где почитать.

В справке, например.


 
MsGuns ©   (2008-07-24 20:55) [33]

Снимаю свое замечание в [17]
Иногда такое действует ;)


 
isasa ©   (2008-07-25 00:13) [34]

MsGuns ©   (24.07.08 20:55) [33]

Снимаю свое замечание в [17]
Иногда такое действует ;)


Почему "иногда". Это один из "стандартных" обходных маневров для получения доступа к protected членам класса. :)


 
Германн ©   (2008-07-25 01:04) [35]


> MsGuns ©   (24.07.08 20:55) [33]
>
> Снимаю свое замечание в [17]
> Иногда такое действует ;)


> isasa ©   (25.07.08 00:13) [34]


Аааа. Так вот что ты имел ввиду. Тут isasa © прав. .
ЮЗ для такого маневра даже изобрел имя THackxxxx. :)
И этот манёвр староизвестен ещё с Д1.


 
MsGuns ©   (2008-07-25 14:25) [36]

Под "иногда" я имел в виду не технологию, а сам совет, которым надо пользоваться ВДУМЧИВО.
В данном случае, ИМХО, именно так и произошло ;)



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

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

Наверх





Память: 0.54 MB
Время: 0.04 c
15-1233142456
XeON
2009-01-28 14:34
2009.03.29
Обрезка изображения


2-1233826733
Pavel
2009-02-05 12:38
2009.03.29
Подключение к базе через ini-файл


6-1201601068
Maloj2007
2008-01-29 13:04
2009.03.29
Отправка пакетов


15-1232117336
Добежал
2009-01-16 17:48
2009.03.29
Тем, кто утверждает, что тело except не должно быть пустым


15-1230126644
@!!ex
2008-12-24 16:50
2009.03.29
Lua работа с внешними классами как со своими родными





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