Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-10-2014
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
StringGrid problemas al seleccionar celdas

Hola después de mucho tiempo, estoy con un programita destinado a matar mi tiempo libre, pero me he quedado atascado... resulta que tengo un TStringGrid que forma una matriz de 10 × 12 y cuyas celdas tienen valores númericos y aleatorios que van del 1 al 999999.



En un momento dado, cuand pulso el botón, espero que se seleccionen tres valores distintos de entre toda las celdas y me los muestre en una etiqueta, edit, memo... ¿pero que ocurre? que devuelve un "blanco" o un valor nulo o vacío. Por ejemplo si le pido que meta uno de esos valores en una etiqueta tal que "label3", está pierde el caption y no muestra nada, de ahí que piense en un valor nulo, blanco etc.

El código este:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  label7.Caption:= IntToStr(1+random(120)); //El 1+random(120) es para evitar que tome 0 como un valor válido. Y 120 es por que es el numero de celdas de la matriz.
  label8.Caption:= IntToStr(1+random(120));

 ...

  label9.Caption:= strGrid.Cells[(StrToInt(label7.Caption)),
  (strToInt(label8.Caption))];

Supuestamente label9, debe contener las coordenadas dadas por label7 y label8 y devolver de este modo el valor X que esté en esa coordenada. Pero me devuelve un valor nulo.

¿Alguna idea?
Gracias y un saludo.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #2  
Antiguo 27-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
1.- Las filas y columnas empiezan por 0.
2.- Si te sales de rango devuelve 0

Si tu número de celdas es 120, está claro que estas fuera de rango, según tu código.

Saludos.
Responder Con Cita
  #3  
Antiguo 27-10-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola danielmj.

Según veo en tu imágen, el StringGrid está declarado de 10 columnas x 12 filas y usas la primer fila para los títulos de columna. Por lo que supongo que has declarado las propiedades FixedCols y FixedRows con los valores 0 y 1 respectivamente, vg.:
Código Delphi [-]
...
var
  c,f: Integer;
begin
  Randomize;
  with StringGrid1 do
  begin
    ColCount := 10;
    RowCount := 12;
    FixedCols:= 0;
    FixedRows:= 1;
    Rows[0].CommaText:= 'Número,Número,Número,Número,Número,' +
                        'Número,Número,Número,Número,Número';
    for f:= FixedRows to RowCount - 1 do
      for c:= FixedCols to ColCount - 1 do
        Cells[c,f]:= IntToStr(Random(999999) + 1);
  end;
end;
El máximo valor del índice de las columnas debería ser 9 y el de las filas 11. Sin embargo, el código de tu mensaje que asigna valores esos índices, puede en el peor caso alcanzar cifras mas de ¡ 10 veces superiores !

Entonces, si las columnas comienzan en cero y las filas en uno (la fila 0 es ocupada por los títulos), sería:
Código Delphi [-]
...
var
  c,f: Integer;
begin
  with StringGrid1 do
  begin
    c:= Random(ColCount) + FixedCols; // FixedCols = 0 (*)
    f:= Random(RowCount-2) + FixedRows; // FixedRows = 1 
    Label7.Caption:= IntToStr(c);
    Label8.Caption:= IntToStr(f);
    Label9.Caption:= Cells[c, f];
  end;
end;
Random([rango]) genera un número aleatorio x, tál que 0 <= x < rango. Es decir que Random(ColCount) + FixedCols (*), podrá alcanzar un valor mínimo de 0 y un máximo de 9, mientras que Random(RowCount-2) + FixedRows un mínimo de 1 y un máximo de 11.

(*) Obviamente se puede omitir el uso de FixedCols en este caso.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 29-10-2014
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
buenas, gracias a los dos, hice lo que comentabas ecfisa y al principio no entendía muy bien lo que comentabas pero bueno, creo que al final pillé la idea. A parte, yo buscaba un numero aleatorio del 0 al 120, tu solución es mas elegante.

Un saludo.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como seleccionar las celdas de un dbgrid con el mouse jjaen26 OOP 0 13-10-2011 17:48:45
Validar celdas de un stringgrid Elite237 OOP 25 29-10-2008 16:38:38
unir celdas en stringgrid voldemmor Varios 3 22-07-2008 21:07:55
Pintar celdas StringGrid cacu OOP 4 24-10-2007 17:22:21
StringGrid + celdas Makiley Varios 4 01-02-2006 13:01:15


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


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
Copyright 1996-2007 Club Delphi