Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Validar celdas de un stringgrid (https://www.clubdelphi.com/foros/showthread.php?t=61067)

Elite237 24-10-2008 00:04:23

Validar celdas de un stringgrid
 
Hola de nuevo, mi duda es la siguiente, como hacer que el usuario pueda escribir solo en una celda.Lo que quiero es validar la entrada del usuario, y que solo sean numeros, me imagino que debe ser en el evento OnKeyPress del StringGrid. Quiero validar en la columna 8(osea en la 7 ya que cuenta desde 0)que en las celdas de esa columna solo se pueda escribir, en las demas no.Gracias

Caro 24-10-2008 01:06:45

Hola Elite 237, tendrías que preguntar por la columna, validar y si es otra no dejar escribir.

Código Delphi [-]
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
 if StringGrid1.Col=7 then
  begin
   if not( key in ['0'..'9',#8]) then
     key := #0;
  end
 else
  key := #0;
end;

Saluditos

Elite237 24-10-2008 15:38:27

Gracias caro, quedo resuelto mi duda, muchas gracias por tu tiempo.Tenia rato que no contestabas algunas de mis dudas,ya te extrañaba:D

Caro 24-10-2008 15:53:04

Cita:

Empezado por Elite237 (Mensaje 322050)
Tenia rato que no contestabas algunas de mis dudas,ya te extrañaba.

Lo que pasa es que ultimamente no tengo mucho tiempo, por lo que, si la pregunta no me va ha tomar mucho tiempo contesto sino lo dejo pasar, por eso no pude revisar tu codigo que pusiste en otro hilo que no me acuerdo.

Saluditos

Elite237 25-10-2008 17:19:11

Actualizar y/o Eliminar Filas de un StringGrid
 
Hola de nuevo caro, una duda, ¿como puedo borrar y/o actulizar una fila completa de un stringgrid desde un boton que tengo en mi formulario?Espero haberme dado a entender.Saluditos

Delphius 25-10-2008 17:31:47

Hola Elite237,
Para borrar se puede emplar el método Clear ya sea de la propiedad Cols o Rows, según se necesite. Por ejemplo:

Código Delphi [-]
StringGrid1.Cols[1].Clear;

Borrará el contenido de la columna 1.

Y para actualizar, no queda otra que recorrer fila a fila, o columna a columna y sustituir el contenido. Por ejemplo algo como esto:

Código Delphi [-]
for i := 1 to stringgrid1.RowCount - 1 do
    StringGrid1.Cells[1,i] := IntToStr(i);

Recuerda que Cols y Rows no corresponden a la normal representación e idea de lo que se entiende por una tabla.
Lo que es Cols en StringGrid equivale a las filas, y a la inversa Rows a las columnas. La verdad es que no se porqué programaron de ese modo al TStringGrid.

Saludos,

Elite237 25-10-2008 17:51:31

Hola que tal Delphius, gracias por contestar, tengo una duda acerca del clear. Dices que seria SringGrid.clear....ok..ok, pero lo que quiero hacer es esto: de 4 columnas que tengo nombre, apellidos,direccion,telefono, lo que quiero es que en el propio stringgrid yo pueda modificar los datos de esa fila(ya coloque a true la opcion goEditing) y despues guardarlos en mi base de datos..en si quiero eliminar registros y actualizar registros(filas) del stringgrid. Ya tengo los botones eliminar y actualizar.

Fenareth 25-10-2008 18:07:19

Cita:

Empezado por Delphius (Mensaje 322297)
...
Recuerda que Cols y Rows no corresponden a la normal representación e idea de lo que se entiende por una tabla.
Lo que es Cols en StringGrid equivale a las filas, y a la inversa Rows a las columnas. La verdad es que no se porqué programaron de ese modo al TStringGrid.

Saludos,

Pero cabe aclarar que ésto es al momento de hacer referencia a una intersección en el StrinGrid... es decir StringGrid.Cells[columna,fila]...

En tiempo de diseño Col corresponde a las Columnas y Row a las Filas, así como en algunas otras propiedades que se manejan ya en el código...

Sólo aclarando :o :p ;) :)

Para poder insertar los registros mostrados en el StringGrid en la Tabla correspondiente tendrás que hacer un recorrido por las filas del mismo e ir transfiriendo el contenido de cada una de las celdas al campo correspondiente en la Tabla.

Delphius 25-10-2008 18:09:55

Cita:

Empezado por Elite237 (Mensaje 322298)
Hola que tal Delphius, gracias por contestar, tengo una duda acerca del clear. Dices que seria SringGrid.clear....ok..ok, pero lo que quiero hacer es esto: de 4 columnas que tengo nombre, apellidos,direccion,telefono, lo que quiero es que en el propio stringgrid yo pueda modificar los datos de esa fila(ya coloque a true la opcion goEditing) y despues guardarlos en mi base de datos..en si quiero eliminar registros y actualizar registros(filas) del stringgrid. Ya tengo los botones eliminar y actualizar.

Hola Elite237,
Dije que es:

StringGrid1.Cols[Numero].Clear;
// o bien...
StringGrid1.Rows[Numero].Clear;

Lo que hace el Clear es borrar TODA la fila o clumna, según sea el caso.

Por lo otro, no veo donde está el problema. Si tienes los datos, en el StringGrid y deseas volcarlos a un registro de una tabla, basta con "recorrer" la fila en cuestión columna a columna y componer la instrucción SQL.

Por ejemplo:

Código Delphi [-]
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('INSERT INTO tu_tabla (tus_campos)';
Query1.SQL.Add('VALUES (:parametro1, ..., :parametroN');

Query1.Parameters.ParamByName('parametro1').AsXxx := YyyToXxx(StringGrid1[COLUMNA,FILA]);
...
Query1.Parameters.ParamByName('parametroN').AsZzz := YyyToZzz(StringGrid1[COLUMNA + N,FILA]);

Query1.Execsql;

¿Esa es tu duda?:confused:

Saludos,

Elite237 25-10-2008 18:29:25

Ese codigo seria en el boton de actualizar me imagino..pero seria asi no?
Código Delphi [-]
Query1.SQL.Add('UPDATE INTO tu_tabla (tus_campos)';


una duda que significa YyyToxxx...te refieres a algo asi como StrToInt verdad

Código Delphi [-]
Query1.Parameters.ParamByName('parametroN').AsZzz := YyyToZzz(StringGrid1[COLUMNA + N,FILA]);

Delphius 25-10-2008 18:30:57

Cita:

Empezado por Fenareth (Mensaje 322299)
Pero cabe aclarar que ésto es al momento de hacer referencia a una intersección en el StrinGrid... es decir StringGrid.Cells[columna,fila]...

En tiempo de diseño Col corresponde a las Columnas y Row a las Filas, así como en algunas otras propiedades que se manejan ya en el código...

Sólo aclarando :o :p ;) :)

Para poder insertar los registros mostrados en el StringGrid en la Tabla correspondiente tendrás que hacer un recorrido por las filas del mismo e ir transfiriendo el contenido de cada una de las celdas al campo correspondiente en la Tabla.

Muchas gracias por la aclaración Fenareth,:)
No me había dado cuenta de que habías posteado. Disculpa.

