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.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.