PDA

Ver la Versión Completa : mantener aplicación en barra superior


danielmj
05-04-2015, 11:15:51
hola, estoy intentando crear una pequeña aplicacion que me facilite el trabajo, me explico, hace unos días y después de bastante tiempo en paro, por fin vuelvo a trabajar, esta vez como vigilante de seguridad, bien el caso es que por las noches tengo que ir "picando" en determinados sitios con un lector de códigos que posteriormente se descarga al ordenador de la empresa, esto básicamente es para comprobar que hago mi ronda, estos detectores donde tengo que picar, están muy dispersos y alejados unos de otros y al ser muchos a veces tengo la duda de si ya he pasado por uno u otro detector. Pues bién, ayer me hice una pequeña herramienta que numera del 1 al 15 los detectores, con cuatro casillas checkbox para cada uno de ellos, así a medida que voy picando con el lector de códigos marco la casilla correspondiente y ya se que he pasado por ahí. El problema es que cuando ejecuto cualquier otra app del movil, todas las casillas de mi aplicacion se resetean, se desmarcan y la app se cierra. ¿Hay forma de hacer que la aplicación siga con las casillas que estén marcardas y que se vea el icono sobre la barra superior, junto a la hora, la bateria etc?

Gracias y un saludo.

Casimiro Notevi
05-04-2015, 12:39:40
No das información suficiente.

dec
05-04-2015, 12:42:54
Hola,

Enhorabuena por el trabajo Daniel. Creo que tu aplicación debería guardar su estado, esto es, contar conque en un momento dado puede cerrarse u ocultarse. Cada vez que marques o desmarques una casilla, deberás actualizar el estado de la aplicación, algo así como "guardar las opciones", de manera que, cuando la aplicación arranque de nuevo, esta pueda recuperar el estado y "saber" qué casillas ya se marcaron y qué otras no.

Claro que no tengo mucha idea de cómo hacer esto en Delphi para Android, pero, creo yo que por ahí van los tiros, en lugar de tratar que tu aplicación se mantenga abierta o algo así. Piensa que la aplicación se puede cerrar acaso por varios motivos, incluso creo que Android puede cerrarla dependiendo de las necesidades del sistema. De modo que tu aplicación ha de guardar su estado (casillas marcadas/desmarcadas) cada vez que la utilices, garantizando que podrá recuperar el estado al iniciarse.

En fin, supongo que no he dicho mucho... pero tal vez puedas aprovechar algo de ello. ;)

danielmj
05-04-2015, 16:58:23
Gracias dec, em principio digamos que salvaba los cambios con una app tercera, es decir, una app bajada de google play que me permita hacer capturas de pantalla, la verdad es que no necesito mas, solo capturar la pantalla con las casillas marcadas, sobre todo para no complicarme con android (que por cierto, ni idea) por eso simplemente buscaba hacer que se mantuviese abierta aunque use cualquier otra aplicación.

Un saludo.

dec
05-04-2015, 19:15:38
Hola,

Hombre, pero, a primera vista, parece más complicado hacer una captura de pantalla que guardar una determinada opción... debe haber clases en Delphi que permitan guardar opciones independientemente del sistema operativo, también para Android, supongo. Espera un poco a algún compañero que sepa algo más de Android, verás que te pone sobre la pista de cómo guardar opciones y recuperarlas después. Esto parece más sencillo que capturar pantallas y también que mantener la aplicación en ejecución. Vamos, a mí me parece que tendría que ser más sencillo. Ya verás como así es. :)

AgustinOrtu
06-04-2015, 00:22:12
Create una simple base de datos sqlite con una tabla en la que guardas el estado de cada casilla