Saludos,

Delphius 25-10-2008 18:43:01

Cita:

Empezado por Elite237 (Mensaje 322304)
Ese codigo seria en el boton de actualizar me imagino..pero seria asi no?
Código Delphi [-]Query1.SQL.Add('UPDATE INTO tu_tabla (tus_campos)';



una duda que significa YyyToxxx...te refieres a algo asi como StrToInt verdad

Código Delphi [-]Query1.Parameters.ParamByName('parametroN').AsZzz := YyyToZzz(StringGrid1[COLUMNA + N,FILA]);

Lo hice con INSERT a propósito, el fin es que tu lo analices y comprendras. Exacto, debería ser UDPATE; sólo recuerda que la instrucción UPDATE es como sigue:

Código SQL [-]
UPDATE tu_tabla SET(Campo1 = :parametro1, ..., CampoN = :parametroN) WHERE (tu_condicion/es)

¡Sin la condición actualizas todos los registros!

Efectivamente, cuando hablé sobre YyyToXxx, o YyyToZzz me refiero a que debes realizar la conversión en forma adecuada al tipo.

¡PERDON!
Cometí un error antes. Es:
Código Delphi [-]
Query1.Parameters.ParamByName('parametro').Value := ....
Query1.Parameters.ParamByName('parametro').DataType := ftXxx

Recuerda, mis ejemplos son empleando TADOQuery, si usas otros componentes Querys, Es posible que no sea Parameters, sino Params.ParamByName().AsXxxx y en este caso, no es necesario el DataType.

No te olvides indicar que componentes usas. Dependiendo de ello la sintaxis puede variar un poco.

Saludos,

Elite237 25-10-2008 18:59:41

Gracias de nuevo Delphius, este es el codigo que implemente, los componentes que uso son query y un database

Código Delphi [-]
procedure TForm1.BitBtnModificarClick(Sender: TObject);
var
i:integer;
begin
for i:=1 to sgEvaluacion.ColCount -1 do
  sgEvaluacion.cells[1,i]:=IntToStr(i);
   query1.close;
   query1.sql.clear;
   query1.sql.add('update set tevaluacion(eval_descripcion,eval_nivel,eval_ult_version,eval_ver_usada)');
   query1.sql.add('values(:eval_descripcion,:eval_nivel,:eval_ult_version,:eval_ver_usada)');
   query1.ParamByName('eval_descripcion').value:=(sgEvaluacion.Cells[1,i]);
   query1.ParamByName('eval_nivel').value:=(sgEvaluacion.Cells[2,i]);
   query1.ParamByName('eval_ult_version').value:=(sgEvaluacion.Cells[3,i]);
   query1.ParamByName('eval_ver_usada').value:=(sgEvaluacion.Cells[4,i]);
   try
    query1.execsql
   except
   end;
Application.MessageBox('Los datos se modificaron con éxito','Mensaje de confirmación',mb_OK);
end;

Pero me manda un error de sql..la verdad nose que error sera, se que es por que tengo mal mi sentencia, pero exactamente a que se refiere pues no.Ah..otra cosa, le quite lo de la conversiones puesto que me decia incompatibles string and integer.

Delphius 25-10-2008 19:07:35

Elite237, no te enojes pero cuando uno dice que le da error debe decir que error, y donde... ¡No soy adivino!

¿Leíste mi mensaje anterior? Leelo, tu consulta UPDATE está mal hecha.
Por otro lado, ¿que componentes estás empleando? ¿TADOQuery? ¿TQuery?

Si es TADOQuery el uso de parámetros es así:

Código Delphi [-]
ADOQuery1.Parameters.ParamByName().Value := ...
ADOQuery1.Parameters.ParamByName().DataType := ...

Si es un TQuery, u otro que emplee parametros de la clase TParams (la clase TADOQuery usa parametros de clase TParameters, de allí su diferencia), el uso es así:

Código Delphi [-]
TQuery1.Params.ParamByName().AsXXX := ...

¿Me explico?

Saludos,

Elite237 25-10-2008 19:27:12

Disculpame Delphius, estoy metiendo cosas donde no es..el componente que uso es TQuery. El error era por que escribi
Código Delphi [-]
update set evaluacion
y es update evaluacion set

Código SQL [-]
El error que me manda es SQL Error code =-104
token unknown - line,char 24 ('

asi deje mi codigo por ultimo
Código Delphi [-]
procedure TForm1.BitBtnModificarClick(Sender: TObject);
var
i:integer;
begin
for i:=1 to sgEvaluacion.ColCount -1 do
  sgEvaluacion.cells[1,i]:=IntToStr(i);
   query1.close;
   query1.sql.clear;
   query1.sql.add('update tevaluacion set (eval_descripcion,eval_nivel,eval_ult_version,eval_ver_usada)');
   query1.sql.add('values(:eval_descripcion,:eval_nivel,:eval_ult_version,:eval_ver_usada)');
   query1.Params.ParamByName('eval_descripcion').asstring:=(sgEvaluacion.Cells[1,i]);
   query1.Params.ParamByName('eval_nivel').asstring:=(sgEvaluacion.Cells[2,i]);
   query1.Params.ParamByName('eval_ult_version').asstring:=(sgEvaluacion.Cells[3,i]);
   query1.Params.ParamByName('eval_ver_usada').asstring:=(sgEvaluacion.Cells[4,i]);
   try
    query1.execsql
   except
   end;
Application.MessageBox('Los datos se modificaron con éxito','Mensaje de confirmación',mb_OK);
end;

espero np haber hecho otra cosa mal, no te quiero desesperar delphius.Saludos

Delphius 25-10-2008 19:39:30

Sigo viendo el mismo error en tu consulta Elite237.
Por otro lado, recién ahora me doy cuenta de que metí mal el dedo. Una consulta UPDATE se construye sin esos paréntesis:

Código SQL [-]
UPDATE tabla SET Campo1 = :Parametro1, ... , CampoN = :ParametroN WHERE (condicion/es)

Y noto en tu código que tienes un for y dentro de él supuestamente muchas sentencias. Si quieres que se ejecuten todas, debes poner un begin-end entre el for:

Código Delphi [-]
for i := xx to yyy do
  begin
   // tus sentencias...
  end;

Según como lo tienes el FOR lo único que hará es la primera línea. Fíjate bien.... Tomate el tiempo, no te apresures ni arrebates.

Como usas TQuery, imagino que empleas componentes DBE. En ese caso, el uso de parámetros es como he indicado antes:

Código Delphi [-]
Query1.Params.ParamByName().AsXXX = ....

Saludos,

Caro 27-10-2008 00:50:57

Holitas

Cita:

Empezado por Delphius (Mensaje 322300)
StringGrid1.Cols[Numero].Clear;
// o bien...
StringGrid1.Rows[Numero].Clear;

Lo que hace el Clear es borrar TODA la fila o clumna, según sea el caso.

Marcelo el Clear no borra una fila o columna, lo que hace es limpiar la columna o fila.

Para borrar una fila de un StringGrid debes utilizar el procedimiento DeleteRow donde le pasas como parametro la fila a eliminar, pero como es un metodo protegido, primero defines un nuevo tipo que herede de un TStringGrid.

Código Delphi [-]
type
  StringG = class (TStringGrid);

  .........................
  .........................
procedure TForm1.ButtonBorrarClick(Sender: TObject);
begin
  //En este caso te eliminara la fila actual del StringGrid
  StringG(StringGrid1).DeleteRow(StringGrid1.Row);
end;

Sobre actualizar, como te dice Marcelo, esta mal la sintaxis del update, supongo que quieres actualizar la fila actual, si es así no necesitas el ciclo.

Código Delphi [-]
procedure TForm1.BitBtnModificarClick(Sender: TObject);
var
i:integer;
begin
 
for i:=1 to sgEvaluacion.ColCount -1 do
  //que es lo que quieres hacer con esta linea ya que te va a cambiar
 //el valor de la columna 1 y fila i 
  sgEvaluacion.cells[1,i]:=IntToStr(i);

 
query1.close;
query1.sql.clear;
query1.sql.add('update tevaluacion set eval_descripcion=:eval_descripcion, eval_nivel=:eval_nivel, ');
query1.sql.add('eval_ult_version=:eval_ult_version, eval_ver_usada=:eval_ver_usada');

//Row es la fila actual
query1.ParamByName('eval_descripcion').asstring:=(sgEvaluacion.Cells[1,sgEvaluacion.Row]);
query1.ParamByName('eval_nivel').asstring:=(sgEvaluacion.Cells[2,sgEvaluacion.Row]);
query1.ParamByName('eval_ult_version').asstring:=(sgEvaluacion.Cells[3,sgEvaluacion.Row]);
query1.ParamByName('eval_ver_usada').asstring:=(sgEvaluacion.Cells[4,sgEvaluacion.Row]);

try
  query1.execsql
except
............

Ahora no se si tu quieres actualizar todas las filas de tu StringGrid, de la forma que esta tu ciclo, se va actualizar la cantidad que tienes en ColCount y la fila i.

No te olvides poner una condición a tu update, sino la actualización se hara para todos tus registros.

Saluditos

Delphius 27-10-2008 01:09:14

Cita:

Empezado por Caro (Mensaje 322502)
Holitas

Marcelo el Clear no borra una fila o columna, lo que hace es limpiar la columna o fila.

Para borrar una fila de un StringGrid debes utilizar el procedimiento DeleteRow donde le pasas como parametro la fila a eliminar, pero como es un metodo protegido, primero defines un nuevo tipo que herede de un TStringGrid.

Código Delphi [-]type StringG = class (TStringGrid); ......................... ......................... procedure TForm1.ButtonBorrarClick(Sender: TObject); begin //En este caso te eliminara la fila actual del StringGrid StringG(StringGrid1).DeleteRow(StringGrid1.Row); end;

Muy buena aclaración Caro:eek:,
Tienes razón, yo estaba entendiendo a que "Borrar" se refiere a limpiar el contenido de la fila o columna.:(

Sería oportuno que Elite237 nos haga saber si por borrar se refiere a eliminar, o por el contrario a limpiar el contenido. De ese modo sabré si lo estado aconsejando mal.

Saludos,

Elite237 27-10-2008 03:27:58

Hola delphius y caro...si, lo que quiero es borrar toda la fila. Delphius no es limpiar el contenido sino borrar toda la fila.Y el update lo quiero hacer para una sola fila, osea que el usuario edite en el stringgrid.Gracias por contestar.Saludos

Caro 27-10-2008 03:36:02

Cita:

Empezado por Elite237 (Mensaje 322523)
no es limpiar el contenido sino borrar toda la fila.Y el update lo quiero hacer para una sola fila,

Hola, con lo que he puesto arriba, ya tendrías ambas cosas, pero como te digo tienes que aumentar una condición a tu update, supongo que cada fila esta identificada por un codigo, entonces en el Where del Update pondrías la condición por ese codigo, para que no modifique todos los registros de tu tabla sino solo el registro que tenga ese codigo.

Saluditos


La franja horaria es GMT +2. Ahora son las 22:39:16.

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