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

Вниз

Помогите с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.011 c
3-15471
Calm
2003-01-20 14:42
2003.02.06
Пользователям IBExpress маленький вопросик


3-15473
mic_2000
2003-01-20 12:40
2003.02.06
Вопрос rFunc для Ib6, немогу с функцией IIF разобраться


3-15517
Наташа
2003-01-20 18:04
2003.02.06
первичный ключ


1-15755
Fiend
2003-01-28 11:00
2003.02.06
Хотел было поймать WM_MDIMAXIMIZE, да не тут-то было :(


1-15747
Brain
2003-01-27 11:24
2003.02.06
Items - Очень надо.





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