Форум: "Базы";
Текущий архив: 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