Revisa este (http://docwiki.embarcadero.com/RADStudio/XE6/en/Using_SQLite_with_FireDAC) manual para conectar a SQLite con FireDAC

De hecho, yo ahora estoy migrando los archivos .ini a sqlite, es super facil, igual o incluso mas potente, y los "usuarios normales" no van a poder meter los dedos como si podrian toquetear un ini. Y la misma tecnica que se usa para windows en escritorio serviria para cualquier plataforma en la que corra sqlite (en todos lados)

Este otro enalce (http://docwiki.embarcadero.com/CodeExamples/XE7/en/SQLiteIniFile_Demo_Sample) tambien te puede servir, solo lo he mirado por arriba, pero parece que implementa una clase que interactua con una BD sqlite como si un archivo .ini se tratase

EDITO:

Otra alternativa, usando JSON (https://www.youtube.com/watch?v=e6IKO8so-Is)

danielmj
08-04-2015, 11:46:26
Gracias AgustiOrtu, me pongo a revisar los enlaces, perdon por no contestar antes. Saludos.

danielmj
08-04-2015, 12:46:38
Hola, estoy tratando de crear la base de datos con el plugin para firefox sqllite manager, pero no me aclaro, ya he creado la base de datos y la tabla con 3 campos, pero no sé como ni donde introducir los datos y por otra parte, mirando este enlace (http://docwiki.embarcadero.com/RADStudio/XE5/en/Mobile_Tutorial:_Using_FireDAC_in_Mobile_Applications_%28iOS_and_Android%29)veo que usa la base de datos empleados con formato "s3db", ¿como puedo crear una bd con este mismo formato? lo siento pero estoy bastante pegado con firedac y con android, siempre he usado ado y windows, asi que me veo en paños menores. Espero podais ayudarme.

Un saludo.

AgustinOrtu
08-04-2015, 18:36:42
Yo para trabajar con SQLite utilizo este programita, que es super liviano y totalmente funcional:

SQLite Administrator (http://sqliteadmin.orbmu2k.de/)

Saludos

danielmj
09-04-2015, 14:28:07
Hola, ya estoy usando sqllite administrator y he creado una base de datos llamada "picas" con una tabla de igual nombre que contiene los campos: idsensor (text),sensor_activo(boolean),hora(time). Luego he creado una consulta sql con el siguiente codigo (muy simple):

SELECT * FROM PICAS

Luego en delphi, agrego un FDConnection al que le indico que el drver será "SQLlite" pulso sobre el botón "test" y todo parece ir bien. Ahora viene el problema, cuando entro en el biding editor para crear un data source, selecciono SQL siguiendo este enlace (http://docwiki.embarcadero.com/RADStudio/XE6/en/Mobile_Tutorial:_Using_FireDAC_in_Mobile_Applications_%28iOS_and_Android%29) y al seguir las instrucciones que en el aparece, me pasa lo que se ve en la captura.

http://s2.subirimagenes.com/otros/previo/thump_9366414sin-ttulo.jpg (http://www.subirimagenes.com/otros-sinttulo-9366414.html)

Dos datos a tener en cuenta, la tabla está vacía, es decir sus campos no tienen datos y en la lista desplegable del binding editor "command text" no aparece nada.

¿que estoy haciendo mal?
Gracias y un saludo.

AgustinOrtu
09-04-2015, 20:27:40
Nunca use ese Wizard para enlazar componentes visuales con fuente de datos

En Command Text no te deja escribir nada?
Tenes Connected := True en tiempo de diseño?

Sino mete un TFDQuery en el formulario, en SQL metele el SELECT que dejaste mas arriba y enlaza por Live Bindings contra ese FDQuery

danielmj
09-04-2015, 23:04:56
Hola agustin, no, en el command text no puedo escribir nada, bueno, hablando mas exactamente, si puedo escribir pero no acepta lo que escribo. Y si, connect está a true. Ahora voy a probar eso que me dices a ver que tal. Gracias.

danielmj
09-04-2015, 23:29:58
hola, creo que la cosa empieza a andar, solo una duda en ADO para almacenar los datos en un campo escribía algo así:

tblClientes.FieldbyName('Observaciones').AsString:= lo que sea

Pero intento buscar algo parecido en firedac (y siempre teniendo en cuenta que es bajo android y para mi movil) pero no sé por donde tirar, he escrito lo siguiente ¿es correcto?

procedure TForm1.Button1Click(Sender: TObject);
begin
fdQuery1.Open();
fdquery1.Fields.Fields[0].Text:= label1.Text;
fdQuery1.Post;
end;

Error de compilacion no da, pero cuando se intenta cargar en el movil, sale el logo (la llama de fuego) y directamente se cierra ¿?

¿Alguna sugerencia? Gracias y saludos.

AgustinOrtu
10-04-2015, 06:07:16
Lo mas probable es que te falten alguno de estos componentes/unidades (es lo unico que odio de FireDAC, acordarse de agregar esto)

En al menos una unidad de tu proyecto en la clausula USES deben estar presente las unidades:
- FireDAC.DApt -> Sin esto no se pueden crear objetos como el TFDQuery
- Driver link para tu BD seleccionada. Esto puedes agregar manualmente la unit de la misma manera que la anterior, o soltar un el componente y la unidad se agrega sola (recomiendo agregar el componente)
En el caso de SQLite o bien agregas un componente TFDPhysSQLiteDriverLink o bien agregas la unit FireDAC.Phys.SQLite
Si fuera por ejemplo MS SQL Server agregas un TFDPhysMSSQLDriverLink o bien la unit FireDAC.Phys.MSSQL

- Un componente TFDGUIxWaitCursor. Este componente lo que hace es cambiar el cursor del mouse cuando "FireDAC trabaja". Desconozco porque es obligatorio, eso es todo lo que dice la docwiki

Te recomiendo que antes de mandar a tu dispositivo la aplicacion compiles y ejecutes la misma para Windows. Simplemente agregas la plataforma Win32 (o Win64) en el proyecto, y la ejecutas en Windows, todos estos errores tambien pasan en Windows

Ademas, en Windows podes ver las excepciones, en Android muchas excepciones hacen que la aplicacion crashee y android la cierra y no te dice nada del error

La forma en la que estabas asignando

tblClientes.FieldbyName('Observaciones').AsString:= lo que sea

Es la correcta

Saludos

danielmj
10-04-2015, 11:10:52
Gracias Agustin por tu ayuda, ya parece que va saliendo el codigo, pero me encuentro con un problema, y es el campo hora, si escribo esto:

fdQuery1.FieldByName('hora').AsDateTime:= Time;

Me guarda 0:00:00 y no la hora correcta, lo mismo pasa si en vez de "Time" uso "now" ¿sabes por qué?
voy a seguir investigando, saludos.

sowei
10-04-2015, 11:42:19
Hola a todos
No sería más fácil para el caso tratado que guarde la información de los checkboxs en un ficherito tipo .ini o por el estilo, y olvidarse de acceso a bases de datos?
Lo digo por sencillez.

danielmj
10-04-2015, 12:08:19
Hola, tengo otro problema...

fdQuery1.Open();
fdQuery1.Insert;
fdQuery1.fieldByName('idsensor').AsString:= '1.A'; //label1.Text;
fdQuery1.FieldByName('hora').AsDateTime:= now;
fdQuery1.FieldByName('sensor_activo').AsBoolean:= true;
fdQuery1.Post;

Ejecutandolo bajo windows, ahora me dice que el dataset no está en modo inserción o editar ¿? En cuanto al "AsDateTime" no me acepta el "now" ni el "time", no da error, pero no guarda la hora exacta sino "0:00:00". Por otra parte en "(idsensor).AsString:= label1.text" no acepta el texto de la etiqueta, sino que manualmente (en codigo) tengo que decirle que es "1.A"

¿Alguna idea de por que estos errores? Un saludo.

danielmj
10-04-2015, 12:14:14
hola sowei, lo que pasa es que los checkbox se resetean cada día a 0 es decir, se desmarcan y si los guardo en un archivo ini, al dia siguiente cuando cargue la aplicacion, se volveran a marcar todos los checkbox del dia anterior junto a la hora que se marcaron y eso no me sirve. Por ejemplo, supongamos que el ultimo lo marco hoy a las 23:59 y cuando de madrugada vuelva a hacer la ronda y empiece a marcar otra vez las casillas, estas deberán estar sin marcar.

Un saludo.

sowei
10-04-2015, 14:53:39
Hola daniel
Bueno, eso depende de la construcción del programa. El fichero ini podría tener solo los valores de los checks, con lo cual tendrías este problema. Pero mejorándolo podrías crear una sección diferente para cada día. O incluso un archivo diferente para cada día.
Vamos, que depende del tiempo que inviertas claro jejeje
Saludos

AgustinOrtu
10-04-2015, 18:21:47
Hola de nuevo danielmj

Yo prefiero utilizar sentencias SQL para cualquier operacion CRUD. En tu caso tambien me crearia otro FDQuery que utilizaria para este fin, sino perderias el SELECT


with TFDQuery.Create(NIL) do
begin
Connection := TuConnectionAca;
SQL.Text := ' INSERT INTO LaTabla (CampoTime) VALUES (:Hora) ';
ParamByName('Hora').DataType := ftTime;
ParamByName('Hora').AsTime := Hora; // Hora es un TTime
Execute;
Free:
end;


Probalo de esa manera a ver si te resulta

Saludos

danielmj
13-04-2015, 11:25:32
Hola Agustin, he probado lo que me sugieres y me da error, me dice que el parametro "hora" (por ejemplo) no existe o no se encuentra, lo mismo ocurre con elr esto de los campos. En cambio si uso la sintaxis "FieldByName" no da error pero la hora sigue guardandola como "0:00:00".

Perdona que no haya podido contestar antes, pero llego muerto de sueño a casa después de estar currando por la noche y lo que quiero es dormir y luego tengo clase, así que voy justo de tiempo.
Un saludo.

AgustinOrtu
13-04-2015, 14:59:25
Eso me pasa cuando me olvido de asignarle al query la conexión

danielmj
21-04-2015, 17:53:21
Hola de nuevo, perdon por el retraso en contestar, he seguido "peleandome" con sqlite y debo confesar que me ha ganado sobre todo por que es algo que necesito cuanto antes y enfrascarme en estudiar sqlite con adroid bajo delphi no es factible en este momento, conclusión: He optado por crear un listbox donde se van agregando la hora cada vez que paso por un sensor de o lector de rondas (os recuerdo que estoy actualmente como vigilante), total que he pensado que sería mejor guardar esos datos en un archivo txt con la siguiente linea:

TPath.Combine(TPath.GetDownloadsPath, 'picas.txt');

El problema es que no guarda nada. ¿que hago mal? por supuesto estoy usando la unidad System.IOUtils tal como se indica en este otro hilo (http://www.clubdelphi.com/foros/showthread.php?t=84653)
¿alguna sugerencia? Os dejo una captura de como estaría a fecha de hoy.

http://s3.postimg.org/81dnb113z/Screenshot_2015_04_21_17_15_03.jpg (http://postimg.org/image/81dnb113z/)

Un saludo.

Edito: me falto el "saveToFile" por eso no guardaba nada, pero ahora que lo he solucionado he agregado lo siguiente:

DateToStr(date)+' picas.txt'

El preblema es que el mes el dia y año, lo separa con "\" y android lo interpreta como directorios y claro si ese directorio "\4" (que representa a abril) no existe me da error. ¿que puedo hacer?

danielmj
21-04-2015, 18:22:13
Solucionado, usaba "dateseparator" pero en xe6 es "formatSettings.dateseparator", ya va bien.
Saludos.