PDA

Ver la Versión Completa : Cell StringGrid Multilinea (Tiempo Ejecucion)


ramonibk
27-05-2012, 17:52:42
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:

StringGrid(celda, con varias líneas) (http://www.clubdelphi.com/foros/showthread.php?t=32906)
Grid con celdas de varias líneas (http://www.grupoalbor.com/ideas/3-delphi/1163.html)


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.

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

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.

...
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.