PDA

Ver la Versión Completa : Bug de Embarcadero?


jhonalone
23-02-2016, 23:20:28
Hola a todos.

Lo que voy a deciros, no es desconocimiento mio. Creo.
Para quien no lo sepa, estoy intentando hacer un juego de sudoku para Android.

Utilizo un TStringGrid. Hasta Delphi7, que era la última versión de Delphi que usé, (Llevo años sin actualizarme, entre otras cosas porque no lo usaba, y también por los precios), un TStringGrid era muy fácil de utilizar, pues para conocer la celda en la que estabas, bastaba con usar las coordenadas lógicas de la rejilla, es decir: StringGrid1.Col y StringGrid1.Row. Y punto.

Ahora en DX (RadStudio 10) la cosa ha cambiado mucho (¡hasta los nombre de muchas variables! ¿...?). El número de filas las puedes definir con RowCount, pero yo (que no soy un lumbreras) no he conseguido encontrar cómo localizarlas, he intentado con StribgGrid1.Index, pero siempre me da CERO. Las columnas, hay que definirlas una a una y he conseguido localizarlas con StringGrid1.ColumnIndex. Lo han complicado un poco.

Para mí esto es un problema serio a la hora de trabajar con el TStringGrid. (NO SE REFERENCIAR LAS FILAS)

PERO ESTO NO ES LO PEOR. Cuando intento SELECCIONAR UNA CELDA en el dispositivo Android, ocurre algo curioso: si la última celda seleccionada no está en última fila de abajo (LA ULTIMA), si intento seleccionar una casilla de la última fila de abajo (LA ULTIMA), se selecciona la casilla correspondiente a la misma columna que deseo seleccionar pero la fila se queda la misma. Quizá con un ejemplo se entienda mejor:

Pongamos que tenemos una rejilla de 9 filas por 9 columnas (es mi caso).
La última celda seleccionada es la fila 7 columna 7.
Si pulso para seleccionar la celda correspondiente a la fila 9 (es la última) y la columna 0.
Me encuentro con que queda seleccionada la celda correspondiente a la fila 7 (no cambia) y la columna 0 (si cambia).

Pero HAY MAS.

Como tengo puesto un identificador de la columna (de la fila todavía NO SE CUAL ES) con StringGrid.ColumnIndex en una TLabel puedo observar que, SI SELECCIONO otra columna de la última fila, no ha cambiado el INDICE DE LA COLUMNA.

Si selecciono cualquier otra celda que no esté en la ÚLTIMA fila de abajo, el índice de la columna, se actualiza correctamente.


procedure TPrinci.grdTableroSelChanged(Sender: TObject);
begin
Label4.Text := 'Columna = '+ grdTablero.ColumnIndex.ToString() + ' / '+
'Fila = '+ grdTablero.Index.ToString();
end;


Perdón por el rollazo, pero no sé explicarlo mejor.

Si alguien puede arrojar algo de luz sobre el asunto, se lo agradezco sinceramente.

Saludos a todos.

AgustinOrtu
23-02-2016, 23:29:40
Estas usando firemonkey, que es el framework nuevo diseñado para soportar varias plataformas (win, mac, ios y android)

Es lógico que haya diferencias, y no que todos los componentes sean idénticos

Si querés usar algo "similar a Delphi 7", te toca crear una aplicación VCL, que es el framework de toda la vida

jhonalone
23-02-2016, 23:30:21
Perdonad. Se me olvidaba.
Si seleccionas otra columna de la misma fila, (SEA LA FILA QUE SEA), TAMPOCO CAMBIA LA COLUMNA.
Saludos.

jhonalone
23-02-2016, 23:33:29
Perdona, Agustín.
Pero los nombres de las propiedades, creo que no cambian para cada plataforma. Sea la que sea.
Un saludo.

AgustinOrtu
23-02-2016, 23:38:59
Son componentes distintos

El error fue ponerle el mismo nombre

Es imposible diseñar algo idéntico a la VCL, que delega su funcionalidad a una API específica

Estamos hablando no sólo de distintos sistemas operativos, sino de dispositivos distintos que funcionan distinto desde el vamos

jhonalone
23-02-2016, 23:49:04
Vale, Agustín.
Tienes razón. Si quieres hacer una aplicación VCL clásica, tienes los mismos nombres y propiedades que te comentaba. Lo que no entiendo, es por qué lo han complicado tanto. Aunque el Framework sea distinto, se supone que el trabajo de adaptarlo a las distintas plataformas corresponde a Embarcadero. Ya he observado, que algunos componentes, no están disponibles para Android, como por ejemplo los menús. Están inhabilitados para la plataforma Android.
Un saludo.

