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
|
Ну... поскольку в Ваших исходниках чего-то не хватало, надо задуматься — а что это за исходники Второе — что делает добавленный кусок? Чему равен 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 в тру. (заход в метод осуществляется) |
|
|