Текущий архив: 2003.05.08;
Скачать: CL | DM;
ВнизКак отловить горизонтальную прокрутку в TDBGrid Найти похожие ветки
← →
stone (2003-04-18 10:38) [0]т.е. как при горизонтальной прокрутке TDBGrid вызвать событие DrawColumnCell
← →
Соловьев (2003-04-18 10:45) [1]
> TDBGrid вызвать событие DrawColumnCell
а оно бедное не вызывается? не верю...
← →
stone (2003-04-18 11:29) [2]В DrawColumnCell в заголовке столбца я рисую треугольничек, указывающий направление сортировки. Так вот, если прокрутить грид влево-вправо, тругольник не перерисовывается.
← →
Соловьев (2003-04-18 11:31) [3]
> В DrawColumnCell в заголовке столбца я рисую треугольничек,
> указывающий направление сортировки
код?
← →
stone (2003-04-18 11:35) [4]
Bitmap := TBitmap.Create;
try
with Bitmap do
begin
LoadFromResourceName(HInstance,"ASC");
Transparent := True;
TransParentColor := BitMap.Canvas.Pixels[50,50];
TDBGrid(Sender).Canvas.Draw(Rect.Right-10,2,BitMap);
TransparentMode := tmAuto;
end;
finally
Bitmap.Free;
end;
← →
Соловьев (2003-04-18 11:55) [5]может перед этим надо добавить
Application.ProcessMessages;
...
хотя не понятно почему этот вопрос здесь - по БД, это Общие вопросы.
← →
stone (2003-04-18 12:05) [6]
> может перед этим надо добавить
>
> Application.ProcessMessages;
результат тот же
Еще одна странная особенность, треугольник сохраняется если установлен на первом или последнем столбце.
> хотя не понятно почему этот вопрос здесь - по БД, это Общие
> вопросы.
Пути модератора неисповедимы :))
← →
Соловьев (2003-04-18 12:09) [7]полный код пожалуйста события.
← →
stone (2003-04-18 12:22) [8]
procedure Tfm_MainForm.dgr_MainVariantsDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
Bitmap: TBitmap;
Sort: WideString;
begin
Sort := TADODataSet(TDBGrid(Sender).DataSource.DataSet).Sort;
if Sort <> "" then
if Column.FieldName = copy(Sort, 1, length(Sort)-4) then
begin
Bitmap := TBitmap.Create;
try
with Bitmap do
begin
LoadFromResourceName(HInstance,"ASC");
Transparent := True;
TransParentColor := BitMap.Canvas.Pixels[50,50];
TDBGrid(Sender).Canvas.Draw(Rect.Right-10,2,BitMap);
TransparentMode := tmAuto;
end;
finally
Bitmap.Free;
end;
end;
end;
← →
Игорь Шевченко (2003-04-18 14:34) [9]
procedure TForm1.GridWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_HSCROLL:
begin
// сожалению, приходится мириться с необходимостью перерисовки всего
// DBGrid"а при горизонтальном скроллинге, иначе, все усилия по рисованию
// заголовков пропадают :-(
InvalidateRect(GridWnd, nil, true);
end;
end;
with Message do
Result := CallWindowProc(OldWndProc, GridWnd, Msg, wParam, lParam);
end;
Заменить оконную процедуру у Grid"а надо.
← →
Imshanya (2003-04-18 14:48) [10]Дядьки!
Я тут спрашивал недавно, как у DBGrida изменить высоту заголовка.
Кто-нибудь знает?
← →
stone (2003-04-18 15:03) [11]OldWndProc - это, я так понял, старая оконная процедура у Грида.
на что ее заменить?
← →
Игорь Шевченко (2003-04-18 15:18) [12]
type
TForm1 = class(TForm)
...
private
GridWnd : HWND; // handle окна DBGrid
OldWndProc : Pointer; // старая оконная процедура DBGrid"а
procedure GridWndProc (var Message : TMessage); // Новая оконная процедура
// для DBGrid"а
...
end;
procedure TForm1.FormShow(Sender: TObject);
begin
......
{ Для того, чтобы при изменении размеров DBGrid"а творчество с заголовками
не пропадало, надо обрабатывать момент, когда DBGrid будет перерисовываться}
GridWnd := DBGrid1.Handle;
OldWndProc := Pointer(GetWindowLong(GridWnd, GWL_WNDPROC));
SetWindowLong(GridWnd, GWL_WNDPROC, Integer(MakeObjectInstance(GridWndProc)));
end;
← →
sniknik (2003-04-18 15:44) [13]а почему не переопределить DrawCell у самого грида, и не мучится с отслеживанием прокрутки? все будет там рисоватся где нужно.
моя процедура (не все только перерисовка, и тут сортировка по нескольким полям, цвета главного и последующих треугольничков разные)
TMyDBGrid = class(TDBGrid)
procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;
Private
AcsDescImages: TImageList;
DrawBitmap: TBitmap;
procedure WriteText(ACanvas: TCanvas; ARect: TRect; DX, DY: Integer;
const Text: string; Alignment: TAlignment; ARightToLeft: Boolean);
procedure DisposeSort(var SortPoint: TSortPoint);
function SortString: string;
public
SortPoint: TSortPoint;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ClearOrder(ReSort: boolean);
procedure SetOrder(Field, Order: integer; Name: string);
procedure AddOrder(Field, Order: integer; Name: string);
end;
procedure TMyDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
var lRow, lCol : Integer;
DrawColumn: TColumn;
P: TSortPoint;
begin
if csLoading in ComponentState then begin
inherited DrawCell(ACol, ARow, ARect, AState);
Exit;
end;
lCol:= ACol;
lRow:= ARow;
if dgTitles in Options then dec(lRow);
if dgIndicator in Options then dec(lCol);
if not ((gdFixed in AState) or ((gdFocused in AState) and Focused)) then
if Assigned(DataLink) and DataLink.Active and (DataLink.ActiveRecord = lRow) then begin
Canvas.Brush.Color:= clInfoBk;
Canvas.Font.Assign(Font);
Canvas.Font.Color:= clBlack;
DrawColumn:= Columns[lCol];
WriteText(Canvas, ARect, 2, 2, DrawColumn.Field.DisplayText, DrawColumn.Alignment, UseRightToLeftAlignmentForField(DrawColumn.Field, DrawColumn.Alignment));
Exit;
end;
inherited DrawCell(ACol, ARow, ARect, AState); //вот после этого накладываем свои художества
if (gdFixed in AState) and (SortPoint <> nil) and (ARect.Left < ARect.Right-10) then begin
if SortPoint.Field = ACol then begin
if SortPoint.Order = 1 then AcsDescImages.Draw(Canvas, ARect.Right-10, ARect.Top+6, 0, True)
else AcsDescImages.Draw(Canvas, ARect.Right-10, ARect.Top+6, 1, True);
Exit;
end;
P:= SortPoint.Next;
While P <> nil do begin
if P.Field = ACol then begin
if P.Order = 1 then AcsDescImages.Draw(Canvas, ARect.Right-10, ARect.Top+6, 2, True)
else AcsDescImages.Draw(Canvas, ARect.Right-10, ARect.Top+6, 3, True);
Exit;
end;
P:= P.Next;
end;
end;
end;
← →
Игорь Шевченко (2003-04-18 15:53) [14]sniknik © (18.04.03 15:44)
Я делал специально, чтобы не порождать наследника от TDBGrid. А так, безусловно, способ с наследником более правильный.
← →
sniknik (2003-04-18 15:58) [15]ну вот я и смотрю, какие мучения люди терпят, лиш бы
DBGrid:= TMyDBGrid.Create(Self);
в програме не делать. :о)))
← →
stone (2003-04-21 09:23) [16]2 Игорь Шевченко © (18.04.03 15:18)
Большое спасибо.
> sniknik © (18.04.03 15:58)
> ну вот я и смотрю, какие мучения люди терпят, лиш бы
> DBGrid:= TMyDBGrid.Create(Self);
> в програме не делать. :о)))
Согласен, способ с наследником более правильный, т.к. можно добавить или переопределить другие методы, возможно в последствии им и придется воспользоваться.
Страницы: 1 вся ветка
Текущий архив: 2003.05.08;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.008 c