jhonalone
23-02-2016, 23:54:30
Ahora, aún con las limitaciones de las distintas plataformas, EL PROBLEMA que comentado en el origen del post, existe en la plataforma Android (al menos).
Mañana seguimos comentando. Es muy tarde para mí.
Un Saludo.

AgustinOrtu
23-02-2016, 23:54:59
Si, y tampoco tenés ventanas modales en android

A mi me parece que fmx esta, en nivel arquitectura, años por delante de VCL

En fmx los controles están creados mediante composición. Hace unos días discutimos las ventajas en un hilo en el subforo POO (mamcx lo explica estupendamente)

No hay menús en android. Que aplicación android utiliza algo similar al TMainMenu? Que aplicación usa el TTrayIcon?

A fmx lo único que le falta es madurar

AgustinOrtu
24-02-2016, 00:03:15
Otro gran error es usar los controles tanto para mostrar la info, y como "estructura", es decir, donde están realmente los datos

Busca tutoriales en youtube sobre Live Bindings; verás como podes crear un objeto con el cual mantener tus estructuras de datos, en el harás las operaciones lógicas: modificar estado, buscar, filtrar, acceder al actual, agregar, etc. Es un objeto muy similar al dataset,o podes usar el tuyo propio.

Luego conectas este objeto con cualquier control; un ListView, Grid, ListBox, etc

No te sorprenderá ver que en fmx no hay controles data aware, ya que todo se conecta de esta forma (o a mano, escribiendo tu mismo el código)

Casimiro Notevi
24-02-2016, 01:09:31
El problema básico es que android no tiene nada que ver con windows, y embarcadero ha intentado hacer un "delphi para android", y la gente al verlo piensa que es igual y al final descubre muchos problemas, que no son problemas sino el intento de encajar mundos distintos vistos de la óptica "de toda la vida". Con el tiempo quizás lo consigan, casi seguro, pero es muy complicado realmente adaptarlo para que funcione igual en ambos sistemas. Y si incluimos a iOS, entonces ya puedes imaginar la complicación tan enorme.

jhonalone
24-02-2016, 17:56:17
Hola a todos.

Entiendo que sea difícil la adaptación de los distintos sistemas operativos. Pero cuando Embarcadero te vende, (¡y a qué precios!), un producto que promete esta adaptación, lo menos que puede hacer es que la adaptación sea real. Que te ofrezca un TStringGrid (vamos una rejilla de toda la vida) y luego no te de las armas para poder actuar sobre las distintas celdas... Si la rejilla es para presentar una cosa estática, quizá sea mejor presentar una foto.

Si existen programas que migran el código Delphi a Java, (que es el lenguaje en el que está basado Android esencialmente), con un poquito de esfuerzo por parte de Embarcadero lo podría conseguir. Máxime teniendo en cuenta lo pesadas, (gran cantidad de código), que son sus herramientas. Sinceramente creo que podían habérselo currado un poquito más.

Bueno, dejemos de lamentarnos... Lo que hay es lo que hay. Para el problema que nos ocupa, si no hay otra solución y no puedo usar una rejilla como base de mi proyecto de sudoku, tendré que plantear el asunto desde otra perspectiva, con una tabla... con un puñado de etiquetas... o no sé con qué... Se admiten sugerencias. En cualquier caso, una rejilla en la que, repito, no se puede acceder y modificar los colores y los valores de las celdas, de poco sirve.

Os invito a probar lo que comentaba en el origen de este hilo, para confirmar lo que yo he observado.

Espero vuestras noticias. Sigo trabajando en buscar una solución...

Saludos a todos.

AgustinOrtu
24-02-2016, 18:32:08
Es que no deberias empezar por la rejilla, eso es lo ultimo que tenes que hacer

Mete todo en una matriz, el juego opera sobre la matriz; luego lo conectas con: Un TGrid, o un TStringGrid, o un componente de terceros o lo sacas por consola

egostar
24-02-2016, 19:21:55
Bug de Embarcadero?......

.......Os invito a probar lo que comentaba en el origen de este hilo, para confirmar lo que yo he observado.


Cuando no se leé lo que hacen los eventos es fácil indicar que es un fallo, pero si te tomaras un poco de tiempo en leer la ayuda de Delphi verías que el evento OnSelChanged del componente TGrid dice lo siguiente:


Description

Occurs when the selected row in the grid changes.


Me he tomado el tiempo para hacer una pequeña prueba de esto usando dos eventos, el que tu utilizas OnSelChanged y el evento OnSelectCell() y veo las diferencias de resultado que están de acuerdo a la ayuda de Delphi.

El código que usé es el siguiente:


procedure TForm1.StringGrid1SelChanged(Sender: TObject);
begin
Label1.Text := format('Renglón seleccionado: %d', [StringGrid1.Selected + 1]);
Label2.Text := format('Columna seleccionada: %d', [StringGrid1.ColumnIndex + 1]);
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; const ACol,
ARow: Integer; var CanSelect: Boolean);
begin
Label3.Text := format('Renglón seleccionado: %d', [ARow + 1]);
Label4.Text := format('Columna seleccionada: %d', [ACol + 1]);
end;


Además te muestro como funciona en Android, saquen sus conclusiones.

¿es un bug o no?

Edito: Perdón, me faltó una imagen que es la de la selección de la celda (9,1) que estaría después de la imagen (7,7), pero pueden verla en el siguiente enlace

https://plus.google.com/u/0/photos/104606759365021622579/album/6254920237104409137/6254920230612258674?authkey=CM_x8JjGlvOSmQE



Saludos

Casimiro Notevi
24-02-2016, 20:53:54
Estaba claro que delphi no iba a fallar en algo tan básico.
Todos imaginábamos que el problema es el código de jhonalone, que es novato en el tema y es normal que vea "bugs raros", como ha pasado toda la vida con los novatos, yo el primero :)

jhonalone
24-02-2016, 20:57:30
Hola, Egostar.

Primero, gracias por tu colaboración y por tu aporte.
Te conozco desde hace años y debes saber que eres un miembro admirado por mí por tus muchos y valorados aportes.

Pero en esta ocasión tengo dos cosas que decirte. Una buena y otra mala.
Empecemos por la buena: Tienes razón. Yo había probado también TForm1.StringGrid1SelectCell, pero no se me ocurrió evaluar ACol y ARow, de sus parámetros, utilicé la misma estructura que tenía en TForm1.StringGrid1SelChanged, o sea la siguiente:


procedure TPrinci.grdTableroSelectCell(Sender: TObject; const ACol,
ARow: Integer; var CanSelect: Boolean);
begin
Label4.Text := 'Columna = '+ ColumnIndex.ToString + ' / '+
'Fila = '+ IntTostr(grdTablero.Index);
end;


Con lo cual, el resultado de la columna era correcto pero no el de la fila. Era cero, como ya comenté.
He seguido tu consejo y he cambiado el cuerpo del evento a lo siguiente:

procedure TPrinci.grdTableroSelectCell(Sender: TObject; const ACol,
ARow: Integer; var CanSelect: Boolean);
begin
Label4.Text := 'Columna = '+ ACol.ToString + ' / '+
'Fila = '+ ARow.ToString;
end;


Con esto he conseguido identificar la fila correctamente, ya no sale cero como antes.

Ahora VIENE la segunda parte, la negativa.
En cualquier celda de la rejilla que selecciones, siempre que no sea la última de abajo, los valores de la fila y la columna, son correctos.

Pero vuelvo a repetir:
Si la celda seleccionada está en cualquier parte de la rejilla, QUE NO SEA LA ÚLTIMA FILA DE ABAJO, y seleccionas una de las casillas de la última fila ( la de abajo ), ocurre lo siguiente:

(Estamos hablando de la expresión en un dispositivo Android). La columna que informa ACol es correcta y la fila que informa ARow también es correcta, pero la celda que "aparentemente" está seleccionada, (cambia el color), NO ES CORRECTA, corresponde a la MISMA FILA que estaba seleccionada antes de pulsar en la última fila, y la columna correspondiente a la celda ES LA CORRECTA, (en la celda que cambia de color como seleccionada).

Cuando lo pruebes me respondes. Si no me he explicado, me lo dices.

Un Saludo, Egostar.

jhonalone
24-02-2016, 21:00:24
Egostar.

Ahora me dices si ese comportamiento, no es un Bug de Enbarcadero.

Saludos.

egostar
24-02-2016, 21:17:17
Egostar.

Ahora me dices si ese comportamiento, no es un Bug de Enbarcadero.

Saludos.

Perdón, no entiendo el punto, es que "yo soy visual", si me muestras una imagen de lo que estás explicando, es decir, toma una captura de pantalla de tu celular y la adjuntas, me sería más fácil entender lo que sucede.

Saludos

jhonalone
24-02-2016, 21:37:09
Egostar.
Creo que me he explicado muy claro.
Pasa el ejemplo que me has mostrado a tu teléfono móvil y lee detenidamente mi último mensaje.
Después me cuentas.
Si quieres te genero un ejemplo en .zip y lo subo en un enlace, pero si tienes el proyecto de prueba que has generado antes, creo que puedes usarlo para probar lo que acabo de escribir.
De nada sirve que te mande las fotos, si no sabes lo que he tecleado o (en el caso de Android) lo que he pulsado antes. Quizá para verlo como yo lo veo, tendría que mandarte un video. So no lo puedes comprobar, me lo dices e intento hacer el video.
Saludos

jhonalone
24-02-2016, 21:41:18
Casimiro.

No te contesto. Te invito a que hagas la prueba en un teléfono, siguiendo las indicaciones que os he dado.

Saludos.

egostar
24-02-2016, 21:50:14
Creo que me he explicado muy claro.


Insisto, no te entendí y lo de visual es cierto, es mas fácil (para mi) ver imágenes para poder entender lo que está escrito.


Pasa el ejemplo que me has mostrado a tu teléfono móvil y lee detenidamente mi último mensaje.
Después me cuentas.


O sea, las imágenes que he adjuntado son de mi celular, en tiempo real, no las imagine, ni las dibujé, ni las inventé.


Si quieres te genero un ejemplo en .zip y lo subo en un enlace, pero si tienes el proyecto de prueba que has generado antes, creo que puedes usarlo para probar lo que acabo de escribir.
De nada sirve que te mande las fotos, si no sabes lo que he tecleado o (en el caso de Android) lo que he pulsado antes. Quizá para verlo como yo lo veo, tendría que mandarte un video. So no lo puedes comprobar, me lo dices e intento hacer el video.
Saludos

No es necesario, te muestro ahora mismo con un ejemplo gráfico de lo que yo estoy haciendo, aclaro que es mi celular, en tiempo real, ejecutando el código que mostré, he colocado los indices en base cero para que sea exacto y agregué una línea para que quede evidencia de todas las casillas que se han presionado, sigue el enlace y me dices que es lo que te parece es un Bug de Embarcadero.

https://plus.google.com/u/0/photos/photo/104606759365021622579/6254959676681486274


procedure TForm1.StringGrid1SelectCell(Sender: TObject; const ACol,
ARow: Integer; var CanSelect: Boolean);
begin
Label3.Text := format('Renglón seleccionado: %d', [ARow]);
Label4.Text := format('Columna seleccionada: %d', [ACol]);
(Sender as TStringGrid).Cells[ACol,ARow] := ARow.ToString + ',' + ACol.ToString;
end;


Saludos

mamcx
24-02-2016, 23:55:11
Cuando lo pruebes me respondes. Si no me he explicado, me lo dices.


Para casos como estos, es mucho mas facil si haces un gif animado y lo muestras. Me ha pasado casos similares a estos (con usuarios) y hasta que no vi la pantalla en vivo no me di cuenta que si habia un problema (en un caso por ejemplo, era toda la secuencia entre teclado, mouse y demas, que yo nunca hacia pero el usuario si)

jhonalone
25-02-2016, 02:55:40
Bueno.

Ya he conseguido encontrar las circunstancias en las que surge el problema. Pero os voy a dejar con la intriga hasta mañana que haga un vídeo y lo suba (si es que lo consigo, pues no lo he hecho nunca).
En vista de que no entendéis mis explicaciones verbales, os lo explicaré en un vídeo.

Os voy a dejar con la intriga hasta mañana, que pueda hacer el vídeo y subirlo. Hoy ya es muy tarde. Son casi las tres de la mañana en Madrid.

A propósito, Casimiro, me gustaría que me indicaras cómo lo hago para subir un enlace a un vídeo en un post, pues no lo he hecho nunca.

Saludos.

Casimiro Notevi
25-02-2016, 10:54:24
A propósito, Casimiro, me gustaría que me indicaras cómo lo hago para subir un enlace a un vídeo en un post, pues no lo he hecho nunca.
Solo es necesario que pongas el enlace al mismo. Aunque si lo subes a youtube puedes enlazarlo directamente, ejemplo: Tienes el video:
https://www.youtube.com/watch?v=ccJytu5JDEk
Debes poner entre las etiquetas lo que hay detrás del =
O sea, quedaría así:
ccJytu5JDEk

jhonalone
25-02-2016, 15:00:57
Bueno, amigos, aquí estoy.
A ver cómo me sale. Los vídeos, uno con el problema y otro con el problema resuelto, yo no los he subido nunca a Youtube, asi que veamos si consigo ponerlos aquí con un enlace, como me ha dicho Casi.
El vídeo con el problema del que venimos hablando aquí.

Lo siento. Necesito ayuda. No sé subir el vídeo.

He intentado subirlo a mis archivos adjuntos y después de esperar un rato me da un mensaje que no entiendo "El Mensaje especificado es inválido. Si has seguido un enlace válido, por favor notifica al administrador"

Espero ayuda.
Saludos.

