PDA

Ver la Versión Completa : Seleccionar y Copiar una fila de un StringGrid


CarlosAlberto
21-10-2011, 14:19:00
Estimados amigos del club: ¿cómo puedo hacer para seleccionar toda una columna de un StringGrid y copiar su contenido en otra columna del mismo?
Muchas gracias por su repuesta.
Saludos.
Carlos Alberto

Neftali [Germán.Estévez]
21-10-2011, 15:44:42
En esta entrada de mi blog (http://neftali.clubdelphi.com/?p=193), se habla de cómo tratar con el portapapeles en Windows. A parte de que te pueda interesar la lectura, el ejemplo que se adjunta es justo de cómo realizar Copy/Paste de filas de un StringGrid.
Revisa el código dele ejemplo, porque creo que es justo o que necesitas.

Caro
21-10-2011, 17:17:08
Hola CarlosAlberto, seleccionar directamente creo que no se puede, para seleccionar la columna y se note, lo que se me ocurre es que pintes dicha columna, haciendo click sobre el titulo de la columna, pero como el StringGrid no tiene un evento OnTitle, podriamos utilizar el evento OnMouseDown y el procedimiento MouseToCell:

Utilizamos la variable Global Columna, para guardar la columna cuando se ha hecho Click sobre el titulo y la que va a ser pintada


//Variables globales
Columna : Integer;
ColSelect, RowSelect : Integer;

//en el evento OnMouseDrawCell

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
texto:String;
begin
if (Columna>0) and (ACol=Columna) and (ARow>0) then
begin
With StringGrid1 do
begin
Canvas.Font.Color := clBlue;
Canvas.Brush.Color := clRed;
Canvas.FillRect(Rect);
Texto := Cells[ACol,ARow];
Canvas.TextRect( Rect, Rect.Left+2, Rect.Top+2, Texto);
end;
end;
end;

//En el evento OnMouseDown, detectamos si se ha hecho click sobre el titulo
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StringGrid1.MouseToCell(X,Y,ColSelect,RowSelect);
if RowSelect=0 then
begin
Columna := ColSelect;
StringGrid1.Refresh;
end;
end;

//y en el evento OnCreate de tu formulario inicializas tu variable global
Columna := 0;


Revisa la pagina que te ha indicado Neftali, hay muchas cosas que te pueden ayudar ;).

Saluditos

Caro
21-10-2011, 17:30:22
Ahora, para copiar una columna en otra, un ejemplo (seleccionamos la columna que queremos copiar, luego seleccionas la columna donde se va a copiar y presionas en el boton copiar), esta parte es depende de ti, como desees que se haga, solo es una idea.


//añadimos una variable global mas
ColSelectAnt : Integer;

//En el evento OnMouseDown
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ColSelectAnt := ColSelect; // guardamos la columna anterior
StringGrid1.MouseToCell(X,Y,ColSelect,RowSelect);
.......................................
.......................................
end;

//El codigo de tu boton que hace la copia sería:
begin
for i:=0 to StringGrid1.RowCount-1 do
StringGrid1.Cells[ColSelect,i] := StringGrid1.Cells[ColSelectAnt,i];
end;

//Inicializas en el OnCreate tu nueva variable
ColSelectAnt := -1;


Saluditos

monfa
23-01-2012, 18:29:30
como hacer que una celda sea soloamente editable y saber si esta llena o no

ecfisa
23-01-2012, 18:55:10
Hola monfa y bienvenido a los foros de Club Delphi :)

Te invito a que leas nuestra Guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php).

Por favor, crea un nuevo hilo con tu consulta, dale un título que se relacione con el contenido de ella y explíca detalladamente que es lo que estás buscando (Es decir, nombre del componente sobre el que tenés la duda, resultado que esperas, etc, etc... )


Un saludo y muchas gracias por tu colaboración.

CarlosAlberto
04-02-2012, 19:06:00
Estimada Caro: gracias por la respuesta sobre copiar una columna de un Stringgrid
Saludos.
Carlos Alberto