PDA

Ver la Versión Completa : Ejecución de cógido solo en IDE


fryguy
01-08-2005, 20:40:04
Cuando estoy en un entorno de desarrollo uso la directiva {$DEFINE DEBUG} para
habilitar ciertas partes del código y en el momento de compilar elimino dicha línea
para que las partes especiales no sean incluídas.
No se si me explico, por las dudas incluyo un ejemplo.



unit ULogin;
{$DEFINE DEBUG}

...

procedure TfrmLogin.Label1Click(Sender: TObject);
begin
leUsuario.Text := 'MiUsuario';
leClave.Text := 'MiClave';
end;

procedure TfrmLogin.FormShow(Sender: TObject);
begin
{$IFDEF DEBUG}
Label1.Visible := True;
{$ELSE}
Label1.Visible := False;
{$ENDIF}
end;



Este código habilita o deshabilita una label con me completa los campos usuario
y contraseña al hacerle un clic.
En un entorno de desarrollo la directiva de compilación $DEFINE me habilita el
label y en el momento de pasar a producción elimino la directiva para que el label
no sea habilitado.
A pesar de que el usuario MiUsuario con clave MiClave no existen en el entorno
de producción no es deseable que por un olvido al compilar los usuarios finales
accedan a esta funcionalidad.
Mi pregunta es, ¿conocen alguna forma más flexible para que cierta porción de código
solo se encuentre disponible dentro del IDE y desaparezca una vez compilada la aplicación?

Gracias por todo.

delphi.com.ar
01-08-2005, 20:49:24
¿conocen alguna forma más flexible para que cierta porción de código solo se encuentre disponible dentro del IDE y desaparezca una vez compilada la aplicación?
Te respondo con una pregunta: ¿Conoces alguna diferencia entre lo que compilas con el IDE y lo que compilas sin el?.... Mmmmmm

Primero quiero aclararte que no me parece una práctica muy prolija que digamos, igualmente se me ocurre, solución súper básica, que es hacer algo como:

program Miproyecto;

uses
Forms,
SysUtils,
....;

begin
{$IFDEF DEBUG}
if ParamStr(0) <> 'j5r9jfd93ws03' then
raise Exception.Create('Error bla, bla, bla....')
{$ENDIF}

Application.Initialize;
Application.CreateForm(...);
...
Application.Run;
end.


Y tener definido en el ini ese valor de parámetro, si te olvidas de compilarlo de otra forma, te darás cuenta en cuanto lo instales, por los mismos usuarios!

dec
01-08-2005, 21:46:27
Hola,

Se me ocurre que puedes definir la directiva "DEBUG" a nivel de proyecto: Project > Options > Conditionals. Y que por otro lado, en el archivo "dpr" escribieras algo así:


begin
{$IFDEF DEBUG}
{$MESSAGE WARN 'Atención: La directiva DEBUG está definida'}
{$ENDIF}
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

De ese modo, cuando compiles con la directiva "DEBUG" podrás ver un mensaje en donde aparecen los errores y advertencias al compilar, ya sabes. Sería cuestión, esto sí, de estar pendiente del mensaje a la hora de compilar.

Claro que no sé hasta qué punto lo que digo tiene que ver con lo que tú hubieras esperado por una respuesta más o menos razonable.

El caso es que el tema me parece interesante y no he podido dejar de meter baza, como suele decirse.

fryguy
01-08-2005, 22:27:32
Me gusta la solución que ofrecés, por lo menos tengo una alerta si me olvido de sacar la porción de código.
De todas formas tiene que haber una forma de especificar que una porción de código solo puede ser usada en el IDE, existe para el uso de packages.

delphi.com.ar
01-08-2005, 22:38:02
Si puedes averiguar si el IDE esta abierto, si la aplicación se esta debugueando.... pero en ambos casos, tu código de debug estará compilado de todos modos, y que este el IDE abierto o este en modo Debug, no es ninguna garantía de seguridad!

dec
01-08-2005, 22:42:51
Hola,


tiene que haber una forma de especificar que una porción de código solo puede ser usada en el IDE, existe para el uso de packages.

¿Podrías explicar, aunque fuera un poco por encima, en qué consiste? En cuanto a:


especificar que una porción de código solo puede ser usada en el IDE

Ahí creo que debe haber un error de concepto: cuando compilas un proyecto no estás compilando "para el IDE" ni "en el IDE", sino que estás compilando un proyecto... y nada más...

¿Cómo puede saber Delphi si el proyecto que acabas de compilar lo usarás para "debugear" o se lo enviarás a un usuario final? Yo creo que no puede saberlo y que para eso, entre otras cosas, tenemos las directivas de compilación.

Es cierto que puede olvidársete quitar o poner una directiva de compilación que haga que los resultados (el código compilado) no sean los esperados... pero, me temo que tendrás que estar pendiente de que no ocurra algo así: por ejemplo como te digo más arriba y/o siguiendo la idea de Federico.

"Debugear" (mientras se desarrolla) es más o menos habitual, pero, cuando uno compila un proyecto para su posterior distribución ha de estar pendiente de ciertas cosas y una de ellas puede ser justamente la del control de las directivas de compilación.

De todos modos podrías comentar lo que dices de los "packages". Gracias.

