Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.013 c
3-22990
Stas
2003-04-17 15:48
2003.05.08
DBCHART


3-22927
Falendysh
2003-04-20 02:22
2003.05.08
Настройки ODBC драйвера и BDE для работы с MySQL


1-23100
LyzD
2003-04-26 18:10
2003.05.08
Изменение параметров потока...


6-23265
Andrew777
2003-03-13 15:52
2003.05.08
Socket & Delphi7


14-23394
td
2003-04-21 20:36
2003.05.08
про InstallShield Express