jhonalone
25-02-2016, 15:06:32
Bueno, se me olvidaba decir que los vídeos son 2 uno mostrando el problema y otro con el problema resuelto. Son muy cortitos 88MB y 107MB.
Quizá lo que a mi me parece corto es demasiado.
Saludos.

ecfisa
25-02-2016, 15:21:23
Hola jhonalone.

Revisa estos enlaces:

Subir videos (https://support.google.com/youtube/answer/57407?hl=es-419)
etiquetas vB (http://www.clubdelphi.com/foros/misc.php?do=bbcode) (final de página)


Si son imágenes .GIF, podes guardarlas como cualquier imágen en alguna de las muchas páginas que hay al efecto, una de ellas es esta (http://www.subirimagenes.com/).

Saludos :)

jhonalone
25-02-2016, 16:26:21
Por favor, borrarme el Post de Probando. No sabía si funcionaría.
Gracias.
Este mensaje también deseo borrarle.
Gracias, Ecfisa. Siempre tan atento y tan GRANDE. (No es la primera vez que te lo digo)

jhonalone
25-02-2016, 17:31:42
Bueno, el mensaje anterior no sirve de nada. Estaba editando... y se me pasó el tiempo de 30 m.
Es una faena, porque lo tenía casi terminado y ahora tengo que empezar de nuevo.

POR SI LE INTERESA A ALGUIEN.

Vídeo del problema, (Que parece que me explico mal).
="https://www.youtube.com/watch?v=-711A257_0g"https://www.youtube.com/watch?v=-711A257_0g


wLpycxovW7c&feature


Vídeo del problema resuelto.


-711A257_0g


Código que funciona mal

procedure TForm1.FormCreate(Sender: TObject);
begin
Col9.Width := grdTablero.Width / 9;
Col1.Width := grdTablero.Width / 9;
Col2.Width := grdTablero.Width / 9;
Col3.Width := grdTablero.Width / 9;
Col4.Width := grdTablero.Width / 9;
Col5.Width := grdTablero.Width / 9;
Col6.Width := grdTablero.Width / 9;
Col7.Width := grdTablero.Width / 9;
Col8.Width := grdTablero.Width / 9;
grdTablero.RowHeight:= grdTablero.Height / 9;
end;


Código que funciona bien

procedure TForm1.FormCreate(Sender: TObject);
begin
Col9.Width := grdTablero.Width / 9;
Col1.Width := grdTablero.Width / 9;
Col2.Width := grdTablero.Width / 9;
Col3.Width := grdTablero.Width / 9;
Col4.Width := grdTablero.Width / 9;
Col5.Width := grdTablero.Width / 9;
Col6.Width := grdTablero.Width / 9;
Col7.Width := grdTablero.Width / 9;
Col8.Width := grdTablero.Width / 9;
grdTablero.RowHeight:= (grdTablero.Height - 2) / 9;
{ A grdTablero.Height hay que RESTARLE algún punto, si no la última fila
de abajo no queda seleccionada cuando se pulsa en ella siook la celda que
estaba seleccionada antes no ccrrespondía a la última fila }
end;


La causa del problema. (Espero que se me entienda en castellano)

Dado que la rejilla (TStringGrid) llamada "grdTablero" ocupa todo el espacio de su propiedad grdTablero.RowHeight con sus 9 filas, parece que la última fila no se activa correctamente y causa el error.



La SOLUCIÓN DEL PROBLEMA.

Cuando dejamos un espacio después de la última fila, (aunque sea sólo de 2 píxeles), la última fila queda activada para recibir el foco cuando es seleccionada.

Saludos a todos.

jhonalone
25-02-2016, 18:12:09
ME VOLVIO A PASAR EL TIEMPO DE 25 MINUTOS PARA CAMBIAR EL POST.

Después de tenerlo completo. Al probar los vídeos (con la misma estructura que el que hice de prueba y los mismos textos copiados) no funcionan. ¿Qué hago mal?

He intentado copiar las URL completas, pero al modificar el post ya no está esta opción disponible.

Mientras que las vuelvo a poner, se me pasan los 25 minutos.

Repito todo.

Bueno, el mensaje anterior no sirve de nada. Estaba editando... y se me pasó el tiempo de 30 m.
Es una faena, porque lo tenía casi terminado y ahora tengo que empezar de nuevo.

POR SI LE INTERESA A ALGUIEN.

Vídeo del problema, (Que parece que me explico mal).

https://www.youtube.com/watch?v=wLpycxovW7c&feature

wLpycxovW7c&feature


Vídeo del problema resuelto.

https://www.youtube.com/watch?v=-711A257_0g

-711A257_0g


Código que funciona mal

procedure TForm1.FormCreate(Sender: TObject);
begin
Col9.Width := grdTablero.Width / 9;
Col1.Width := grdTablero.Width / 9;
Col2.Width := grdTablero.Width / 9;
Col3.Width := grdTablero.Width / 9;
Col4.Width := grdTablero.Width / 9;
Col5.Width := grdTablero.Width / 9;
Col6.Width := grdTablero.Width / 9;
Col7.Width := grdTablero.Width / 9;
Col8.Width := grdTablero.Width / 9;
grdTablero.RowHeight:= grdTablero.Height / 9;
end;


Código que funciona bien

procedure TForm1.FormCreate(Sender: TObject);
begin
Col9.Width := grdTablero.Width / 9;
Col1.Width := grdTablero.Width / 9;
Col2.Width := grdTablero.Width / 9;
Col3.Width := grdTablero.Width / 9;
Col4.Width := grdTablero.Width / 9;
Col5.Width := grdTablero.Width / 9;
Col6.Width := grdTablero.Width / 9;
Col7.Width := grdTablero.Width / 9;
Col8.Width := grdTablero.Width / 9;
grdTablero.RowHeight:= (grdTablero.Height - 2) / 9;
{ A grdTablero.Height hay que RESTARLE algún punto, si no la última fila
de abajo no queda seleccionada cuando se pulsa en ella siook la celda que
estaba seleccionada antes no ccrrespondía a la última fila }
end;


La causa del problema. (Espero que se me entienda en castellano)

Dado que la rejilla (TStringGrid) llamada "grdTablero" ocupa todo el espacio de su propiedad grdTablero.RowHeight con sus 9 filas, parece que la última fila no se activa correctamente y causa el error.



La SOLUCIÓN DEL PROBLEMA.

Cuando dejamos un espacio después de la última fila, (aunque sea sólo de 2 píxeles), la última fila queda activada para recibir el foco cuando es seleccionada.

Saludos a todos.

egostar
25-02-2016, 19:07:43
La SOLUCIÓN DEL PROBLEMA.

Cuando dejamos un espacio después de la última fila, (aunque sea sólo de 2 píxeles), la última fila queda activada para recibir el foco cuando es seleccionada.

Saludos a todos.


Ya veo, pero ésto obedece más a un asunto de tu teléfono que a un fallo de Delphi, en mi teléfono al seleccionar las casillas de la fila 9 automáticamente sube las casillas y casi se ocultan las casillas de la columna 1 como se puede observar en la siguiente imagen.

https://photos.google.com/album/AF1QipNWCMwG2jwMfLezEHJ5FsYXAustWeEZffKjLnPH/photo/AF1QipPE3M-jeLJAa6Z0A6IlEPoj348xI_IMq4MAlw1G

Y al contrario cuando seleccionas cualquier casilla de la fila 1 automáticamente baja las casilla como se puede observar en la imagen.

https://photos.google.com/album/AF1QipNWCMwG2jwMfLezEHJ5FsYXAustWeEZffKjLnPH/photo/AF1QipNeUdBt8dJoymN-zDA7IVlcCr1kQfMr7jm3y_6g

Por cierto, yo hago ésto para crear las columnas del StringGrid.


StringGrid1.Height := StringGrid1.Width;
StringGrid1.RowHeight := StringGrid1.Width / 9;
for I := 0 to 8 do
begin
StringGrid1.AddObject(TStringColumn.Create(self));
StringGrid1.Columns[I].Width := StringGrid1.Width / 9;
end;


Saludos

jhonalone
25-02-2016, 19:51:44
Hola, Egostar.

No creo que sea problema de mi teléfono.
También tendría que serlo de la tableta Galaxy Tab3 y del teléfono de mi mujer, Galaxy Trend.
De todas formas, no es operativo, que se oculte parte del TStringGrid. En el tablero del sudoku, se vería bastante poco estético. De hecho a mí no se me oculta nada de la pantalla.(Ni me gustaría).
Precisamente he colocado el TStringGrid (alineado al Client), dentro de un TScaledLayout para que se adapte a todas las pantallas y no cambie de tamaño.
Hay OTRO PROBLEMA MAS, que he observado y no he comentado, (Si quieres te hago otro vídeo). Y es el siguiente:

Cuando el contenedor del TStringGrid, (en este caso el TScaledLayout) es más largo que el TStringGrid y el TStringGrid está alineado al Top, si tienes una TLabel, en la que puedes ver la fila y la columna seleccionadas, aunque hayas definido la rejilla de 9x9, (por ejemplo) si pulsas por debajo de la rejilla y dentro de su contenedor verás que parece que has pulsado una fila MAYOR que 9.
Si esto no es un Bug, ¡que venga Dios y lo vea!.

Si no lo entiendes y necesitas otro vídeo, me lo dices y te lo subo. (Espero que tenga menos problemas la próxima vez) y si quieres que suba un .zip con el proyecto de prueba, me lo dices también.

Saludos.

Casimiro Notevi
25-02-2016, 20:11:23
Si esto no es un Bug, ¡que venga Dios y lo vea!.
Si no lo entiendes y necesitas otro vídeo, me lo dices y te lo subo. (Espero que tenga menos problemas la próxima vez) y si quieres que suba un .zip con el proyecto de prueba, me lo dices también.
Está bien que comentes todos los problemas que vas encontrando, así en Embarcadero podrán revisarlo.

egostar
25-02-2016, 20:33:00
Hola, Egostar.

No creo que sea problema de mi teléfono.
También tendría que serlo de la tableta Galaxy Tab3 y del teléfono de mi mujer, Galaxy Trend.
De todas formas, no es operativo, que se oculte parte del TStringGrid. En el tablero del sudoku, se vería bastante poco estético. De hecho a mí no se me oculta nada de la pantalla.(Ni me gustaría).
Precisamente he colocado el TStringGrid (alineado al Client), dentro de un TScaledLayout para que se adapte a todas las pantallas y no cambie de tamaño.


Por supuesto que no es conveniente que se vea cortada la fila, lo ideal es que sea un cuadro de 9x9 exacto, pero hay que considerar, como ya lo has mencionado, que la cuadricula la tienes que "pintar" en tiempo de ejecución debido a las diferentes definiciones de pantalla que existen, pero eso no lo veo yo como un problema de Delphi, sino como parte del aprendizaje del nuevo concepto de aplicaciones para dispositivos móviles. Particularmente el apartado de la densidad de pixeles, es decir, factor de escala, coordenadas físicas de la pantalla, con eso podrás desarrollar aplicaciones que se ajusten perfectamente a cada pantalla sin importar su tamaño.

Aquí puedes ver mi cuadricula perfectamente alineada

https://plus.google.com/u/0/photos/photo/104606759365021622579/6255305615699017202



Hay OTRO PROBLEMA MAS, que he observado y no he comentado, (Si quieres te hago otro vídeo). Y es el siguiente:

Cuando el contenedor del TStringGrid, (en este caso el TScaledLayout) es más largo que el TStringGrid y el TStringGrid está alineado al Top, si tienes una TLabel, en la que puedes ver la fila y la columna seleccionadas, aunque hayas definido la rejilla de 9x9, (por ejemplo) si pulsas por debajo de la rejilla y dentro de su contenedor verás que parece que has pulsado una fila MAYOR que 9.
Si esto no es un Bug, ¡que venga Dios y lo vea!.


Vamos a dar el privilegio de la duda. Voy a hacer algunas pruebas de ese caso para poder hablar con argumentos antes de decir que es un bug.

Saludos

jhonalone
25-02-2016, 22:03:48
Egostar.
Si miras los vídeos que he subido, podrás comprobar que mi cuadrícula tambien está perfectamente alineada y además no se oculta ni se mueve nada. Ahora estoy un poco liado, pero, si quieres esperar, no pierdas tu tiempo, subiré el proyecto de prueba en .zip, que yo ya lo tengo hecho.

Despues de tanta historia, no sé si voy a tener que cambiar la rejilla por otro u otros componentes pues quería poner lo números originales de un color y los que teclea el usuario, de otro. Pero me encuentro con el problema de que, por más que busco, lo único que encuentro es la propiedad TextSettings.FontColor, pero cuando la cambio, cambian los colores de todos los números escritos en la rejilla.
Os seguiré contando...
Saludos.

jhonalone
26-02-2016, 00:13:56
Ecostar, lo prometido. No me manejo bien con las herramientas del foro, pero creo que lo podrás bajar
Saludos.

egostar
26-02-2016, 00:20:43
Ecostar, lo prometido. No me manejo bien con las herramientas del foro, pero creo que lo podrás bajar
Saludos.

Muy bien, lo veo y mañana te comento.

Saludos

egostar
02-03-2016, 18:23:27
Hola

Después de un tiempo sin poder atender éste asunto debido a carga laboral, pude dar un vistazo al problema que mencionas y se puede resolver fácilmente.

1. Cuando dices :


Cuando el contenedor del TStringGrid, (en este caso el TScaledLayout) es más largo que el TStringGrid y el TStringGrid está alineado al Top, si tienes una TLabel, en la que puedes ver la fila y la columna seleccionadas, aunque hayas definido la rejilla de 9x9, (por ejemplo) si pulsas por debajo de la rejilla y dentro de su contenedor verás que parece que has pulsado una fila MAYOR que 9.


No estás pulsando debajo del StringGrid, estás pulsando dentro del StringGrid como lo puedes ver en la imagen que enlazo.

https://plus.google.com/u/0/photos/photo/104606759365021622579/6257498556772600978

2. Por otro lado, efectivamente, hay un detalle "raro" que al pulsar fuera del área de celdas pero dentro del mismo StringGrid cambie de celda aunque siempre permanezca en la última fila, sin embargo, el método SelectCell tiene una variable llamada CanSelect de tipo Boolean que nos ayudará a resolver el punto.

Te muestro el código que usé para resolver el problema, aunque yo forzaría a que no existiera ninguna zona extra en el StringGrid y que la cuadricula sea exacta como te lo muestro en ésta imagen.

https://photos.google.com/photo/AF1QipNqcYEBbAMaG-HhSiYgcso2q4emMxB37CCvSqLH


procedure TForm1.grdTableroSelectCell(Sender: TObject; const ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ARow <= grdTablero.RowCount then
begin
CanSelect := true;
Label4.Text := 'Columna = '+ ACol.ToString + ' / '+
'Fila = '+ ARow.ToString;
Label1.Text := 'Última casilla pulsada: ' + ACol.ToString + ',' + ARow.ToString;
end
else begin
CanSelect := false;
end;
end;


3. No sé la razón por la cual el nuevo StringGrid permite seleccionar columnas aunque no existan mas filas asignadas en la propiedad RowCount, de cualquier forma lo voy a pasar a otra instancia para saber porque funciona de esa forma o para que se tome en cuenta como punto de mejora.

Saludos

jhonalone
02-03-2016, 19:43:40
Gracias por molestarte, Egostar.

Está bien tu solución. Pero la mía, que recuerda consiste en "no dejar espacio en el contenedor del TStrinGrrid" es un poco más simple e igual de efectiva. Lo de que el TStringGrid considere que hay más filas fuera de las que se han definido en la propiedad RowCount es lo que creo que Embarcadero debe corregir.

"Ñapas" para solucionar problemas, las podemos descubrir y utilizar todos, pero hay algunas, como estas (la tuya: con CanSelect :=False ,o la mía: reduciendo el espacio del contenedor para que no se pueda pulsar) creo que estamos de acuerdo en que no deberían ser necesarias. El constructor del intérprete (Embarcadero) debería evitar que esto sucediera.

¡Ah! en la dirección https://photos.google.com/photo/AF1Q...emMxB37CCvSqLH no pude ver nada, (supongo que es una demostración del código que muestras más abajo) me da el error 404.

Saludos cordiales.

egostar
02-03-2016, 20:04:41
Gracias por molestarte, Egostar.

Está bien tu solución. Pero la mía, que recuerda consiste en "no dejar espacio en el contenedor del TStrinGrrid" es un poco más simple e igual de efectiva. Lo de que el TStringGrid considere que hay más filas fuera de las que se han definido en la propiedad RowCount es lo que creo que Embarcadero debe corregir.


Bueno, la primer imagen que enlazo (https://plus.google.com/u/0/photos/photo/104606759365021622579/6257498556772600978) es el ejemplo que tu mismo subiste, por eso es que comento que estas pulsando dentro del mismo StringGrid, asumí que así lo tienes en la práctica.

La segunda imagen que enlazo (https://photos.google.com/photo/AF1QipNqcYEBbAMaG-HhSiYgcso2q4emMxB37CCvSqLH) es precisamente lo que tú me estas comentando que haces, y que es la otra opción que yo veía.

"Ñapas" para solucionar problemas, las podemos descubrir y utilizar todos, pero hay algunas, como estas (la tuya: con CanSelect :=False ,o la mía: reduciendo el espacio del contenedor para que no se pueda pulsar) creo que estamos de acuerdo en que no deberían ser necesarias. El constructor del intérprete (Embarcadero) debería evitar que esto sucediera.

Saludos cordiales.

De acuerdo, aunque todavía me queda la duda si en realidad es un problema o es algo que tiene su razón de ser. Ya veré si es posible encontrar una respuesta a tal comportamiento ya sea justificante o aclaratoria.

Saludos

jhonalone
02-03-2016, 21:08:27
Hola de nuevo, Egostar.
No. Yo ya no utilizo un TStringrid alineado al TOP dentro del ScaletLayout, cuando descubrí el problema, reduje el ScaletLayout al tamaño que deseaba para el TStringGrid y "resolví" el problema alineando al Client. El proyecto de prueba que subi al foro era para mostrar el problema que me había encontrado. Sigo sin ver tu segunda foto. (Error 404) no te preocupes, pues me imagino cómo es.
Saludos.