fryguy
01-08-2005, 22:54:41
Gracias por todas las aclaraciones, no eran necesarias pero aclaran un poco más esta consulta.
Por uso en el IDE y debuggeando me refiero a ejecutar la aplicación desde el IDE mismo con F7, F8 o F9. Si bien es en definitiva compilada y se trapean los breakpoints y demás, permite al desarrollador un seguimiento de las sentencias que se van ejecutando.
Mi consulta, en definitiva, es si existe alguna directiva (opción o cualquier otra cosa) que me permite habilitar una porción de código mientras la aplicación se ejecuta desde el IDE y que, una vez compilada (compiled o built en inglés) ya no se encuentre disponible.

Pordón por tantas consultas tan confusas, tal vez no se expresar exactamente lo que necesito.

roman
01-08-2005, 23:14:24
que me permite habilitar una porción de código mientras la aplicación se ejecuta desde el IDE y que, una vez compilada (compiled o built en inglés) ya no se encuentre disponible.


Es que este es precisamente el punto. Cuando corres la aplicación desde el IDE, ya está compilada.

Lo que mencionas acerca de los paquetes no es lo que buscas. En ese caso se trata de código que sólo se ejecuta durante el diseño, no cuando se está ejecutando la aplicación, sea desde el IDE o no.

Es decir, hay una diferencia entre lo que se ejecuta en el IDE y lo que se ejecuta desde el IDE.

// Saludos

estenoesta
02-08-2005, 02:52:47
si no me equiboco quieres que solo funcione cuando estes ejecutandolo desde delphi...

bueno pues puedes verificar si se esta ejecutando delphi..
mmm
puedes buscar en el foro como detectar las aplicaciones que se estan ejecutando... o quiza en la seccion de trucos mmm si no me equiboco en los de IDE venga algo que te pueda servir.

Crandel
02-08-2005, 05:38:58
El gran problema de lo que planteas, me parece, no es que quede el código, poruque igual la función no la van a poder ejecutar dado que tu label esta invisible.

Pero tu clave si se podrá ver en un editor hexadecimal, por lo que podrias modificar tu aplicación asi:


procedure TfrmLogin.Label1Click(Sender: TObject);
begin
leUsuario.Text := Desencritar('MiUsuario');
leClave.Text := Desencritar('MiClave');
end;


donde "Desencriptar" sea una función que desencrite tu clave, y en un editor hexa sólo se vera tu código encriptado. Obviamente, esta función no debe ser pública.

paufra
02-08-2005, 09:45:48
En la sección de trucos mira este (http://www.clubdelphi.com/vertruco.php?id=339), es para detectar si el IDE está en funcionamiento. Lo puedes usar para hacer visivle el label solo cuando este el IDE funcionando.

delphi.com.ar
02-08-2005, 14:30:46
Con respecto a esto:
En la sección de trucos mira este (http://www.clubdelphi.com/vertruco.php?id=339), es para detectar si el IDE está en funcionamiento. Lo puedes usar para hacer visivle el label solo cuando este el IDE funcionando.

Yo me refería en:
Si puedes averiguar si el IDE esta abierto, si la aplicación se esta debugueando.... pero en ambos casos, tu código de debug estará compilado de todos modos, y que este el IDE abierto o este en modo Debug, no es ninguna garantía de seguridad!

Porque:
Mi pregunta es, ¿conocen alguna forma más flexible para que cierta porción de código
solo se encuentre disponible dentro del IDE y desaparezca una vez compilada la aplicación?

Aparentemente fryguy no quiere que quede el código compilado...

fryguy
02-08-2005, 14:48:49
Aparentemente fryguy no quiere que quede el código compilado...
Exacto!!! El problema más grande es que el cliente compró los fuentes y, sumado a que no es muy brillante, cualquier clase de puerta trasera puede meterme en problemas.
Si bien es código que no tendría ningún uso práctico en un entorno de producción no deberían aparecer comportamientos raros en la aplicación.

roman
02-08-2005, 17:34:42
En la sección de trucos mira este (http://www.clubdelphi.com/vertruco.php?id=339), es para detectar si el IDE está en funcionamiento.

A mi me parece que este truco es para hacer precisamente lo contrario: simular que el IDE está abierto y así saltarse la detección.

// Saludos

Crandel
02-08-2005, 17:50:22
no deberían aparecer comportamientos raros en la aplicación.

no te queda otra que eliminar el código. Pon un cartel recordatorio o algo asi

fryguy
02-08-2005, 18:07:56
Al final me voy a quedar con esta opción. Controlo si la directiva DEBUG está definida y en caso de que así sea no permito la compilación.
{$IFDEF DEBUG}
{$MESSAGE FATAL 'Directiva DEBUG definida, no se permite la compilación'}
{$IFEND}

Muchas gracias por todo

roman
02-08-2005, 18:15:14
Pero si usas {$message fatal}, ¿cómo vas a hacer para compilar cuando sí necesites el "debug"? Tendrás que quitar esta directiva y luego acordarte de ponerla nuevamente con lo que volvemos al principio.

// Saludos

rastafarey
02-08-2005, 19:51:29
Segun lo que he visto.

Por ejemplo si creas un componente.

Solo debes preguntar si el compoenete esta es doseño.

Como.Designer(Verifica bien quisas se escriba de otra manera).

Asi puedes ver si estas en diseño o no.

Pero lo que quieres hacer creo que compilacion condiconal no se puede.
Ya esta la debes hacer a mano.