Einzelnen Beitrag anzeigen

hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TMS TAdvStringGrid inplace edit autosizerow

  Alt 28. Jul 2015, 13:25
Hallo,

keiner eine Idee ? ;(
Ich poste mal meine bisherigen Versuche.

Ach so: Es geht hier nicht um Ctrl+Enter und neue Zeile, dass hatte ich mühsam hinbekommen,
sondern um das fortwährende Tippen bis an den Rand, genau dann soll die Zellenhöhe vergrößert werden.

Heiko


Delphi-Quellcode:
unit Unit85;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Grids, BaseGrid, AdvGrid, ExtCtrls, frmctrllink;

type
  TForm85 = class(TForm)
    SG: TAdvStringGrid;
    Panel1: TPanel;
    Timer1: TTimer;
    Button1: TButton;
    RichEdit1: TRichEdit;
    FormControlEditLink1: TFormControlEditLink;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure SGKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure RichEdit1Change(Sender: TObject);
  private
    //SG: TAdvStringGrid;
    procedure HandleCanEditCell(Sender: TObject; ARow, ACol: Integer;
      var CanEdit: Boolean);
    procedure HandleGetEditorType(Sender: TObject; ACol, ARow: Integer;
      var AEditor: TEditorType);
    procedure HandleEditingDone(Sender: TObject);
    procedure HandleGetEditorProp(Sender: TObject; ACol, ARow: Integer;
      AEditLink: TEditLink);
  public
    { Public-Deklarationen }
  end;

var
  Form85: TForm85;

implementation

{$R *.dfm}

procedure TForm85.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := True;
end;

procedure TForm85.FormCreate(Sender: TObject);
begin
  //SG := TAdvStringGrid.Create(Self);
  SG.Parent := Self;
  SG.Align := alClient;
  SG.Navigation.AlwaysEdit := True;
  SG.OnCanEditCell := HandleCanEditCell;
  SG.OnGetEditorType := HandleGetEditorType;
  SG.OnEditingDone := HandleEditingDone;
  SG.OnGetEditorProp := HandleGetEditorProp;

  SG.ColCount := 4;
  SG.RowCount := 2;
  SG.FixedCols := 0;
  SG.FixedRows := 0;

  SG.Cells[0,0]:= 'Das ist ein langer Text in 0,0';
  SG.Cells[0,1]:= 'Das ist ein langer Text in 0,1';
  SG.Cells[1,0]:= 'Das ist ein langer Text in 1,0';
  SG.Cells[1,1]:= 'Das ist ein langer Text in 1,1';
  SG.Cells[2,0]:= 'Das ist ein langer Text in 2,0';
  SG.Cells[2,1]:= 'Das ist ein langer Text in 2,1';
  SG.Cells[3,0]:= 'Das ist ein langer Text in 3,0';
  SG.Cells[3,1]:= 'Das ist ein langer Text in 3,1'+#13#10+'1'+#13#10+'2';
  SG.AutoSizeCol(0);
  SG.AutoSizeCol(1);
  SG.AutoSizeCol(2);
  SG.AutoSizeCol(3);

  SG.AutoSizeRow(0);
  SG.AutoSizeRow(1);
end;

procedure TForm85.HandleCanEditCell(Sender: TObject; ARow, ACol: Integer;
  var CanEdit: Boolean);
begin
  CanEdit := True;
end;

procedure TForm85.HandleGetEditorType(Sender: TObject; ACol, ARow: Integer;
  var AEditor: TEditorType);
begin
  //AEditor := edNormal;
  //AEditor := edRichEdit;
  AEditor := edCustom;
  SG.EditLink := FormControlEditLink1;

  SG.EditLink.WantKeyReturn:= True;
end;

procedure TForm85.RichEdit1Change(Sender: TObject);
var
  SL: TStringList;
  RE: TRichEdit;
  iLines : Integer;
  iHeight : Integer;
  R: TRect;
begin
  RE:= TRichEdit(Sender);

  SL:= TStringList.Create;
  SL.Text := RE.Text;

    iLines := SL.Count;
    if iLines>0 then
    begin
      iHeight := iLines*SG.Canvas.TextHeight('A')+4;
      if iHeight>SG.RowHeights[SG.Row] then
      begin
        SG.RowHeights[SG.Row] := iHeight;

        R.Left := 0;
        R.Top := 0;
        R.Right:= SG.ColWidths[SG.Col];
        R.Bottom := SG.RowHeights[SG.Col];
        SG.EditLink.SetRect(R);
      end;
    end;

  SL.Free;
end;

procedure TForm85.SGKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key=VK_RETURN) and
     (ssCtrl in Shift) then
  begin
  
  end;
end;

procedure TForm85.Timer1Timer(Sender: TObject);
var
  SL: TStringList;
  iLines : Integer;
  iHeight : Integer;
begin
  //Timer1.Enabled := False;
  //SG.RowHeights[SG.Row]:=SG.RowHeights[SG.Row]+SG.Canvas.TextHeight('A');

  if SG.EditMode=False then
  begin
    Exit;
  end;

  SL := TStringList.Create;
  try
    SL.Text := SG.InplaceRichEdit.Text;

    iLines := SL.Count;
    if iLines>0 then
    begin
      iHeight := iLines*SG.Canvas.TextHeight('A')+4;
      if iHeight>SG.RowHeights[SG.Row] then
      begin
        SG.RowHeights[SG.Row] := iHeight;

      end;
    end;
  finally
    SL.Free;
  end;
end;

procedure TForm85.HandleGetEditorProp(Sender: TObject; ACol, ARow: Integer;
  AEditLink: TEditLink);
begin
  SG.InplaceRichEdit.PlainText := True;

end;

procedure TForm85.HandleEditingDone(Sender: TObject);
begin
  SG.AutoSizeRow(SG.Row);

end;

end.
Heiko

Geändert von hoika (28. Jul 2015 um 13:46 Uhr)
  Mit Zitat antworten Zitat