Работа с DBGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Работа с DBGrid

Сообщение alexmai » 11.12.2009 11:03:59

avis писал(а):
alexs писал(а):
avis писал(а):dbGrid1.SelectedIndex:= 0; //здесь можно указать любой номер Объясни в чем принципиальная разница? Подключен DataSource вот только свойства Fields я так и не нашел у него

Свойство Fields у Dataset ( датасэтом у тебя является SQLQUERY ) , а не DataSource
Во вторых работать надо только с dataset, в гриде информация может быть не актуальна
Выделеная строка грида это соответствующая запись в наборе данных Dataset
поэтому работать надо с dаtaset, причем после модификации записей делать
SQLQUERY1.refresh чтобы обновить таблицу грида
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

Re: Работа с DBGrid

Сообщение avis » 11.12.2009 11:58:04

понял, спасибо
avis
новенький
 
Сообщения: 19
Зарегистрирован: 04.11.2009 13:18:10

Re: Работа с DBGrid

Сообщение alexs » 11.12.2009 20:56:56

ОБъясняю по буквам
dbGrid1.SelectedIndex:= 0;
гриду задаёш номер столбца
ShowMessage(dbGrid1.SelectedField.AsString);
обращаешся через указатели с полю
хотя конструкция и выглядит небольшой - на самом деле это не поля - а свойства и в реальном коде тут будет очень много вызовов всяких функция и адресной арифметики для получения доступа к нужному тебе полю

а правильно надо обращаться через DataSet (вернее его наследника) (ты так и не сказал конкретно что ты используеш)
поля находятся в нём и обращением к нему ты сразу отсекаеш этап из 2-х компонентов.
Твой код - это:
DBGrid -> DataSourse -> DataSet -> Field
А я говорю про:
DataSet -> Field
Разница есть?
avis писал(а):DataSource вот только свойства Fields я так и не нашел у него

DataSource - это прослока между набором данных и визуальными компонентами
тебя, как прикладного программиста, она вобще не должна волновать. Положил но форму, связала данны и забыл про неё.
А для работы с данными используй методы твоего DataSet-а.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Работа с DBGrid

Сообщение dunin » 15.01.2010 15:30:47

Как раскрасить грид?

В Delphi делал так:
Код: Выделить всё
procedure TMainForm.GridDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);

  var
    GholdColor, MholdColor: TColor;
begin

GholdColor := tDBGrid(Sender).Canvas.Brush.Color; //сохраняем оригинальный цвет
MholdColor := tDBGrid(Sender).Canvas.Font.Color;
  if (not (gdFocused in State)) and (not (gdSelected in State)) then begin
      //if TigerGrid then
      if (tDBGrid(Sender).DataSource.DataSet.RecNo mod 2 = 0) then begin
        tDBGrid(Sender).Canvas.Brush.Color := GridColor; //clBtnFace;
      end;
   end;
tDBGrid(Sender).DefaultDrawColumnCell (Rect, DataCol, Column, State);
tDBGrid(Sender).Canvas.Brush.Color := GholdColor;
tDBGrid(Sender).Canvas.Font.Color := MholdColor;
end;

В lazarus не работает. Где грабли?
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Работа с DBGrid

Сообщение dunin » 18.01.2010 12:28:25

dunin писал(а):Как раскрасить грид?
...

Ни кто не знает?
Может у кого-нибудь пример раскраски Grid-а найдется?
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Работа с DBGrid

Сообщение Ustas » 18.01.2010 15:09:08

На первый взгляд, в DBGrid нет возможности отображать стоку в ячейки в несколько строк, с переносом. Да и на второй, я ничего не нашел... В Delphi для этого я пользовался RxDBGrid. В Lazarus`е есть какие нибудь наработки в этом вопросе?
Ustas
постоялец
 
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Работа с DBGrid

Сообщение Attid » 18.01.2010 15:41:27

Ustas писал(а):RxDBGrid

есть в лазарусе. ставьте компоненты, на форуме есть тема про RX
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Работа с DBGrid

Сообщение Ustas » 18.01.2010 17:22:16

Attid писал(а):
Ustas писал(а):RxDBGrid

есть в лазарусе. ставьте компоненты, на форуме есть тема про RX


Вопрос не про RX был, а про "несколько строк в ячейке". Кстати, в RxDBGRid пакета RxLib я тоже не нашел нужного.
Ustas
постоялец
 
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Работа с DBGrid

Сообщение Brainenjii » 18.01.2010 20:15:12

DBGrid'ом не пользовался, так что не уверен, что поможет, но для TDrawGrid'a:
Код: Выделить всё
Function GetHeight(Const aCanvas: TCanvas; Const aRect: TRect; Const aString: String): Integer;
Begin
  If aCanvas.TextWidth(aString) > aRect.Right - aRect.Left Then
    Result := aCanvas.TextHeight(aString) * Ceil((aRect.Right - aRect.Left) / aCanvas.TextWidth(aString))
  Else
    Result := aCanvas.TextHeight(aString);
End;

Procedure TFormMain.DrawGridMainDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
Var
  Style: TTextStyle;
Begin
  Style.Wordbreak := TRUE;
  Style.SingleLine := FALSE;
  Style.Opaque := TRUE;
  With DrawGridMain.Canvas Do
    Case aCol Of
      0:
        Begin
          DrawGridMain.RowHeights[aRow] := Max(DrawGridMain.RowHeights[aRow], GetHeight(DrawGridMain.Canvas,
            aRect, 'Очень-очень длинная строка'));
          Brush.Color := $FFAAFF;
          FillRect(aRect);
          TextRect(aRect, aRect.Left, aRect.Top, 'Очень-очень длинная строка', Style);
        End;
      1:
        Begin
          DrawGridMain.RowHeights[aRow] := Max(DrawGridMain.RowHeights[aRow], GetHeight(DrawGridMain.Canvas,
            aRect, 'Очень-очень длинная строка2'));
          Brush.Color := $AAFFAA;
          FillRect(aRect);
          TextRect(aRect, aRect.Left, aRect.Top, 'Очень-очень длинная строка2', Style);
        End;
    End;
End;

Как-то так ^_^ За работоспособность не ручаюсь - не могу пока лазаря дома собрать ^_^ 2.4.0 не сдаётся ^_^
Последний раз редактировалось Brainenjii 19.01.2010 07:59:47, всего редактировалось 1 раз.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Работа с DBGrid

Сообщение alexs » 18.01.2010 20:18:44

Ustas писал(а):а про "несколько строк в ячейке"

Просто переопредели отрисовку ячейки - и рисуй в ней во сколько хочеш строк. Не забудь высоту ячейки установить побольше.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Работа с DBGrid

Сообщение dunin » 19.01.2010 04:45:16

dunin писал(а):
dunin писал(а):Как раскрасить грид?
...

Ни кто не знает?
Может у кого-нибудь пример раскраски Grid-а найдется?

Примера тоже ни у кого нет? :?
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Работа с DBGrid

Сообщение Brainenjii » 19.01.2010 08:00:50

Вот теперь с раскраской ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Работа с DBGrid

Сообщение Ustas » 19.01.2010 13:56:25

alexs писал(а):
Ustas писал(а):а про "несколько строк в ячейке"

Просто переопредели отрисовку ячейки - и рисуй в ней во сколько хочеш строк. Не забудь высоту ячейки установить побольше.


Да я тоже к тому-же склоняюсь. Хотел это на черный день оставить. Видно, он уже начался давно, а я все сплю...

Спасибо всем!!!

А раскрасить:

Код: Выделить всё
procedure TForm.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Column.FieldName = 'ПОЛЕ' then
    begin
      TDBGrid(Sender).Canvas.FillRect(Rect);
      // фон
      TDBGrid(Sender).Canvas.Brush.Color := myColor1;
      // цвет
      TDBGrid(Sender).Canvas.Font.Color := myColor2;
      // а можно еще и написать заместо выводимого
      if Column.Field.AsInteger = 1 then
        TDBGrid(Sender).Canvas.TextOut(Rect.Left, Rect.Top, 'Люблю бисквитные торты и ...');
   end;
end;
Ustas
постоялец
 
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Работа с DBGrid

Сообщение alexs » 19.01.2010 22:53:48

Ustas писал(а):Да я тоже к тому-же склоняюсь. Хотел это на черный день оставить. Видно, он уже начался давно, а я все сплю...

Если получится универсально и красиво (многострочный текст) - то можно интегрировать в RxDBGrid :-)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Работа с DBGrid

Сообщение Ustas » 21.01.2010 14:13:01

alexs писал(а):Если получится универсально и красиво (многострочный текст) - то можно интегрировать в RxDBGrid :-)


http://www.delphimaster.ru/articles/str ... index.html
http://www.delphisources.ru/pages/faq/b ... bgrid.html

DrawText неплохо рисует. А что бы универсально и красиво получилось надо править исходники. Вот тут автору и флаг в руки.
Ustas
постоялец
 
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 221

Рейтинг@Mail.ru