Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TMS TAdvStringGrid inplace edit autosizerow (https://www.delphipraxis.net/186007-tms-tadvstringgrid-inplace-edit-autosizerow.html)

hoika 27. Jul 2015 11:10

TMS TAdvStringGrid inplace edit autosizerow
 
Hallo,

wenn ich den internen Editor vom TAdvStringGrid benutze und mehr Text als in die Zeile passt,
wird ein Umbruch erzeugt. Leider wird aber die Zelle in der Höhe selbst nicht größer,
d.h. man sieht nur die ersten beiden, oder sogar nur die letzte Zeile.
Erst nach dem "Speichern" mache ich ein AutoSizeRow und es wird alles sichtbar.

Kennt jemand eine Lösung, ich könnte das Grid zur Not auch ableiten,
wenn etwas drumdrumprogrammiert werden müsste.


Danke


Heiko

hoika 28. Jul 2015 13:25

AW: TMS TAdvStringGrid inplace edit autosizerow
 
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.

Volker Z. 28. Jul 2015 14:11

AW: TMS TAdvStringGrid inplace edit autosizerow
 
Hallo,

Zitat:

[...] sondern um das fortwährende Tippen bis an den Rand, genau dann soll die Zellenhöhe vergrößert werden.
Du kennst die Eigenschaft
Delphi-Quellcode:
SizeWhileTyping
?

Gruß

hoika 28. Jul 2015 15:04

AW: TMS TAdvStringGrid inplace edit autosizerow
 
Hallo,

oh Mann !!
das war's ;)
Hier hatte ich schon mal rumprobiert.

http://www.delphipraxis.net/112566-t...-wordwrap.html

Und die ganze Zeit stochere ich in der TAdvInplaceEdit.KeyDown rum,
wo genau das benutzt wird !

Danke !

Ich hatte das in der Zwischenzeit so gelöst:

Delphi-Quellcode:
       
        iLines := SendMessage(SG.NormalEdit.Handle, EM_LINEFROMCHAR,
          Length(SG.NormalEdit.Text)-1, 0);
        iLines := iLines+1;

        { das +4 durch Ausprobieren ermittelt }
        iHeight := iLines*SG.Canvas.TextHeight('A')+4;
        if iHeight>SG.RowHeights[SG.Row] then
        begin
          SG.RowHeights[SGAkte.Row] := iHeight;
        end;
Ein einfaches Property zu setzen, geht natürlich auch ;)
Noch mal vielen Dank.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz