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

Вниз

Помогите с DBGrid!   Найти похожие ветки 

 
alexander_ua   (2003-01-17 15:22) [0]

В гриде помещаются не все поля. При использовании прокрутки (горизонтальной) после переоткрытия Query (close-open) полосы прокрутки возвращаются в прежнее положение. Т.е. например у меня есть 10 полей, в видимой области грида - поля 1-6. Делаю прокрутку, чтобы видеть поля 4-9. После переоткрытия датасета снова вижу поля 1-6, а нужно ведь 4-9!!!
Извиняюсь за настырность, вопрос уже задавал, но так и не получил вразумительного ответа.


 
MsGuns ©   (2003-01-17 15:37) [1]

Нормальная реакция Датасета на переоткрытие. Чтобы встать туда, где стоял, используй Locate или FindFirst


 
alexander_ua   (2003-01-17 15:44) [2]

СТОП!!! Я не о вертикальном, а о горизонтальном перемещении!!!


 
Reindeer Moss Eater   (2003-01-17 15:52) [3]

Перед закрытием датасета запоминай SelectedIndex у грида
После открытия датасета восстанавливай SelectedIndex.


 
MsGuns ©   (2003-01-17 16:15) [4]

Пардон, невнимательно прочитал.
Тогда >Reindeer Moss Eater (17.01.03 15:52) или SelectedField того же грида


 
MsGuns ©   (2003-01-17 16:15) [5]

Пардон, невнимательно прочитал.
Тогда >Reindeer Moss Eater (17.01.03 15:52) или SelectedFields того же грида


 
alexander_ua   (2003-01-17 16:16) [6]

У меня поле SelectedIndex почему-то всегда равно нулю...


 
Delirium^.Tremens ©   (2003-01-17 16:24) [7]

Это потому, возможно, что у грида в опциях dgRowSelect


 
alexander_ua   (2003-01-17 16:25) [8]

С полями SelectedIndex и SelectedFields беда. Во-первых потому, что у меня свойство dgrowselect=True у грида, т.е. выделяю не отдельные ячейки а целые записи, а указанным полям нужен именно onclick по соответствующем поле. Также не подходит потому, что мне нужно знать не какое поле выделено, а какое находилось на первом месте до переоткрытия dataset. Надеюсь, изложил понятно...
Помогите, пожалуйста!


 
Delirium^.Tremens ©   (2003-01-17 16:28) [9]

Отключить RowSelect перед закрытием, запомнить индекс, закрыть, открыть, установить в поле, включить RowSelect.


 
alexander_ua   (2003-01-17 16:38) [10]

к сожалению тоже не то, потому что я могу вообще не делать клик по какому либо полю, соответственно опять будут нулевыми указанные параметры. Мне бы знать с какого столбца (поля) начинается диапазон полей, показываемых в видимой части грида (например в текущий момент отображаются поля 3-7 (из моих десяти), вот мне и нужно знать, что первое отображаемое поле - 3, а потом суметь к нему переместиться).
Извиняюсь за настырность, но это действительно важная проблема.


 
Delirium^.Tremens ©   (2003-01-17 16:42) [11]

А ты не пробовал выставить первым полем (напрмер 4), а потом сделать вертикальный Scroll? Что будет?


 
alexander_ua   (2003-01-17 17:01) [12]

Пробовал. Но после вертикального скрула опять все плохо - первым видимым поле становится 1, а не 4...


 
AM   (2003-01-17 17:02) [13]

Я думаю, что в данном случаи, если пользоваться стандатным ДБГридом, то надо играть на собитии
Procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

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


 
Delirium^.Tremens ©   (2003-01-17 17:05) [14]

alexander_ua (17.01.03 17:01)

> Пробовал. Но после вертикального скрула опять все плохо
> - первым видимым поле становится 1, а не 4...

Так я же тебе на это и намекал :-)


 
alexander_ua   (2003-01-17 17:10) [15]

А как поймать это событие и правильно его обработать?
>Я думаю, что в данном случаи, если пользоваться стандатным >ДБГридом, то надо играть на собитии
>Procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const >Rect: TRect; DataCol: Integer; Column: TColumn; State: >TGridDrawState);

Delirium^.Tremens Сорри, но не понял намек...


 
AM   (2003-01-17 17:23) [16]

