C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как подправить rxdbgrid?
VovaN
Отправлено: 12.09.2005, 11:26


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Надо немного модифицировать метод DrawCell. Беру пакет rxdb5, файл rxdbctrl. Там этот метод описан как
CODE

procedure TRxDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
 AState: TGridDrawState);

Если пытаюсь дописать просто begin-end вылетает куча ошибок.
Что я делаю не так?
Guest
Отправлено: 12.09.2005, 11:32


Не зарегистрирован







А вы делаете это у наследника?
VovaN
Отправлено: 12.09.2005, 11:37


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Нет, прямо у рх грида.
Guest
Отправлено: 12.09.2005, 12:02


Не зарегистрирован







Тогда, если найдете и рискнете, правьте в исходном тексте RxGrid'а и пересобирайте библиотеку.
Но лучше сделать наследника и перекрыть его метод (как это положено по правилам)
VovaN
Отправлено: 12.09.2005, 12:07


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Я так и пытаючь делать — правлю исходник рхдбгрида и пересобираю библиотеку. С наследником не получится — надо править именно исходник (задача такая).
gvg
Отправлено: 12.09.2005, 12:48


Машинист паровоза

Группа: Участник
Сообщений: 222



Что там про begin-end? Не в interface часом пишете? Если в implementation, так там уже есть и begin и end...
VovaN
Отправлено: 12.09.2005, 13:29


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Пишу в имплементейшен.
Там было такое:
CODE

procedure TRxDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
 AState: TGridDrawState);

А я хочу сделать такое:
CODE

procedure TRxDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
 AState: TGridDrawState);
 begin
   if (ARow = DataLink.ActiveRecord) then
     begin
       if  not (gdSelected in AState) then
         begin
           Canvas.Brush.Color:=clYellow;
           inherited DrawCell(ACol, ARow, ARect, AState);
         end;
     end;
 end;

При этом вылетают куча левых ошибок.
Guest
Отправлено: 12.09.2005, 13:41


Не зарегистрирован







QUOTE (VovaN @ 12/09/2005, 13:29)
Пишу в имплементейшен.
Там было такое:
CODE

procedure TRxDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
AState: TGridDrawState);


И что, в исходнике вообще не было тела у процедуры? Я там вижу, идут вложенные функции и процедуры дальше...
VovaN
Отправлено: 12.09.2005, 13:52


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Тела процедуры нет. Это — всё что там написано в имплементейшен.
В интерфейс написано:
CODE

procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
Guest
Отправлено: 12.09.2005, 14:16


Не зарегистрирован







Ну, не знаю... У меня в 2.75 следующее:
CODE

procedure TRxDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
 AState: TGridDrawState);

