| | | | |
Полный текст материала
Другие публикации автора: Елена Филиппова Другие публикации автора: Игорь Шевченко
Цитата или краткий комментарий: «... Материал рассчитан на начинающих программистов, которые хотят научиться не только использовать чужие компоненты, но и писать свои. Обычный TDBGrid можно превратить в мощный инструмент своими руками, заточив его под определенные задачи.
Сложные и многострочные заголовки, внедрение компонентов для
редактирования ячеек, имитация внутренних группировок и многое
другое... ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 36 | 94.7% | | | | Ничего особенно нового и интересного | [2] | 2 | 5.3% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 38 | | | Все понятно, материал читается легко | [1] | 30 | 90.9% | | | | Есть неясности в изложении | [2] | 3 | 9.1% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 33 |
[TDBGrid] [Отображение списков, сеток]
Отслеживать это обсуждение
Всего сообщений: 6303-06-2017 13:03Спасибо за рассказ о таких замечательных возможностях DBGrid.
Вопрос такой:
1) есть ли адаптация под что-нибудь современное? Ибо BDE безнадежно устарел и даже полностью отсутствует в моем Delphi XE7...
2) Не совсем понятна организация функции внутри процедуры в разделе 2, к тому же проверка синтаксиса ругается, если внести, как из статьи. |
|
13-03-2013 05:11Спасибо, очень пригодилась статья! |
|
29-09-2012 08:49Спасибо - всё очень доступно >>> |
|
01-08-2012 14:14Отличная статья!
Как раз делаю не очень сложный проект, все написанное очень пригодилось!
Автору большое спасибо! |
|
01-03-2009 06:15у меня почему-то никак не работает Подмена стандартного Inplace-Editor'a в DBGrid отдельным компонентом на примере TDBComboBox. при запуске пишется ошибка
Project Clients.exe raised exeption class EAssessViolation with massages 'Access violation at address 004B4E2F in module 'Clients.exe'. Read of address 00000038'. Process stopped...
Подскажите, пожалуйста, что может быть не так...
P.S. Весь код брала из статьи НеОбычный грид, не знаю в чем проблема..
Заранее спасибо!! |
|
18-06-2008 09:13Елена, спасибо, что обратили внимание на вопрос.
В екселе сохраняется полный доступ к фиксированным колонкам, установка фокуса, редактирование, щелчок по заголовку столбца - в частности, установка фильтра.
т.е. "колонки не реагируют" - для пользователя очень неудобное ограничение, и ухудшает его отношение к разрабатываемой и внедряемой системе.
|
|
03-06-2008 05:26Это же DBGrid, то есть для работы с базой данных. Нет в нем понятия "строка", есть запись в TDBGrid.DataSource.DataSet. То есть переход между колонками (полями DataSet) Вы можете определить через приведенное Вами событие, а переход "по вертикали" -- это переход между записями в соответствующем DataSet. Смотрите, например, событие TDataSet.AfterScroll или универсальное событие TDataSource.OnDataChange (но во втором случае Вам придется научиться самостоятельно определять когда это событие возникает при скроллинге, а когда, например, при изменении данных вследствие редактирования). |
|
03-06-2008 03:34Полезная тема.
Но есть один ньюанс, вот суть:
У DBGrid есть только это событие OnColExit (т.е. при выходе из КОЛОНКИ), а вот выхода из ЯЧЕЙКИ (типа OnCellExit) - нету.
вот в этом и проблема!
в примере написано такое условие
if DBGrid2.SelectedField.FieldName = FEditor.DataField then...
т.е. условие выполниться только в том случае, если вы находитесь на "своём" нужном поле (колонке).
А если например ткнуть мышкой на "свой" столбец, но в другой строке, то событие не сработает, т.к. помешает условие. т.е. условие не выполниться, т.к. не было выхода из столбца. сменились только строки.
Не могу додуматься как реализовать собитие выхода непосредственно из ячейки. |
|
30-05-2008 02:47сообщение от автора материала Наталья, думаю конкретная реализация зависит от того, что именно Вы хотите получить в итоге.
В статье описан способ полной имитации фиксированных колонок, которые реализованы в TDrawGrid.
Независимо от того, как они выглядят, основное, чего хотелось достигнуть, это:
1) колонки не прокручиваются
2) не реагируют на ввод пользователя и клики мыши
Если Вам нужен другой функционал, то конечно, его нужно реализовывать иначе.
А как ведут себя фиксированные колонки в Excel?
|
|
29-05-2008 09:34Полезная статья, есть неясности.
Обязательно нужен доступ к фиксированным ячейкам, т.к. на этом основаны поиск, фильтрация и сортировка.
Клиенту нужна замена ексельной таблицы с сохранением прежних сервисов и добавлением новых.
Как сделать фиксацию с сохранением доступа к ячейкам и заголовкам фиксированных столбцов?
Не проще ли реализовать фиксацию на свойстве Visible объектов Column или Field ... ? |
|
21-10-2007 14:49Добрый день!
У меня пару не ясностей ?? по теме "Использование фиксированных колонок", очень хотелось бы разобраться в следующем:
procedure TexDBGrid.SetFixedCols(const Value: Integer); Var FixedCount,i : Integer; begin
// Следует учесть индикатор грида
IF Value <= 0 Then FixedCount:=IndicatorOffset
Else FixedCount := Value + IndicatorOffset;
IF DataLink.Active AND NOT (csDesigning in ComponentState) AND (ColCount
> IndicatorOffset + 1) Then
Begin
IF FixedCount >= ColCount Then
FixedCount:=ColCount - 1;
Inherited FixedCols := FixedCount;
// На фиксированных колонках нельзя останавливаться по табуляции
?? Почему начинается проверка фиксированных колонок с единицы, а не с нуля?? И почему используется (TexDBGrid).FixedCols, а не FixedCount??
For i := 1 To FixedCols Do
TabStops[I] := False;
End;
?? Почему не := inherited {TCustomGrid.}FixedCols ?? FFixedCols := FixedCount - IndicatorOffset; end;
Зарание благодарю |
|
11-07-2007 05:19Великолепная статья опубликована ещё в 2003г, но до сих пор актуальна по крайней мере
для меня, а не осветите ли следующий вопрос -
Как отображать ячейки в следущем виде?
--------+-----+-------
поле1 |цена | поле4
|сумма|
----------------------
| 10 |
+-----+
| 100 |
----------------------
Нигде не могу найти ответ на этот вопрос |
|
26-01-2007 07:22Скажите, а есть ли в наследнике DBGrid функция аналогичная
DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
чтоб можно было перекрашивать строки по условию? |
|
05-12-2006 17:04а как сделать в DBGrid выделение подстроки текста в ячейке, не наследуя компонеты
типа поиск по первым буквам
пример ищем Россия |
|
15-05-2006 23:41
13-05-2006 17:35
13-05-2006 17:16
09-08-2005 10:40МегаБубен иногда слишком сильно глючит, но идея в общем-то нормальная. Буду править. |
|
09-08-2005 06:47Видел бубен. Переделал. Теперь у меня есть МегаБубен. Рисование многострочных заголовков. Не самый оптимальный код, но всё в DrawColumnCell и больше ничего. Работает в C++Builder 6. программистамненужныпробелы
void __fastcall TForm_Main::DBGrid_DealsDrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
else
|
|
20-05-2005 11:44Вы подразумеваете именно "несколько ячеек" или весь столбец?
Для начала - "несколько ячеек", весь столбец, думаю, не понадобится.
А вообще-то и на весь столбец, думаю, можно такое распространить :) |
|
20-05-2005 11:34сообщение от автора материала Спасибо!
>>>В разделе "Имитация внутренних группировок" описана группировка горизонтальных ячеек. А можно ли по аналогии объединять и несколько вертикальных ячеек?
Вы подразумеваете именно "несколько ячеек" или весь столбец? |
|
20-05-2005 11:29Здраствуйте, очень хорошая статья.
В разделе "Имитация внутренних группировок" описана группировка горизонтальных ячеек. А можно ли по аналогии объединять и несколько вертикальных ячеек? |
|
20-05-2005 01:42Alex: а как... Какие последние новости на луне? |
|
19-05-2005 11:46а как всё-таки в стандартном DBGride выделить
цветом текущую строку с возможностью её редактирования. |
|
08-04-2005 07:21
02-04-2005 06:10
02-04-2005 04:50"А можно ли средствами стандартного DBGrid сделать так, чтобы строка с курсором выделялась цветом? Или надо обязательно использовать TexDBGrid?". Дело в том, что программу я уже написал и переписывать всё очень уж не хочется.
При ответе, пожалуйста, учитывайте что я новичок(как, наверное, и большинство из задающих вопросы.) и , по возможности, давайте подробные ответы. Спасибо.
|
|
06-10-2004 13:06Предлагаю связать обсуждение этой статьи со статьей "DBTreeview своими руками". :) Тем более, что они одним автором написаны :))
Я как раз бьюсь над тем, как связать дерево, построенное по принципу, описанному в статье и как отобразить данные в гриде со сложным заголовком.
Если построить дерево по данным из этого примера, то получится примерно такая таблица:
id, name, parent
1, география, 0
2, параметры, 0
3, страна, 1
4, столица, 1
5, площадь, 2
Вопрос в том, что таблица эта - живая, в нее могут добавляться новые свойства и заранее не известно, сколько параметров будет, скажем у географических свойств.
Еще пытаюсь сделать так: при распахивании дерева - появляются столбцы грида в соответствии с иерархией. Скажем, если распахнуто только свойство "географические", то показываются все столбцы этого уровня. Если выбрана "страна", то только ее и отображаю. Идея красивая, а вот красиво реализовать ее у меня не получается. Может, подкинете идею? |
|
04-08-2004 16:37Статья примечательна тем, что в ней собраны различные расширения TDBGrid, можно выбрать, что требуется. Можно было бы показать, как раскрасить и фонтировать отдельные строки-столбцы-ячейки по аналогии TRxDBGrid. Впрочем, зачем повторяться ?
А по тексту - зачем в главе 1 выносить RowHeights в раздел public ? THackGrid его и защищенным увидит. Далее в GetSlaveGrid: стоит заменить название компонента, получите RTE, мне кажется, имя компонентов в явном виде стоит употреблять как можно реже, кроме случаев, когда без этого не обойтись.
Очень хотелось бы увидеть, как обойти проблему со скроллбаром, т.е. чтобы скроллбар не просто висел справа для красоты, а позволял осуществлять правдоподобную навигацию. |
|
22-03-2004 12:03сообщение от автора материала >>>Кто-нибудь, может объяснить мне назначение компонентов TDataSourse, доступным для ребёнка языком?
TDataSоurce это некий буфер (шлюз) между DataSet компонентами (TTable, TQuesry, SToredProc, TClientDataSet, TADOTable и так далее) и между data-aware компонентами, то есть компонентами, отображающими данные на форме (TDBGrid, TDBEdit и тому подобное).
TDataSоurce необходим, если вы хотите именно отображать данные на форме и модифицировать их с помощью data-aware компонентами.
Если этого делать не надо, то и TDataSоurce не нужен. |
|
18-02-2004 18:46Есть что-то новое и интресное |
|
27-11-2003 17:25Кто-нибудь, может объяснить мне назначение компонентов TDataSourse, доступным для ребёнка языком? |
|
29-10-2003 11:27сообщение от автора материала День добрый,
По поводу скролла в стандартном DBGrid и неисчезовении редактора (опять вопрос всплыл) :)
Действительно, наблюдается такой эффект, если редактор виден, и происходит горизонтальная прокрутка, то редактор может оставаться видимым, даже если поле, к которому он относится, перестало быть видимым после прокрутки. Причина, на мой взгляд, в том, что событие OnDrawColumnCell не вызывается для колонок, ставших невидимыми в результате прокрутки :)
Первый пришедший на ум способ решения проблемы заключается в перехвате сообщения WM_HSCROLL DBGrid'а, принудительной установке редактора в невидимое состояние и объявление недействительной клиентской области DBGrid.
В форме с гридом:
type
TForm1 = class(TForm)
.......
private
.......
FOldDbGridWndProc : Pointer;
procedure NewDbGridWndProc (var Message : TMessage);
procedure TForm1.NewDbGridWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_HSCROLL:
begin
InvalidateRect(DBGrid.Handle, nil, true);
FEditor.Visible := false;
end;
end;
with Message do
Result := CallWindowProc(FOldDbGridWndProc, DBGrid.Handle, Msg, wParam, lParam);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
FOldDbGridWndProc := Pointer(GetWindowLong(DBGrid.Handle, GWL_WNDPROC));
SetWindowLong(DBGrid.Handle, GWL_WNDPROC,
Integer(MakeObjectInstance(NewDbGridWndProc)));
end;
Если использовать не стандартный TDBGrid, а его наследник, то проблема решается объявлением события OnTopLeftChanged, установкой редактора в невидимое состояние и перерисовкой колонки, к которой относится редактор, если она остается видимой.
Если кто-нибудь подскажет более изящное решение, буду рад услышать.
С уважением, |
|
10-10-2003 01:15Спасибо Сообщение не подписано |
|
21-08-2003 11:07
20-08-2003 18:14День добрый, Vadim S
"Вешаться" скорее всего стоит на обработчик перерисовки грида :) Ячейка ведь рисуется заново при изменении значения поля.
С уважением,
Сообщение не подписано |
|
20-08-2003 16:58Интересно было бы узнать реализовывал ли кто-нибудь
DBGrid с строками разной высоты.
Т.е. первая строка 1символ высотой вторая-3,третья-2....
Пробовал реализовывать через
RowHeights[Row] , но не понятно на какое событие вешаться
при обновлении поля грида. |
|
11-08-2003 12:01сообщение от автора материала >>> В статье написано что свойство SubHeader привязывать не ко всему гриду, а к каждой его колонке. Что-то не поучается :о(
Можно пойти несколькими путями. Самый правильный, потому что легко контролируемый, это создать своего наследника от TDBGridColumns.
Самый простой путь, это создать параллельный список, дублирующий колонки и хранить в этом списке признак SubHeader для каждой колонки.
|
|
05-08-2003 17:09сообщение от автора материала День добрый,
Если есть предопределённые в design-time Columns, то событие OnDrawDataCell не возникает никогда
Может быть, стоит, как в примере, использовать событие OnDrawColumnCell ?
С уважением, |
|
05-08-2003 16:16А я вот споткнулась на подстановке PickList'а из Columns.
Если есть предопределённые в design-time Columns, то событие OnDrawDataCell не возникает никогда, не зависимо от значения DefaultDrawing.
А если их нет - то нет и PickList'ов, чего ж тогда подставлять?
Или я что-то неправильно поняла? |
|
23-07-2003 17:08Замечательная статья, большое спасибо авторам!
Только хотелось бы подробнее узнать как в сложных заголовках не все столбцы объединять. В статье написано что свойство SubHeader привязывать не ко всему гриду, а к каждой его колонке. Что-то не поучается :о(
Сообщение не подписано |
|
18-07-2003 07:11Замечательная статья, большое спасибо авторам!
Но вот аппетит приходит во время еды... :-))
Скажите, а можно сделать последнюю колонку Grid'а (для итогов)фиксированной? |
|
10-07-2003 11:35Код на билдере c++ версия 6, привожу часть рисования InPlaceEditor и его скрытия. FEditor - TDBCombobox - родитель Panel12(TPanel), она же родитель для DBGrid4(TDBGrid). FEditor12 - для редактирования даты TDBDateEdit из RxLib,оба едитора созданы в дизайн-тайм, более нигде свойства затрагивающие их видимость,размеры или местоположения не редактируются. Первый столбец(нулевой в TColumns) и TDBDateEdit привязаны к одному полю естественно и грид и TDBDateEdit имеют один и тот же TDateSourse, PicList столюца не заполнен, а TDBDateEdit - заполнен, вот и все наверное, а ну еще в DBGrid'e DefaultDrawing=true, опции dgRowSelect,dgAlwaysShowSelectionбdgMultiSelect =false , и может это и не важно - в качестве TDataSet использую TIBTable(UniDirectional=false)(работаю с IB 6.0).
void __fastcall TForm1::DBGrid4DrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
if(Column->Field->FieldName==FEditor12->DataField)
}
}
void __fastcall TForm1::DBGrid4ColExit(TObject *Sender)
if (DBGrid4->SelectedField->FieldName == FEditor12->DataField)
}
Вот и все. Проблему №2 я решил потом, двумя способами, первый - это я поместил Feditor на другую панель, родителем которой является DBGrid, Feditor разворачиваю на всю панель, а ее видимость,размеры и координаты уже определяю в DBGrid4DrawColumnCell, а второй способ - перехват WM_HSCROLL(подмена WindowProc для DBGrid4). А вот первую мою болячку только обошел, или проверять не gdFocused, а gdSelected(не очень красиво потом смотрится), или вставить нулевым псевдо столбец, можно его сделать и невидимым( ну пока не разобрался, что ж там происходит, почему нет фокуса:-( ) Спасибо за ответ:-), видимо это чисто мои проблемы(ошибки). Буду разбираться. |
|
09-07-2003 12:57Евгений, я проверила на тестовом примере, у меня выпадающий список ведет себя совершенно одинаково вне зависимости от того, в каком по счету столбце он находится.
>>>И когда я прокручиваю грид, то если мой FEditor был видимым, то так им и остается на том же месте
И такого эффекта я не смогла получить...
Наверное без того, чтобы посмотреть весь код, не разобраться :о(
|
|
09-07-2003 08:58Еще раз о подмене InplaceEditor'а. Попросил заказчик добавить в грид еще один столбец. В клиентскую область он не вошел(заказчик не возражал), появился горизонтальный скролл. И когда я прокручиваю грид, то если мой FEditor был видимым, то так им и остается на том же месте(координаты FEditor.Left := Rect.Left + DBGrid.Left; FEditor.Top := Rect.Top + DBGrid.top;), прокрутка естественно на него не влияет, и он успешно перекрывает другие столбцы грида. Поставил FEditor.Parent:=FEditor.DBGrid, и немного переделал следующее -
procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (gdFocused in State) then
if (Column.Field.FieldName = FEditor.DataField) then begin
{ Вместо стандартного InplaceEditor'а показываем ComboBox }
FEditor.Left := Rect.Left;
FEditor.Top := Rect.Top;
FEditor.Width := Rect.Right - Rect.Left + 2;
FEditor.Visible := True;
end;
end;
Стало все нормально. Еще раз спасибо за статью, несмотря на некоторые ньюансы, читаю ее с удовольствием, сам ранее не работал в этой области, так что подчерпнул много полезного:-))) |
|
07-07-2003 11:20С удовольствием прочитал, спасибо Игорь и Елена!!! Хочу сразу сказать, что я другой Евгений Веселов, не тот что писал сообщение ранее (ну удивился:-))))) Возникла у меня проблемка по разделу "Подмена стандартного Inplace-Editor'a в DBGrid отдельным компонентом на примере TDBComboBox." Пишу на билдере С++ 6.0 под Win XP. Все хорошо, если только столбец в котором я подменяю Inplace-Editor, не является первым. В этом случае у меня при запуске программы и перврм вхождении в столбец, не прорисовывается мой TDBComboBox. Пройдя отладчиком, обнаружил, что TGridDrawState State (void __fastcall TForm1::DBGrid4DrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State) )не содержит gdFocused, стоит мне перейти на другую форму, закладку на форме, другой столбец в DВGrid, как все становится нормально. Т.е. это возникает только один раз, самый первый. Код практически взял из примера. Хотелось бы узнать, есть ли у вас такие проблемы? Я конечно обошел это недразумение, но обошел, что не есть хорошо, или я ошибся и не могу найти ошибку, или есть проблема с "первым получением фокуса" в дбгриде(да простит меня борланд). Был бы благодарен за ответ, не пробовали ли вы ставить как и я столбец в котором я подменяю Inplace-Editor первым, и возникла ли у вас та же проблема? |
|
02-07-2003 17:00
25-06-2003 14:09
24-06-2003 17:33Для полного счастья не хватает отрисовки текста с переносом при фиксированной ширине ячейки |
|
19-06-2003 11:47Прекрасная статья!
Практически все, что так или иначе приходится дописывать самому при использовании TDBGrid уже есть в предлагаемом компоненте. "Для полного счастья" предлагаю только внести возможность навигации по таблице с использованием MouseWheel. Для этого нужно немного
TexDBGrid = class(TDBGrid)
private
...
FMouseWheelUp : TNotifyEvent;
FMouseWheelDown : TNotifyEvent;
...
published
...
property OnMoseWheelUp: TNotifyEvent read FMouseWheelUp write FMouseWheelUp;
property OnMoseWheelDown: TNotifyEvent read FMouseWheelDown write FMouseWheelDown;
...
protected
...
function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override;
function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override;
...
...
...
function TexDBGrid.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
if Assigned(FMouseWheelDown)
then FMouseWheelDown(Self)
else if (Assigned(DataSource)) and (not DataSource.DataSet.Eof)
then DataSource.DataSet.Next;
result := true;
end;
function TexDBGrid.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
if Assigned(FMouseWheelUp)
then FMouseWheelUp(Self)
else if (Assigned(DataSource)) and (not DataSource.DataSet.Bof)
then DataSource.DataSet.Prior;
result := true;
end;
...
...
|
|
18-06-2003 13:43Ээээ...у меня просто нет слов - 5 баллов.
Спасибо за интересный материал. |
|
17-06-2003 11:22Очень хорошо написано! Беру себе на заметку! Спасибо авторам! |
|
16-06-2003 07:09Замечательный материал. Побольше бы таких статей, просто и ясно изложенных. |
|
12-06-2003 13:03Очень содержательная статья. Спасибо авторам за качественный труд.
Может быть на основе этой статьи всем миром создать фирменный грид Королевства? Который будет развиваться и тестироваться его жителями. |
|
11-06-2003 14:22Кстати, при изменении размера окна на котором расположен Grid, в ячейке которого, в свою очередь, отображен какой-либо контрол получается интересный эффект: контрол вылезает за пределы грида. |
|
11-06-2003 11:42
11-06-2003 11:31Я еще и самы невнимательный читатель..Просто смотрел на начало статьи..а потом просто читал ИДЕИ..И конечно не увидел слона :))))) |
|
11-06-2003 11:18>>>Одна из самых шикарных статей, которые я видел.
Спасибо, Евгений :о) |
|
11-06-2003 11:16Eugene Veselov
>>>Вдруг надо 100 таких гридов в проэкте ?
К статье прилагается проект, который состоит из трех частей. В одной из их приводится исходный код TexDBGrid, наследника от стандартного TDBGrid, который умеет делать все, про что написано в статье. Именно код этого компонента и описывается в тексте.
Создавайте свой на основе TexDBGrid или на его примере. И используйте его один в 100 нужных местах :о)) |
|
11-06-2003 11:09Одна из самых шикарных статей, которые я видел.
Только бы автора хоть немного намекнули про то, что желдательно все это делать в контексте разработки компонента...Вдруг надо 100 таких гридов в проэкте ? |
|
11-06-2003 08:38
11-06-2003 07:29Только я не понял следующий момент - зачем необходима отрисовка компонента подменяющего InplaceEditor в событии DrawColumnCell?
Я эти вещи делаю следующим образом:
компонет замена появляется по событиям
procedure DBGrid1KeyUp
if ((Key=Key_F2)or
(Key=Key_Return)or
(Key=Key_Enter))and
(DBGrid1.InplaceEditor.Visible)
procedure DBGrid1MouseUp
if DBGrid11.InplaceEditor.Visible
При этом заметно некоторое мигание правда, но гарантируется что компонент-замена появляется только когда ячейка редактируется. |
|
10-06-2003 20:46
|
|