Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Mensaje de error extraño (https://www.clubdelphi.com/foros/showthread.php?t=62241)

Delphius 15-12-2008 17:32:46

Pues a mi me gusta la opción de Al y la GUID. Aunque, ese arreglo que hace lepe al hacer uso de ambas cosas: GUID y numeros aleatorios.

Como yo he dicho: mucho no aporto, asi que será mejor que no opine mucho.

Lo que si es bueno comentar, viendo el código que empleas para cifrar (encriptar no es el término más adecuado;)), que no se emplee la función Random, RandomSeed o alguna relacionada con éstas para desarrollar algoritmos de cifrado. Si bien empleas RandSeed para generar la misma secuencia, las funciones Random no fueron diseñadas para mecanismos de criptografía, sino con fines de simulación, y/o estadísticos.

Además, la función Random cambia según la versión del compilador. Si luego adquieres una nueva versión del compilador, es posible que por más RandSeed que tengas, el resultado sea otro.

Saludos,

Sick boy 17-12-2008 10:22:26

Hola,

Hasta el momento, la modificacion ha funcionado correctamente.

Lo que hice fue lo siguiente:

1.- Añadir una variable MDO_Unique_Cursor en MDOUtils.pas
Código Delphi [-]
var
  MDO_Unique_Cursor: Integer = (aqui va el valor más bajo de un integer, ahora no lo recuerdo);

2.- Añadir la función (en MDOUtils) que incremente nuestra nueva variable.
Código Delphi [-]
function Valor_Cursor_MDO:string;
begin
  try
    inc(MDO_Unique_Cursor);
  except
    MDO_Unique_Cursor:= low(integer);
  end;
  result:= inttostr(MDO_Unique_Cursor);
end:
He utilizado un bloque try..except porque creo que será más rapido que un if..then..else. Ya me he equivocado un monton de veces en este hilo, puede que me equivoque en esto tambien.

3.- En MDOSQL.pas, buscar el TMDOSQL.Prepare, y sustituir la linea donde se asigna el valor al cursor por esta:
Código Delphi [-]
FCursor := Name + Valor_Cursor_MDO;

Si utilizas IBX o FreeIB, seria algo parecido, aunque yo comentaria la asignación del cursor en el .Create. Al ya ha explicado porque es mejor.

Aunque el valor de Name (haciendo un uso "normal" del componente TMDOQuery, TMDODataset) siempre es vacio, el cursor funciona sin problemas.
Supongo que el componente TMDOSQL si que pasará el valor de Name al crear el cursor. No lo he probado, y no lo necesito.

El typecast, al principio no me funcionaba, luego recorde que hay que hacerlo en la misma unit donde tengas los componentes, y asi si que funciona.

Como digo, Name no es necesario, salvo que seais capaces de acabaros todos los numeros integer en poco tiempo. Si este fuera el caso, recomendaria pasar el valor Name mediante un typecast, o con un overload del create como se sugiere en el foro.

La rutina para "cifrar" no contiene la formula de la coca cola :D, se trata solo de evitar que el usuario pueda cambiar algunas cosas.
Estas rutinas estan en la web por todas partes, yo no se si las vi por primera vez en trucomania.
Tienen varios inconvenientes, por ejemplo, el texto no siempre es legible, puede tener caractares no imprimibles, y si lo guardas a un archivo luego no es descifrable.
Admito sugerencias, pero como esto del cifrado deberia estar en otro hilo, enviarlas por privado, y si es necesario comentar algo iniciamos el post en el foro correspondiente.

No podeis imaginaros lo agradecido que estoy por la ayuda que desinteresadamente me habeis proporcionado. Ojalá algún dia tenga los conocimientos necesarios como para devolver(os) el favor.

GRACIAS

Lepe 17-12-2008 15:55:01

Cita:

Empezado por Sick boy (Mensaje 331254)
He utilizado un bloque try..except porque creo que será más rapido que un if..then..else. Ya me he equivocado un monton de veces en este hilo, puede que me equivoque en esto tambien.

Perdona, equivocar, no te has equivocado, has utilizado una solución, que si bien podría no seguir algunos estándares de programación, funciona a la perfección.

En realidad las excepciones son costosas, ten en cuenta que ha de crearse un nuevo objeto en memoria, tracear la pila de llamadas y volver hacia atrás buscando los try ... except en toda la pila de llamadas y, si no encuentra ninguna más, entonces mostrar el mensaje al usuario.

El dicho viene al caso: "más vale prevenir que curar". Si puedes esquivar la excepción, mejor que mejor. Un "if ...else" sólo se traduce en una comparación y salto en ensamblador. La creación de la excepción, como ya he dicho, es algo más costoso que eso.

En tu favor, podemos decir que tu código funcionará perfectamente e incluso más rápido que ese "if ... else" porque ahorras esas dos instrucciones ensamblador. Sólo en el caso de superar el máximo número del tipo Integer, será un poco más lento tu código. Usando el "if...else" siempre tendrás la misma "velocidad de ejecución" (se supere el máximo o no).

Saludos

Al González 17-12-2008 18:41:05

Hola amigos.

Que bueno que ya quedó resuelto el asunto de Ricardo, sólo habrá que esperar a ver si no hay más en juego. De cualquier forma, y gracias a esta discusión, hemos descubierto una deficiencia de consideración en la familia de los componentes IBX.

Quisiera agregar algo breve, sobre lo recién comentado.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
  I :Integer;
  B :Byte;
begin
  I := MaxInt;
  Inc (I);  // O "I := I + 1;"
  ShowMessage (IntToStr (I) + ' = ' + IntToStr (Low (Integer)) +
    ' (el incremento de enteros es circular).');

  B := MaxByte;
  Inc (B);  // O "B := B + 1;"
  ShowMessage (IntToStr (B) + ' = ' + IntToStr (Low (Byte)) +
    ' (el incremento de enteros es circular).');
end;

El código anterior demuestra que no es necesaria ninguna implementación especial cuando se quiere hacer incremento circular de una variable de tipo entero, alcanzando todos sus valores posibles.

Un saludo.

Al. :)


La franja horaria es GMT +2. Ahora son las 16:02:10.

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