AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TMS TAdvStringGrid inplace edit autosizerow

Ein Thema von hoika · begonnen am 27. Jul 2015 · letzter Beitrag vom 28. Jul 2015
Antwort Antwort
hoika

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

TMS TAdvStringGrid inplace edit autosizerow

  Alt 27. Jul 2015, 11:10
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
Heiko

Geändert von hoika (27. Jul 2015 um 11:52 Uhr)
  Mit Zitat antworten Zitat
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
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#3

AW: TMS TAdvStringGrid inplace edit autosizerow

  Alt 28. Jul 2015, 14:11
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 SizeWhileTyping ?

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
hoika

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

AW: TMS TAdvStringGrid inplace edit autosizerow

  Alt 28. Jul 2015, 15:04
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
Heiko

Geändert von hoika (28. Jul 2015 um 15:07 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:33 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