DT_CENTER orDT_WORDBREAK orDT_EXPANDTABS orDT_NOPREFIX );
var
B, R: TRect;
I, Left: Integer;
begin
withDrawBitmap, ARect do{ Use offscreen bitmap to eliminate flicker and }
begin{ brush origin tics in painting / scrolling. }
Width := Max(Width, Right - Left);
Height := Max(Height, Bottom - Top);
R := Rect(DX, DY, Right - Left - 1, Bottom - Top - 1);
B := Rect(0, 0, Right - Left, Bottom - Top);
end;
withDrawBitmap.Canvas do begin
DrawBitmap.Canvas.CopyRect(B, ACanvas, ARect);
Font := ACanvas.Font;
Font.Color := ACanvas.Font.Color;
Brush := ACanvas.Brush;
SetBkMode(Handle, TRANSPARENT);
DrawText(Handle, PChar(Text), Length(Text), R, AlignFlags[Alignment]);
end;
ACanvas.CopyRect(ARect, DrawBitmap.Canvas, B);
end;
constructorTBitDBGrid.Create(AOwner : TComponent);
begin
inheritedCreate(Aowner);
FRealTitleFont := TFont.Create;
FResizeFlag := false;
end;
destructorTBitDBGrid.Destroy;
begin
FRealTitleFont.Free;
inheritedDestroy;
end;
procedureTBitDBGrid.UpdateTitlesHeight;
var
Loop : integer;
MaxTextHeight : integer;
RRect : TRect;
begin
MaxTextHeight := 0;
forloop := 0 toColumns.Count - 1 do begin
RRect := CellRect(0, 0);
RRect.Right := Columns[Loop].Width;
RRect.Left := 0;
Canvas.Font := RealTitleFont;
MaxTextHeight := Max(MaxTextHeight, DrawText(Canvas.Handle, PChar(Columns[Loop].Title.Caption), Length(Columns[Loop].Title.Caption), RRect, DT_CALCRECT + DT_WORDBREAK));
end;
ifTitleFont.Height <> - MaxTextHeight thenTitleFont.Height := - MaxTextHeight;
end;
procedureTBitDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ifMouseCoord(X, Y).Y = 0 thenFResizeFlag := true;
inheritedMouseDown(Button, Shift, X, Y);
end;
procedureTBitDBGrid.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
inheritedMouseUp(Button, Shift, X, Y);
ifFResizeFlag then begin
FResizeFlag := false;
UpdateTitlesHeight;
end;
end;
procedureTBitDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
var
Indicator : TBitmap;
TitleText : string;
Al : TAlignment;
begin
if not((gdFixed inAState) and((ARow = 0) and(dgTitles inOptions) and(ACol <> 0))) then
inheritedDrawCell(ACol, ARow, ARect, AState)
else begin
ifDefaultDrawing then begin
DrawEdge(Canvas.Handle, ARect, BDR_RAISEDINNER, BF_BOTTOMLEFT);
DrawEdge(Canvas.Handle, ARect, BDR_RAISEDINNER, BF_TOPRIGHT);
InflateRect(ARect, -1, -1);
Canvas.Brush.Color := FixedColor;
Canvas.FillRect(ARect);
end;
TitleText := Columns[ACol - 1].Title.Caption;
ifAssigned(OnDrawTitle) thenOnDrawTitle(ACol, ARect, TitleText);
ifDefaultDrawing and(TitleText <> '') then begin
Canvas.Brush.Style := bsClear;
Canvas.Font := RealTitleFont;
ifACol > 0 thenAl := Columns[ACol - 1].Title.Alignment
elseAl := Columns[0].Title.DefaultAlignment;
WriteText(Canvas, ARect, 2, 2, TitleText, Al);
end;
end;
end;
procedureTBitDBGrid.SetRealTitleFont(Value : TFont);
begin
FRealTitleFont.Assign(Value);
Repaint;
end;
procedure Register;
begin
RegisterComponents('Andre VCL', [TBitDBGrid]);
end;
initialization
DrawBitmap := TBitmap.Create;
finalization
DrawBitmap.Free;
end.
Несколько таблиц в одном TDBGrid
Насколько я знаю, единственное легкое решение заключается в использовании вычисляемых полей.
Для того, чтобы поместить данные из нескольких таблиц в один DBGrid, нужно воспользоваться объектом TQuery. На заметку: используйте TQuery в режиме только для чтения, если вы не можете обеспечить гарантию выполнения некоторых из его руководящих принципов, один из которых – данные могут быть получены только от одной таблицы.
Как сделать так, чтобы в DBGrid напротив некоторых строк можно было бы галочку поставить?
Nomadicсоветует:
Ну примерно так (лишнее мало-мало порезал, больно много его, но идея видна :) на сервере — тaблицa Advertis.DB, первичный ключ ID — autoincrement. На локальном диске — тaблицa Founds.DB, с полем Advertis: integer, по которому есть индекс, и tblFounds.IndexFieldNames = 'Advertis'.
На гриде:
=== cut ===
procedureTMainForm.dbgWorkDblClick(Sender: TObject);
Читать дальше