Надо завести какой-нибудь TStringList, очистить его перед тем как сделать обновление, спровоцировать, чтобы возникла перерисовка всех видимых колонок, а потом добавлять в массив имена колонок которые были перерисованы, предварительно проверить, есть ли уже в нем такое поле:
Procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var
strL: TStringList;

....

strL.Add(Column.FieldName);

после этого проверить, каких полей нет в strL - те и не видемы.


 
alexander_ua   (2003-01-17 17:27) [17]

Хорошо, таким образом я поймаю поля, которые не видимы. Но как мне потом отобразить именно те поля, которые были видны перед обновлением ?


 
AM   (2003-01-17 17:42) [18]

Только strL: TStringList; - глобальная переменная!!!

>Хорошо, таким образом я поймаю поля, которые не видимы. Но как
>мне потом отобразить именно те поля, которые были видны перед
>обновлением ?

А вот это тебе надо будет просуммировать все ширины колонок твоего грида и сравнить с размером самого грида и исходя из этого решать надо ли переходить (с помощью SelectedIndex) к примеру на 6-ю колонку, чтобы колонки сдвинулись и начиная с 3-ей все были видны...
довольно нудно, но в принципе решимо...

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

это в принципе все теория надо на практике посмотреть как будет...


 
Reindeer Moss Eater   (2003-01-17 17:47) [19]

(с помощью SelectedIndex)
У него RowSelect опция включена. Сказали же уже.


 
alexander_ua   (2003-01-17 17:52) [20]

вобщем так. с помощью DBGrid1DrawColumnCell я выловил поле, которое первым отображается в гриде до обновления. Остается узнать как после обновления сразу же перейти к этому полю. Сразу же говорю, что RowSelect включена и SelectedFields (SelectedIndex) неприменимы.


 
Reindeer Moss Eater   (2003-01-17 17:56) [21]

Посылай гриду нажатия "->". Или откажись от RowSelect


 
alexander_ua   (2003-01-17 18:03) [22]

как посылать???? ведь это и интересует


 
AM   (2003-01-17 18:05) [23]

Reindeer Moss Eater (17.01.03 17:47)

Я думаю ее перед обновлением отключить, обновить, все расставить по своим местам ( Locate, SelectedIndex ...) переключить фокус на другой контрол, а потом включить это свойство только на OnEnter у Грида.


 
alexander_ua   (2003-01-17 18:10) [24]

как посылать???? ведь это и интересует
>Reindeer Moss Eater
>Посылай гриду нажатия "->". Или откажись от RowSelect


 
AM   (2003-01-17 18:12) [25]

>> AM (17.01.03 18:05)

сорри обшибся, надо подругому...


 
alexander_ua   (2003-01-17 18:19) [26]

как по-другому? вобщем вопрос теперь стоит так: нужно программно сделать к примеру поле 4 первым из отображаемых в гриде. Если это можно сделать как говорил Reindeer Moss Eater, то как делается программный скрулл?


 
AM   (2003-01-17 18:32) [27]

>> alexander_ua (17.01.03 18:19)

>> программный скрулл?

вот где-то мне попадался он, не могу вспомнить где я читал про это...

ну есть еще совсем тупой подход - скрыть (сделать невидимыми) колонки 1,2 , если к примеру тебе надо отобразить с 3-ей, ну а потом в нужный момент отобразить их...

Но конечно лучше программный скрулл,
а про программный скрул - поищи в архивах форму, наверняка кто-то уже задавал такой вопрос...


 
alexander_ua   (2003-01-17 18:39) [28]

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


 
TTCustomDelphiMaster ©   (2003-01-17 21:38) [29]

TCustomGrid.LeftCol - Specifies the index of the first visible scrollable column in the grid.


 
alexander_ua   (2003-01-20 14:28) [30]

TTCustomDelphiMaster © (17.01.03 21:38)

У dbgrid нет свойства LeftCol :).
Я уже даже научился делать программную прокрутку по горизонтали, да вот беда, слишком уж заметна эта прокрутка и рядового пользователя может ввести в полное замешательство... Может есть еще идеи?


 
Reindeer Moss Eater   (2003-01-20 14:31) [31]

Идеи чего?


 
Delirium^.Tremens ©   (2003-01-20 14:32) [32]

alexander_ua (20.01.03 14:28)

> Может есть еще идеи

Оставить в покое фичи польз. интерфейса и заняться логикой приложения.


 
Reindeer Moss Eater   (2003-01-20 14:35) [33]

За какой надобностью тебе dgRowSelect ?


 
alexander_ua   (2003-01-20 14:42) [34]

dgRowSelect мне затем, что грид я использую не для редактирования, а просто для отображения инфы. Соответственно после выделения записи (строки) и клацанья по какой-либо кнопке открываю окно редактирования.
Вобщем я так понимаю, ответы исчерпаны? Что-то мне не верится, что невозможно сделать то, чего я хочу...


 
Reindeer Moss Eater   (2003-01-20 14:44) [35]

Круто! А другим (более адекватным) способом добиться этого нельзя?


 
alexander_ua   (2003-01-20 15:38) [36]

Reindeer Moss Eater (20.01.03 14:44)
поясни, пожалуйста...


 
Reindeer Moss Eater   (2003-01-20 15:45) [37]

Я так понял, что RowSelect у тебя только для того, что бы пользователь не редактировал данные в гриде?

1. Убираем из опций RowSelect.
2. DBGrid1.ReadOnly:=True;
3. Убираем из опций dgEditing и dgAlwaysShowEditor

4. Начинаем иметь возможность использовать SelectedIndex


 
alexander_ua   (2003-01-20 15:51) [38]

если я правильно понял, таким образом я буду лишен возможности лицезреть выделенную запись, да? Ведь именно для этого у меня и был RowSelect. Выделенным может быть только поле.


 
Reindeer Moss Eater   (2003-01-20 16:04) [39]

Не знаю, что ты там понял, но все записи останутся там, где и были до этого.


 
Романов Р.В. ©   (2003-01-20 16:05) [40]


> alexander_ua (20.01.03 14:28)
> TTCustomDelphiMaster © (17.01.03 21:38)
>
> У dbgrid нет свойства LeftCol :).


Есть только оно Protected.
Как до него добраться смотри здесь
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1042818718&n=1


 
alexander_ua   (2003-01-20 17:03) [41]

Reindeer Moss Eater (20.01.03 16:04)

Записи то останутся на месте, а выделить запись не смогу, смогу только поле (ячейку), а это и есть бэд.


 
Reindeer Moss Eater   (2003-01-20 17:10) [42]

А чем таким волшебным отличается "выделенная" RowSelect"ом запись от просто текущей?


 
alexander_ua   (2003-01-20 18:11) [43]

Reindeer Moss Eater (20.01.03 17:10)

эстетическое удовольствие приносит...


 
Reindeer Moss Eater   (2003-01-20 18:14) [44]

Дай угадаю, ты про цвет что ли?
Да. Изврат со скролингом и прочие премудрости конечно более просты, чем своя отрисовка "шпалы".
Ну удачи тебе тогда.


 
alexander_ua   (2003-01-20 18:36) [45]

Reindeer Moss Eater (20.01.03 18:14)

ну тогда научи пожалуйста
и извини за настырность


 
MsGuns ©   (2003-01-20 18:46) [46]

>alexander_ua (20.01.03 18:36)
>Reindeer Moss Eater (20.01.03 18:14)

>ну тогда научи пожалуйста

Статья "Полосатый грид" в Королевстве

Блин, пора уже подобные темы фильтровать в отдельный отстойник. Это даже не FAQ, а какой-то VVVFAQ (Vary-vary-vary) 8))


 
Mike Kouzmine   (2003-01-20 19:05) [47]

Используй дбгридэх, ставь в опшонсэх выделение строки, а грид в ридонли, будет тебе и выделение строки и перемещение по столбцам.


 
MsGuns ©   (2003-01-20 19:11) [48]

>Mike Kouzmine (20.01.03 19:05)
>Используй дбгридэх, ставь в опшонсэх выделение строки, а грид в ридонли, будет тебе и выделение строки и перемещение по столбцам.

... и куча траблов, если вздумаешь поиграться с некоторыми событиями, например, датасорса. Да и не только...


 
Delirium^.Tremens ©   (2003-01-20 19:17) [49]

Mike Kouzmine (20.01.03 19:05)
Перед постом, читай ветку.


 
Mike Kouzmine   (2003-01-20 19:47) [50]

Delirium^.Tremens © Милок, чукча не читатель, чукча писатель :)
Читали, и сошлись на том, что SelectedIndex = 0, как этого избежать? Сделать как написано в моем посте. Хотя, может я все таки чукча?
MsGunsу - в другой ветке я об этом уже читал и попросил Вас описать баги, чтобы проверить и сделать адекватный выбор, пока весь проект не перевел на этот грид


 
Delirium^.Tremens ©   (2003-01-20 19:49) [51]

Mike Kouzmine (20.01.03 19:47)
Хреново читаешь.


 
Delirium^.Tremens ©   (2003-01-20 19:52) [52]

Mike Kouzmine (20.01.03 19:47)
И что это еще за "милок", ты часом не из этих...?


 
Mike Kouzmine   (2003-01-20 19:56) [53]

Все правильно, хреново.
Единственно что надо запомнить перед переоткрытием datasetа - ключевые поля и SelectedField, потом находишь запись, устанавливаешь SelectedField и все (ну кроме того, что запись будет в центре грида или в самом верху, не помню), но это, как пишут в книгах, совсем другая история.


 
MsGuns ©   (2003-01-20 21:43) [54]

>Mike Kouzmine (20.01.03 19:47)
>MsGunsу - в другой ветке я об этом уже читал и попросил Вас описать баги, чтобы проверить и сделать адекватный выбор, пока весь проект не перевел на этот грид

К сожалению, было это давненько (летом-ранней осенью) и я не фиксировал все на бумаге. Но на память:

1. Кое-какие события и методы предковых классов там переопределены так, что когда хочешь ими возпользоваться, то получаешь отлуп по полной программе.
2. Если ставишь обработчики на связанный с гридом датасорс или датасет, то в отладке замучаешься жать баттоны, прогоняя многочисленные обработчики "собственоого гридошного приготовления". Кроме того, у меня были ситуации банального зависания компа (особенно на обработчике типа OnDataChange).
3.При переупорядочениях записей так и не врубился как он это делает, но как минимум в 50% случаев или не сортирует воообще или сортирует не так.
4.Крайне неудобная работа со списками помеченных строк (через Ж)
5.И так далее.

Оговорюсь сразу. Это МОЕ ЛИЧНОЕ мнение, основанное к тому же на НЕПРОДОЛЖИТЕЛЬНОЙ работе с этим компонентом. Все, что мне надо делать с гридом (раскраска, контролы в ячейках, отображение мемо, реакция на срабатывания клика на заголовках и т.д.) я делаю, используя методы и свойства стандартного DBGrid`а. НИ РАЗУ машина не зависала по его причине.

И еще раз: Все сказанное-однозначно ИМХО.



 
Романов Р.В. ©   (2003-01-20 22:39) [55]

Да нормальный компонент, если с ним сильно не выпендривться


 
pivo_est   (2003-01-21 02:36) [56]



> вобщем так. с помощью DBGrid1DrawColumnCell я выловил поле,
> которое первым отображается в гриде до обновления. Остается
> узнать как после обновления сразу же перейти к этому полю.
> Сразу же говорю, что RowSelect включена и SelectedFields
> (SelectedIndex) неприменимы.


Может поможет:
procedure TForm1.Button1Click(Sender: TObject);
var j,c: integer;
begin
c:=0;
for j:=0 to T1.FieldCount-1 do
begin
if T1.Fields[j].FieldName=Edit1.text then
DG1.SelectedIndex:=c;
c:=c+1;
end;

end;

Здесь в Edit1 имя поля.
Поле появляется в области видимости.
Необязательно крайнелевым.



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

Текущий архив: 2003.02.06;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.015 c
1-15746
Brain
2003-01-24 17:42
2003.02.06
Font ы в свойствах


14-15928
Ketmar
2003-01-21 16:39
2003.02.06
чем бы таким очень маленьким и халявным просматривать .ps?


1-15644
Бук
2003-01-27 09:47
2003.02.06
Caps и Insert со товарищи


1-15736
John
2003-01-27 21:21
2003.02.06
HELP!!! Есть цикл, который крутится довольно долго, какую команду


9-15383
BJValentine
2002-08-05 11:44
2003.02.06
Первый блин комом