{$IFDEF RX_D4}
 function CalcTitleRect(Col: TColumn; ARow: Integer; var MasterCol: TColumn): TRect;
   { copied from Inprise's DbGrids.pas }
 var
   I,J: Integer;
   InBiDiMode: Boolean;
   DrawInfo: TGridDrawInfo;
 begin
   MasterCol := ColumnAtDepth(Col, ARow);
   if MasterCol = nil then Exit;
   I := DataToRawColumn(MasterCol.Index);
   if I >= LeftCol then J := MasterCol.Depth
   else begin
     if (FixedCols > 0) and (MasterCol.Index < FixedCols) then begin
       J := MasterCol.Depth;
     end
     else begin
       I := LeftCol;
       if Col.Depth > ARow then J := ARow
       else J := Col.Depth;
     end;
   end;
   Result := CellRect(I, J);
   InBiDiMode := UseRightToLeftAlignment and (Canvas.CanvasOrientation = coLeftToRight);
   for I := Col.Index to Columns.Count — 1 do begin
     if ColumnAtDepth(Columns[I], ARow) <> MasterCol then Break;
     if not InBiDiMode then begin
       J := CellRect(DataToRawColumn(I), ARow).Right;
       if J = 0 then Break;
       Result.Right := Max(Result.Right, J);
     end
     else begin
       J := CellRect(DataToRawColumn(I), ARow).Left;
       if J >= ClientWidth then Break;
       Result.Left := J;
     end;
   end;
   J := Col.Depth;
   if (J <= ARow) and (J < FixedRows — 1) then begin
     CalcFixedInfo(DrawInfo);
     Result.Bottom := DrawInfo.Vert.FixedBoundary -
       DrawInfo.Vert.EffectiveLineWidth;
   end;
 end;

 procedure DrawExpandBtn(var TitleRect, TextRect: TRect; InBiDiMode: Boolean;
   Expanded: Boolean); { copied from Inprise's DbGrids.pas }
 const
   ScrollArrows: array [Boolean, Boolean] of Integer =
     ((DFCS_SCROLLRIGHT, DFCS_SCROLLLEFT), (DFCS_SCROLLLEFT, DFCS_SCROLLRIGHT));
 var
   ButtonRect: TRect;
   I: Integer;
 begin
   I := GetSystemMetrics(SM_CXHSCROLL);
   if ((TextRect.Right — TextRect.Left) > I) then begin
     Dec(TextRect.Right, I);
     ButtonRect := TitleRect;
     ButtonRect.Left := TextRect.Right;
     I := SaveDC(Canvas.Handle);
     try
       Canvas.FillRect(ButtonRect);
       InflateRect(ButtonRect, -1, -1);
       with ButtonRect do
         IntersectClipRect(Canvas.Handle, Left, Top, Right, Bottom);
       InflateRect(ButtonRect, 1, 1);
       { DrawFrameControl doesn't draw properly when orienatation has changed.
         It draws as ExtTextOut does. }
       if InBiDiMode then { stretch the arrows box }
         Inc(ButtonRect.Right, GetSystemMetrics(SM_CXHSCROLL) + 4);
       DrawFrameControl(Canvas.Handle, ButtonRect, DFC_SCROLL,
         ScrollArrows[InBiDiMode, Expanded] or DFCS_FLAT);
     finally
       RestoreDC(Canvas.Handle, I);
     end;
     TitleRect.Right := ButtonRect.Left;
   end;
 end;
{$ENDIF RX_D4}

var
 FrameOffs: Byte;
 BackColor: TColor;
 SortMarker: TSortMarker;
 Indicator, ALeft: Integer;
 Down: Boolean;
 Bmp: TBitmap;
 SavePen: TColor;
 OldActive: Longint;
 MultiSelected: Boolean;
 FixRect: TRect;
 TitleRect, TextRect: TRect;
 AField: TField;
{$IFDEF RX_D4}
 MasterCol: TColumn;
 InBiDiMode: Boolean;
{$ENDIF}
{$IFDEF WIN32}
 DrawColumn: TColumn;
const
 EdgeFlag: array[Boolean] of UINT = (BDR_RAISEDINNER, BDR_SUNKENINNER);
{$ENDIF}
begin
 inherited DrawCell(ACol, ARow, ARect, AState);
{$IFDEF RX_D4}
 InBiDiMode := Canvas.CanvasOrientation = coRightToLeft;
{$ENDIF}
 if (dgIndicator in Options) and (ACol = 0) and (ARow — TitleOffset >= 0)
   and MultiSelect and (DataLink <> nil) and DataLink.Active and
   (Datalink.DataSet.State = dsBrowse) then
 begin { draw multiselect indicators if needed }
   FixRect := ARect;
   if ([dgRowLines, dgColLines] * Options = [dgRowLines, dgColLines]) then
   begin
     InflateRect(FixRect, -1, -1);
     FrameOffs := 1;
   end
   else FrameOffs := 2;
   OldActive := DataLink.ActiveRecord;
   try
     Datalink.ActiveRecord := ARow — TitleOffset;
     MultiSelected := ActiveRowSelected;
   finally
     Datalink.ActiveRecord := OldActive;
   end;
   if MultiSelected then begin
     if (ARow — TitleOffset <> Datalink.ActiveRecord) then Indicator := 0
     else Indicator := 1;  { multiselected and current row }
{$IFDEF WIN32}
     FMsIndicators.BkColor := FixedColor;
{$ELSE}
     Canvas.Brush.Color := TitleColor;
     Canvas.FillRect(FixRect);
{$ENDIF}
     ALeft := FixRect.Right — FMsIndicators.Width — FrameOffs;
{$IFDEF RX_D4}
     if InBiDiMode then Inc(ALeft);
{$ENDIF}
     FMsIndicators.Draw(Self.Canvas, ALeft, (FixRect.Top +
       FixRect.Bottom — FMsIndicators.Height) shr 1, Indicator);
   end;
 end
 else if not (csLoading in ComponentState) and
   (FTitleButtons {$IFDEF RX_D4} or (FixedCols > 0) {$ENDIF}) and
   (gdFixed in AState) and (dgTitles in Options) and (ARow < TitleOffset) then
 begin
   SavePen := Canvas.Pen.Color;
   try
     Canvas.Pen.Color := clWindowFrame;
     if (dgIndicator in Options) then Dec(ACol, IndicatorOffset);
     AField := nil;
     SortMarker := smNone;
{$IFDEF WIN32}
     if (Datalink <> nil) and Datalink.Active and (ACol >= 0) and
       (ACol < Columns.Count) then
     begin
       DrawColumn := Columns[ACol];
       AField := DrawColumn.Field;
     end
     else DrawColumn := nil;
{$IFDEF RX_D4}
     if Assigned(DrawColumn) and not DrawColumn.Showing then Exit;
     TitleRect := CalcTitleRect(DrawColumn, ARow, MasterCol);
     if TitleRect.Right < ARect.Right then
       TitleRect.Right := ARect.Right;
     if MasterCol = nil then
       Exit
     else if MasterCol <> DrawColumn then
       AField := MasterCol.Field;
     DrawColumn := MasterCol;
     if ((dgColLines in Options) or FTitleButtons) and (ACol = FixedCols — 1) then
     begin
       if (ACol < Columns.Count — 1) and not (Columns[ACol + 1].Showing) then
       begin
         Canvas.MoveTo(TitleRect.Right, TitleRect.Top);
         Canvas.LineTo(TitleRect.Right, TitleRect.Bottom);
       end;
     end;
     if ((dgRowLines in Options) or FTitleButtons) and not MasterCol.Showing then
     begin
       Canvas.MoveTo(TitleRect.Left, TitleRect.Bottom);
       Canvas.LineTo(TitleRect.Right, TitleRect.Bottom);
     end;
{$ELSE}
     TitleRect := ARect;
{$ENDIF RX_D4}
     Down := FPressed and FTitleButtons and (FPressedCol = DrawColumn);
     if FTitleButtons or ([dgRowLines, dgColLines] * Options =
       [dgRowLines, dgColLines]) then
     begin
       DrawEdge(Canvas.Handle, TitleRect, EdgeFlag[Down], BF_BOTTOMRIGHT);
       DrawEdge(Canvas.Handle, TitleRect, EdgeFlag[Down], BF_TOPLEFT);
       InflateRect(TitleRect, -1, -1);
     end;
     Canvas.Font := TitleFont;
     Canvas.Brush.Color := FixedColor;
     if (DrawColumn <> nil) then begin
       Canvas.Font := DrawColumn.Title.Font;
       Canvas.Brush.Color := DrawColumn.Title.Color;
     end;
     if FTitleButtons and (AField <> nil) and Assigned(FOnGetBtnParams) then
     begin
       BackColor := Canvas.Brush.Color;
       FOnGetBtnParams(Self, AField, Canvas.Font, BackColor, SortMarker, Down);
       Canvas.Brush.Color := BackColor;
     end;
     if Down then begin
       Inc(TitleRect.Left); Inc(TitleRect.Top);
     end;
     ARect := TitleRect;
     if (DataLink = nil) or not DataLink.Active then
       Canvas.FillRect(TitleRect)
     else if (DrawColumn <> nil) then begin
       case SortMarker of
         smDown: Bmp := GetGridBitmap(gpMarkDown);
         smUp: Bmp := GetGridBitmap(gpMarkUp);
         else Bmp := nil;
       end;
       if Bmp <> nil then Indicator := Bmp.Width + 6
       else Indicator := 1;
       TextRect := TitleRect;
{$IFDEF RX_D4}
       if DrawColumn.Expandable then
         DrawExpandBtn(TitleRect, TextRect, InBiDiMode, DrawColumn.Expanded);
{$ENDIF}
       with DrawColumn.Title do
         DrawCellText(Self, ACol, ARow, MinimizeText(Caption, Canvas,
           WidthOf(TextRect) — Indicator), TextRect, Alignment, vaCenter
           {$IFDEF RX_D4}, IsRightToLeft {$ENDIF});
       if Bmp <> nil then begin
         ALeft := TitleRect.Right — Bmp.Width — 3;
         if Down then Inc(ALeft);
{$IFDEF RX_D4}
         if IsRightToLeft then ALeft := TitleRect.Left + 3;
{$ENDIF}
         if (ALeft > TitleRect.Left) and (ALeft + Bmp.Width < TitleRect.Right) then
           DrawBitmapTransparent(Canvas, ALeft, (TitleRect.Bottom +
             TitleRect.Top — Bmp.Height) div 2, Bmp, clFuchsia);
       end;
     end
{$ELSE WIN32}
     if not (dgColLines in Options) then begin
       Canvas.MoveTo(ARect.Right — 1, ARect.Top);
       Canvas.LineTo(ARect.Right — 1, ARect.Bottom);
       Dec(ARect.Right);
     end;
     if not (dgRowLines in Options) then begin
       Canvas.MoveTo(ARect.Left, ARect.Bottom — 1);
       Canvas.LineTo(ARect.Right, ARect.Bottom — 1);
       Dec(ARect.Bottom);
     end;
     Down := FPressed and FTitleButtons and (FPressedCol = ACol);
     if (Datalink <> nil) and Datalink.Active and (ACol >= 0) and
       (ACol < FieldCount) then
     begin
       AField := Fields[ACol];
     end;
     if Down then begin
       with ARect do begin
         Canvas.Pen.Color := clBtnShadow;
         Canvas.PolyLine([Point(Left, Bottom — 1), Point(Left, Top),
           Point(Right, Top)]);
         Inc(Left, 2); Inc(Top, 2);
       end;
     end
     else Frame3D(Canvas, ARect, clBtnHighlight, clBtnShadow, 1);
     Canvas.Font := TitleFont;
     Canvas.Brush.Color := TitleColor;
     if FTitleButtons and (AField <> nil) and Assigned(FOnGetBtnParams) then
     begin
       BackColor := Canvas.Brush.Color;
       FOnGetBtnParams(Self, AField, Canvas.Font, BackColor, SortMarker, Down);
       Canvas.Brush.Color := BackColor;
     end;
     if (DataLink = nil) or not DataLink.Active then
       Canvas.FillRect(ARect)
     else if (AField <> nil) then begin
       case SortMarker of
         smDown: Bmp := GetGridBitmap(gpMarkDown);
         smUp: Bmp := GetGridBitmap(gpMarkUp);
         else Bmp := nil;
       end;
       if Bmp <> nil then Indicator := Bmp.Width + 8
       else Indicator := 1;
       DrawCellText(Self, ACol, ARow, MinimizeText(AField.DisplayLabel,
         Canvas, WidthOf(ARect) — Indicator), ARect, taLeftJustify, vaCenter);
       if Bmp <> nil then begin
         ALeft := ARect.Right — Bmp.Width — 4;
         if Down then Inc(ALeft);
         DrawBitmapTransparent(Canvas, ALeft,
           (ARect.Bottom + ARect.Top — Bmp.Height) div 2, Bmp, clFuchsia);
       end;
     end
{$ENDIF WIN32}
     else DrawCellText(Self, ACol, ARow, '', ARect, taLeftJustify, vaCenter);
   finally
     Canvas.Pen.Color := SavePen;
   end;
 end
 else begin
{$IFDEF RX_D4}
   Canvas.Font := Self.Font;
   if (DataLink <> nil) and DataLink.Active and (ACol >= 0) and
     (ACol < Columns.Count) then
   begin
     DrawColumn := Columns[ACol];
     if DrawColumn <> nil then Canvas.Font := DrawColumn.Font;
   end;
{$ENDIF}
 end;

Не думаю, что без тела может что-то в гриде отображаться...
VovaN
Отправлено: 12.09.2005, 14:58


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Спасибо,Guest!
Я заменил пробел на этот исходник и наконец-то библиотека собралась!
Но тут-же появилась другая проблемма: я дописал свой кусок кода, он выполняется, но результат не отображается... Не подскажете, может быть есть какая-нибудь перерисовка после ДроСел?
gvg
Отправлено: 12.09.2005, 15:22


Машинист паровоза

Группа: Участник
Сообщений: 222



Ну... поскольку в Ваших исходниках чего-то не хватало, надо задуматься — а что это за исходники wink.gif Второе — что делает добавленный кусок? Чему равен DefaulDraw?
VovaN
Отправлено: 12.09.2005, 15:35


Дежурный стрелочник

Группа: Участник
Сообщений: 72



С исходником уже всё лады. А мой кусок — должен рисовать текущую строку грида определенным цветом. Мне Olegenty подсказал как это сделать, а вто теперь надо добавить это прямо в компонент.
2 gvg: а где вы видите DefaultDraw? в моем коде?
gvg
Отправлено: 12.09.2005, 15:51


Машинист паровоза

Группа: Участник
Сообщений: 222



Я rxlib не использую, так что конкретно сказать не могу... Там вроде DefaultDrawing, а у предка TrxDBGrig TDBGrid есть DefaulDraw. Они должны быть true, иначе DrawCell и вовсе не используется. Что-то так...
VovaN
Отправлено: 12.09.2005, 15:59


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Нет, DefaultDrawing в тру. (заход в метод осуществляется)

Вернуться в Вопросы программирования в C++Builder