-
Написал компонент (наследник от TCustomDBGrid) с многострочными заголовками. Все вроде бы устраивает, но когда в заголвке меняется количество строк "сетка" не пересчитывает видимую область (имхо). В результате есть кол-во строк заголовка увеличилось, то последнии записи ушли вниз и когда пробегаешь курсом, то в конце-концов он скрывается за границей "сетки".
+-------------------------+ - видимая область | Загаловок | +-------------------------+ | > 1 строка | | 2 строка | | 3 строка | | 4 строка | | 5 строка | | 6 строка | | 7 строка | +-------------------------+ - видимая область
кол-во срок загаловка увеличилось +-------------------------+ - видимая область | Много | | строчный | - скролируемая область | Загаловок | - курсор поднимается вверх, +-------------------------+ под заголовок и его не видно | 1 строка | | 2 строка | | 3 строка | | 4 строка | | 5 строка | - скролируемая область +-------------------------+ - видимая область | > 6 строка | - курсор спускается вниз и его не видно | 7 строка | +-------------------------+ - невидимая область
кол-во строк уменьшилось +-------------------------+ - видимая область | Загаловок | +-------------------------+ | > 1 строка | - сролируемая область | 2 строка | | 3 строка | | 4 строка | | 5 строка | - скролируемая область | | - остаются пустые строки | | +-------------------------+ - видимая область
Как поправить это?
-
Исходники компонента:
#ifndef NovexDBGridH
#define NovexDBGridH
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <DBGrids.hpp>
#include <Grids.hpp>
class PACKAGE TNovexDBGrid : public TCustomDBGrid
;
__property int Margin_Left = ;
__property int Margin_Right = ;
__property int Margin_Bottom = ;
__property Align = ;
__property Anchors = ;
__property BorderStyle = ;
__property Color = ;
__property Columns = ;
__property Constraints ;
__property DataSource ;
__property DefaultDrawing = ;
__property DragMode = ;
__property Enabled = ;
__property FixedColor = ;
__property Font ;
__property Options = ;
__property ParentColor = ;
__property ParentFont = ;
__property ParentShowHint = ;
__property PopupMenu ;
__property ReadOnly = ;
__property ShowHint ;
__property TabOrder = ;
__property TabStop = ;
__property TitleFont ;
__property Visible = ;
__property OnCellClick ;
__property OnColEnter ;
__property OnColExit ;
__property OnColumnMoved ;
__property OnDrawDataCell ;
__property OnDrawColumnCell ;
__property OnDblClick ;
__property OnDragDrop ;
__property OnDragOver ;
__property OnEditButtonClick ;
__property OnEndDrag ;
__property OnEnter ;
__property OnExit ;
__property OnKeyDown ;
__property OnKeyPress ;
__property OnKeyUp ;
__property OnMouseDown ;
__property OnMouseMove ;
__property OnMouseUp ;
__property OnStartDrag ;
__property OnTitleClick ;
private:
int m_nTitleHeight;
int m_nTitleRow;
int FMargin_Top;
int FMargin_Left;
int FMargin_Right;
int FMargin_Bottom;
protected:
void __fastcall CalcTitleCellHeight (int ACol, int ARow, const Types::TRect &ARect, Grids::TGridDrawState AState);
void __fastcall DrawTitleCell (int ACol, int ARow, const Types::TRect &ARect, Grids::TGridDrawState AState);
int __fastcall HeightTitleCell (int ACol, int ARow, const Types::TRect &ARect, Grids::TGridDrawState AState);
virtual void __fastcall DrawCell(int ACol, int ARow, const Types::TRect &ARect, Grids::TGridDrawState AState);
public:
__fastcall TNovexDBGrid(TComponent* Owner);
__published:
};
#endif
-
#include <vcl.h>
#pragma hdrstop
#include "NovexDBGrid.h"
#pragma package(smart_init)
static inline void ValidCtrCheck(TNovexDBGrid *)
__fastcall TNovexDBGrid::TNovexDBGrid(TComponent* Owner)
: TCustomDBGrid(Owner)
namespace Novexdbgrid
;
RegisterComponents("Novex", classes, 0);
}
}
int __fastcall TNovexDBGrid::HeightTitleCell (int ACol, int ARow, const Types::TRect &ARect, Grids::TGridDrawState AState)
sCurrText += sText[i];
nWidth = Canvas->TextWidth (sCurrText);
if (nWidth > nCellWidth)
else
}
nHeight++;
sCurrText = "";
}
i++;
}
if (sCurrText.IsEmpty() && nHeight > 1)
nHeight--;
return nHeight;
}
void __fastcall TNovexDBGrid::CalcTitleCellHeight (int ACol, int ARow, const Types::TRect &ARect, Grids::TGridDrawState AState)
Canvas->Font = TitleFont;
m_nTitleHeight = (Canvas->TextHeight("gW") + Margin_Top) * nMinHeight + Margin_Bottom;
RowHeights[0] = m_nTitleHeight;
m_nTitleRow = nMinHeight;
}
void __fastcall TNovexDBGrid::DrawTitleCell (int ACol, int ARow, const Types::TRect &ARect, Grids::TGridDrawState AState)
nWidth = Canvas->TextWidth (sCurrText);
if (nWidth > nCellWidth)
else
}
DrawText (Canvas->Handle, sCurrText.c_str(), sCurrText.Length(), &TextRect, DT_CENTER);
TextRect.top += (nCharHeight + Margin_Top);
nHeight++;
sCurrText = "";
}
i++;
}
if (!sCurrText.IsEmpty())
RECT EdgeRect;
EdgeRect.left = ARect.left;
EdgeRect.top = ARect.top;
EdgeRect.right = ARect.right;
EdgeRect.bottom = ARect.bottom;
DrawEdge (Canvas->Handle, &EdgeRect, BDR_RAISEDINNER, BF_BOTTOMRIGHT);
DrawEdge (Canvas->Handle, &EdgeRect, BDR_RAISEDINNER, BF_TOPLEFT);
}
void __fastcall TNovexDBGrid::DrawCell(int ACol, int ARow, const Types::TRect &ARect, Grids::TGridDrawState AState)
if (Options.Contains(dgIndicator) && ACol == 0)
if (Options.Contains (dgTitles) && ARow == 0)
TCustomDBGrid::DrawCell (ACol, ARow, ARect, AState);
}
|