Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cell StringGrid Multilinea (Tiempo Ejecucion) (https://www.clubdelphi.com/foros/showthread.php?t=78936)

ramonibk 27-05-2012 17:52:42

Cell StringGrid Multilinea (Tiempo Ejecucion)
 
Hola de nuevo a todos.

Bueno como el titulo muy bien indica. lo que estoy intentando es que una celda de un StringGrid en la cual estoy escribiendo en tiempo de ejecución pueda tener multi-linea.
mas o menos como se comporta Excel cuando Pulsas Alt+Enter.

Gracias de antemano por vuestra colaboración.

ecfisa 27-05-2012 23:30:11

Hola ramonibk.

Aunque no sé si es exáctamente lo que andas buscando, pegale una leida a estos enlaces:
Saludos.

ramonibk 28-05-2012 15:14:16

Gracias Ecfisa. Estos link ya los visite previamente antes de poner mi consulta.
pero por lo que he visto y mi poco entendimiento, esto solo ocurres en la carga o creación del form.

lo que yo necesito es que durante la ejecución de mi aplicación cuando el usuario introduzca los datos pueda poner varias lineas.

ramonibk 28-05-2012 18:14:07

Bueno mas o menos ya esta.

la solucion ha sido utilizar un Memo que he insertado en la celda del TStringGrid y acto seguido usando el metodo que me a sugerido ecfisa de los metodos multi linea.

En el DrawCell.
Código Delphi [-]
var
  Grid     : TStringGrid;
  Texto  : String;
  R       : TRect;
begin
 Grid := TStringGrid(Sender);
 if (ARow < Grid.FixedRows) or (ACol < Grid.FixedCols)
  then
   Grid.Canvas.Brush.Color := clBtnFace
  else
   Grid.Canvas.Brush.Color := clWhite;
   Grid.Canvas.FillRect(Rect);
   Texto := Grid.Cells[ACol,ARow];
   DrawText( Grid.Canvas.Handle, PChar(Texto), StrLen(PChar(Texto)), Rect, DT_WORDBREAK);
 if (gdSelected in State)and(ACol=1) Then // Si estanos en la columna 1 insertamos el momo en la celda.
   with Memo1 do
    begin
     memo1.Visible := True;
     BringToFront;
     CopyRect(R, Rect);
     R.TopLeft :=     Form1.ScreenToClient(StringGrid1.ClientToScreen(R.TopLeft));
     R.BottomRight := Form1.ScreenToClient(StringGrid1.ClientToScreen(R.BottomRight));
     SetBounds(R.Left, R.Top, R.Right-R.Left, R.Bottom-R.Top);
     Memo1.SetFocus;
    end;
 if ACol <> 1 Then
  Begin
   Memo1.Lines.Text := '';
   Memo1.Visible := False;
  end;

y para terminar. en el evento OnChange del memo
Código Delphi [-]
 StringGrid1.Cells[Col, Row] :=  Memo1.Lines.Text;
 StringGrid1.Options:= StringGrid1.Options+[goRowSizing,goColSizing];

Bueno ya solo queda que si pulsamos Tab saltemos a la siguiente celda de TStringGrid y por supuesto cambiar a altura de la celda según el numero de lineas. y en cuanto lo tenga lo publico para vuestra información.

ecfisa 28-05-2012 20:14:53

Hola.

Bueno, más o menos le había buscado por el mismo lado :), te pongo la prueba que hice por si te ayuda en algo.
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure Memo1Exit(Sender: TObject);
  private
    procedure CMDialogKey(Var Msg: TWMKey);message CM_DIALOGKEY;
  public
  end;

var
  Form1: TForm1;

implementation 

var
  TabPressed: Boolean = False;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
end;

procedure TForm1.CMDialogKey(var Msg: TWMKey);
begin
  if(ActiveControl is TMemo)and(Msg.Charcode = VK_TAB) then
    with StringGrid1 do
    begin
      Cells[Col,Row]:=  Memo1.Lines.Text;
      Col:= Col + 1;
      TabPressed:= True;
    end;
  inherited;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Texto: string;
begin
  with TStringGrid(Sender) do
  begin
    Canvas.FillRect(Rect);
    Texto:= Cells[ACol,ARow];
    DrawText(Canvas.Handle, PChar(Texto), StrLen(PChar(Texto)),
    Rect, DT_WORDBREAK);
    if (gdSelected in State) and (ACol=1) then
    begin
      Memo1.Left := Rect.Left + Left + 2;
      Memo1.Top := Rect.Top + Top + 2;
      Memo1.Width := Rect.Right - Rect.Left;
      Memo1.Height := Rect.Bottom - Rect.Top;
      Memo1.Visible := True;
      Memo1.SetFocus;
    end
    else
      Memo1.Visible := False;
  end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  Memo1.Lines.Text:= StringGrid1.Cells[ACol,ARow];
end;

procedure TForm1.Memo1Exit(Sender: TObject);
begin
  if not TabPressed then
   StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:=  Memo1.Lines.Text;
  TabPressed:= False;
end;


end.

Saludos.

ramonibk 28-05-2012 22:48:49

Muchas Gracias ecfisa probare tu código y te comento.
gracias.


La franja horaria es GMT +2. Ahora son las 06:57:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi