Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];

Вниз

Как отловить горизонтальную прокрутку в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
1-23094
KA-87
2003-04-25 18:51
2003.05.08
Как из трея можно показывать советы? Как в ХР...


3-22995
OlkaGTS
2003-04-16 14:20
2003.05.08
DBExpress и MSSQL


14-23355
Andrey V.
2003-04-17 13:25
2003.05.08
Access violation


1-23064
Денис
2003-04-25 14:24
2003.05.08
Install COM+ objects


3-22915
ZooN
2003-04-18 17:28
2003.05.08
Работа с MySQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский