Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Hello, World!
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  08:04[Войти] | [Зарегистрироваться]

Обсуждение материала
НеОбычный TDBGrid
Полный текст материала


Другие публикации автора: Елена Филиппова
Другие публикации автора: Игорь Шевченко

Цитата или краткий комментарий:

«... Материал рассчитан на начинающих программистов, которые хотят научиться не только использовать чужие компоненты, но и писать свои. Обычный TDBGrid можно превратить в мощный инструмент своими руками, заточив его под определенные задачи. Сложные и многострочные заголовки, внедрение компонентов для редактирования ячеек, имитация внутренних группировок и многое другое... ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.

Результаты голосования
Оценка содержания

  Содержит полезные и(или) интересные сведения
[1]3694.7%
 
  Ничего особенно нового и интересного
[2]25.3%
 
  Написано неверно (обязательно укажите почему)
[3]00%
 
Всего проголосовали: 38

Оценка стиля изложения

  Все понятно, материал читается легко
[1]3090.9%
 
  Есть неясности в изложении
[2]39.1%
 
  Непонятно написано, трудно читается
[3]00%
 
Всего проголосовали: 33




Смотрите также материалы по темам:
[TDBGrid] [Отображение списков, сеток]

Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 63

03-06-2017 13:03
Спасибо за рассказ о таких замечательных возможностях DBGrid.
Вопрос такой:
1) есть ли адаптация под что-нибудь современное? Ибо BDE безнадежно устарел и даже полностью отсутствует в моем Delphi XE7...
2) Не совсем понятна организация функции внутри процедуры в разделе 2, к тому же проверка синтаксиса ругается, если внести, как из статьи.


13-03-2013 05:11
Спасибо, очень пригодилась статья!


29-09-2012 08:49
Спасибо - всё очень доступно >>>
 koda


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
Елена, спасибо, что обратили внимание на вопрос.
В екселе сохраняется полный доступ к фиксированным колонкам, установка фокуса, редактирование, щелчок по заголовку столбца - в частности, установка фильтра.
т.е. "колонки не реагируют" - для пользователя очень неудобное ограничение, и ухудшает его отношение к разрабатываемой и внедряемой системе.
 Nat


03-06-2008 05:26
Это же DBGrid, то есть для работы с базой данных. Нет в нем понятия "строка", есть запись в TDBGrid.DataSource.DataSet. То есть переход между колонками (полями DataSet) Вы можете определить через приведенное Вами событие, а переход "по вертикали" -- это переход между записями в соответствующем DataSet. Смотрите, например, событие TDataSet.AfterScroll или универсальное событие TDataSource.OnDataChange (но во втором случае Вам придется научиться самостоятельно определять когда это событие возникает при скроллинге, а когда, например, при изменении данных вследствие редактирования).
 Geo


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 ... ?
 Nat


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
Все файлы с http://delphi.mtu-net.ru/zip/ переехали на http://www.delphikingdom.com/zip/
Не во всех статьях еще ссылки поправлены.


13-05-2006 17:16
Уважаемые гении и сильные мира сего!
Чтоб задавать по-меньше глупых вопросов (я многого не понял). Можно ли мне как-то взглянуть на исходник
http://delphi.mtu-net.ru/zip/exdbgrid.zip
(кажется ссылка битая, не могу скачать) со страницы
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=806
, а то я пытался по тексту составить подобный результат, да ничего не вышло..

За ранее благодарен.


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)
{
    int where_space = Column->Title->Caption.Pos(" ");
    int H = DBGrid_Deals->Canvas->TextHeight("gW");
    int RH = (H + 2) * 2;
    ((TMyAccessGrid*)DBGrid_Deals)->RowHeights[0] = RH;
    TRect ARect;
    SetRect(&ARect, Rect.Left, 0, Rect.Right, RH);
    InflateRect(&ARect,-2,-2);
    DBGrid_Deals->Canvas->Brush->Color = clBtnFace;
    DBGrid_Deals->Canvas->FillRect(ARect);
    if(where_space==0)
    {
        ::DrawText(DBGrid_Deals->Canvas->Handle,Column->Title->Caption.c_str(),
            -1,&ARect,DT_CENTER | DT_SINGLELINE | DT_VCENTER );
    }

    else
    {
        AnsiString as = Column->Title->Caption;
        ::DrawText(DBGrid_Deals->Canvas->Handle,
                as.SubString(0,where_space).c_str(),
            -1,&ARect,DT_CENTER | DT_SINGLELINE );
            
        ARect.top+=H;
        ::DrawText(DBGrid_Deals->Canvas->Handle,
                as.SubString(where_space+1,as.Length()).c_str(),
            -1,&ARect,DT_CENTER | DT_SINGLELINE );
    }




20-05-2005 11:44
Вы подразумеваете именно "несколько ячеек" или весь столбец?
Для начала - "несколько ячеек", весь столбец, думаю, не понадобится.
А вообще-то и на весь столбец, думаю, можно такое распространить :)


20-05-2005 11:34
сообщение от автора материала
Спасибо!

>>>В разделе "Имитация внутренних группировок" описана группировка горизонтальных ячеек. А можно ли по аналогии объединять и несколько вертикальных ячеек?

Вы подразумеваете именно "несколько ячеек" или весь столбец?


20-05-2005 11:29
Здраствуйте, очень хорошая статья.
В разделе "Имитация внутренних группировок" описана группировка горизонтальных ячеек. А можно ли по аналогии объединять и несколько вертикальных ячеек?


20-05-2005 01:42
Alex: а как... Какие последние новости на луне?


19-05-2005 11:46
а как всё-таки в стандартном DBGride выделить
цветом текущую строку с возможностью её редактирования.


08-04-2005 07:21
Спасибо!


02-04-2005 06:10
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=28804

http://www.delphikingdom.com/asp/answer.asp?IDAnswer=28948


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; // старая оконная процедура DBGrid'а
    procedure NewDbGridWndProc (var Message : TMessage); // Новая оконная процедура
                                                   // для DBGrid'а

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
Vadim S :
вы невнимательны. Чуть ниже уже говорилось об этом
http://www.delphikingdom.com/treasury/samples.htm#link4
Сообщение не подписано


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(State.Contains(gdFocused))
  {
   if(Column->Field->FieldName==FEditor->DataField)
   {
      FEditor->Left = Rect.Left + DBGrid4->Left;
      FEditor->Top = Rect.Top + DBGrid4->Top;
      FEditor->Width = Rect.Right - Rect.Left + 2;
      FEditor->Visible = true;
      return;
   }

    if(Column->Field->FieldName==FEditor12->DataField)
   {
      FEditor12->Left = Rect.Left + DBGrid4->Left;
      FEditor12->Top = Rect.Top + DBGrid4->Top;
      FEditor12->Width = Rect.Right - Rect.Left + 2;
      FEditor12->Visible = true;
   }

   }
}


void __fastcall TForm1::DBGrid4ColExit(TObject *Sender)
{
if (DBGrid4->SelectedField->FieldName == FEditor->DataField)
{
    FEditor->Visible = false;
     return;
    }

  if (DBGrid4->SelectedField->FieldName == FEditor12->DataField)
{
    FEditor12->Visible = false;
    }

}


Вот и все. Проблему №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
>>>Для полного счастья не хватает отрисовки текста с переносом при фиксированной ширине ячейки

Это нетрудно сделать. Нужно воспользоваться функцией DrawText
Пример:
http://www.delphikingdom.com/treasury/samples.htm#link4


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:16
Eugene 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
Круто!


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
"Мы с тобой одной крови — ты и я!". Чьи это заветные слова?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.

Оценка содержания
 
Содержит полезные и(или) интересные сведения
 
Ничего особенно нового и интересного
 
Написано неверно (обязательно укажите почему)


Оценка стиля изложения
 
Все понятно, материал читается легко
 
Есть неясности в изложении
 
Непонятно написано, трудно читается

Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования