Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
Delphi 10.1 Berlin Professional
|
Re: TStringGrid: über mehrere Zellen schreiben
15. Sep 2009, 10:36
dein code geht aber nicht richtig, wenn Du colsizing aktiv hast.
auf die Schnelle würde ich das ändern in:
- die verbundene Zelle im Grid selber werden leider erst immer beim 2. Klick richtig gezeichnet.
Delphi-Quellcode:
//Auslagern
function IsCellMerged(Point: TPoint; Rect: TRect): Boolean;
begin
Inc(Rect.Right);
Inc(Rect.Bottom);
Result := PtInRect(Rect, Point);
end;
procedure TForm3.Grid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
Index : Integer;
I : Integer;
LargeRect : TRect;
CellSpan : TRect;
Grid : TStringGrid;
begin
Grid:= Sender as TStringGrid;
// Grid.DefaultDrawing:= False; //im Formcreate
for I := 0 to Length(FMergedCells) - 1 do
begin
CellSpan := FMergedCells[I];
if IsCellMerged(Point(ACol, ARow), CellSpan) then
begin
// Calculate rect of whole merged cell
//--->> probelm ist hier, wenn Du scrollen mußt hast Du hier ein Problem
LargeRect := Classes.Rect(
Grid.CellRect(CellSpan.Left, CellSpan.Top).TopLeft,
Grid.CellRect(CellSpan.Right, CellSpan.Bottom).BottomRight);
Inc(Rect.Right, Grid.GridLineWidth);
Inc(Rect.Bottom, Grid.GridLineWidth);
Index := SaveDC(Grid.Canvas.Handle);
try
Grid.Canvas.Refresh;
IntersectClipRect(Grid.Canvas.Handle, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
// Draw the merged cell, but only the part that is supposed to be drawn
// by this particular event call.
if Arow<Grid.fixedrows then //nur für fixierte rows
begin
//uses extctrls, graphutil
Grid.Canvas.Font.color:=clWindowText;
Frame3D(Grid.Canvas,
LargeRect,
GetHighLightColor(Grid.FixedColor),
GetShadowColor(Grid.FixedColor),
1);
end
else
begin
// if ((IsCellMerged(Point(acol,arow),Cellspan)) and (IsCellMerged(Point(Grid.col,Grid.row),Cellspan))) or (gdSelected in State) then
//ist die aktuelle Zelle selektiert im Cellspan?
if (IsCellMerged(Point(Grid.col,Grid.row),Cellspan)) then
begin
Grid.canvas.Brush.color:=clHighlight;
Grid.canvas.Font.color :=clHighlightText;
end
else
begin
Grid.canvas.Brush.color:=Grid.color;
Grid.canvas.Font.color :=clWindowText;
end;
Grid.Canvas.FillRect(LargeRect);
end;
Grid.Canvas.TextRect(LargeRect, LargeRect.Left + 2, LargeRect.Top + 2,
Grid.Cells[FMergedCells[I].Left, FMergedCells[I].Top]);
if (IsCellMerged(Point(Grid.col,Grid.row),Cellspan)) then
Grid.canvas.DrawFocusRect(LargeRect);
finally
RestoreDC(Grid.Canvas.Handle, Index);
Grid.Canvas.Refresh;
end;
Exit;
end;
end;
//sonst Zellen normal zeichnen
if (acol<Grid.fixedcols) or (arow<Grid.fixedrows) then
begin
Grid.canvas.Brush.color:=grid.FixedColor;
Grid.Canvas.FillRect(Rect);
Frame3D(Grid.Canvas,
Rect,
GetHighLightColor(Grid.FixedColor),
GetShadowColor(Grid.FixedColor),
1);
Grid.Canvas.TextRect(Rect,rect.Left+2,rect.Top+2,Grid.Cells[acol,arow]);
end
else
begin
if gdSelected in State then
begin
Grid.canvas.Brush.color:=clHighlight;
Grid.canvas.Font.color :=clHighlightText;
end
else
begin
Grid.canvas.Brush.color:=grid.color;
Grid.canvas.Font.color :=clWindowText;
end;
Grid.Canvas.FillRect(Rect);
Grid.Canvas.TextRect(Rect,rect.Left+2,rect.Top+2,Grid.Cells[acol,arow]);
end;
end;
procedure TForm3.Grid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
Var CellSpan : TRect;
i:integer;
Grid:TStringGrid;
begin
Grid:= Sender as TStringGrid;
for I := 0 to Length(FMergedCells) - 1 do
begin
CellSpan := FMergedCells[I];
if IsCellMerged(point(Grid.col,Grid.row),CellSpan) or
IsCellMerged(point(acol,arow),CellSpan) then
begin
//besser wäre hier nicht das ganze Grid neuzuzeichnen, sondern nur die Cellspan
grid.Repaint;
exit;
end;
end;
end;
Probleme sind immer z.B.:
- wenn das Grid zu klein ist Scrollen
- Cursortasten, wenn die verbundenen Zellen keine fixierten sind
das Frame3d ist doch ganz einfach, mit gethighlight und getshadowcolor hast auch gleich die richtigen Farben, wenns mal nicht clbtnface die fixedcolor ist.
Gruß Frank
Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
|