Recent

Author Topic: hint y otra cuestion  (Read 3132 times)

mav

  • Jr. Member
  • **
  • Posts: 60
hint y otra cuestion
« on: June 11, 2021, 03:38:53 pm »
Hola Buenas tardes!!!He diseñado un generador de contraseñas en función del nombre introducido, todo bien, funciona, pero...sólo la
primera vez que se pulsa el botón generador,cada vez que pulsas va variando, se supone que al mismo nombre misma clave...¿Que me falta en el código?
Segunda pregunta, tengo activado el Hint en el botón superior derecho¿Que me falta para que funcione el hint?
Code: Pascal  [Select][+][-]
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons,
  9.   ExtCtrls, Windows;
  10.  
  11. type
  12.  
  13.   { TForm1 }
  14.  
  15.   TForm1 = class(TForm)
  16.     BitBtn3: TBitBtn;
  17.     Edit1: TEdit;
  18.     Edit2: TEdit;
  19.     Label1: TLabel;
  20.     BitBtn1: TBitBtn;
  21.     BitBtn2: TBitBtn;
  22.     Label3: TLabel;
  23.     Panel1: TPanel;
  24.     procedure BitBtn1Click(Sender: TObject);
  25.     procedure BitBtn3Click(Sender: TObject);
  26.     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  27.       Shift: TShiftState; X, Y: Integer);
  28.     procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  29.       Shift: TShiftState; X, Y: Integer);
  30.   private
  31.  
  32.   public
  33.  
  34.   end;
  35.  
  36. var
  37.   Form1: TForm1;
  38.  
  39.   buffer      : array[0..255] of char;
  40.   size        : dword;
  41.   part1, i    : Integer;
  42.   nombre, user: string;
  43.   part2       : integer;
  44.  
  45.  
  46. implementation
  47.  
  48. {$R *.lfm}
  49.  
  50.  
  51. { TForm1 }
  52.  
  53.  procedure TForm1.BitBtn1Click(Sender: TObject);
  54.  begin
  55.   size := 256;
  56.   GetUserName(buffer, size);
  57.   user:= buffer;
  58.      for i:=1 to length(user) do
  59.       begin
  60.        part1:= part1 + Ord(user[i]);
  61.      end;
  62.  
  63.      nombre:= Edit1.Text;
  64.        if length(nombre) = 0 then
  65.        begin
  66.           ShowMessage('Introduce algun nombre');
  67.          // Exit;
  68.           Edit2.Clear;
  69.           Edit1.SetFocus;
  70.           Exit;
  71.        end;
  72.            for i:= 1 to length (nombre) do
  73.            begin
  74.              part2:= part2+ Ord(nombre[i]);
  75.            end;
  76.    Edit2.Text := IntToStr ( part1+ part2 + $7A69+ ((length(user)+ length(nombre)) * $186A0));
  77.    Edit1.SetFocus;
  78.  end;
  79.  
  80. procedure TForm1.BitBtn3Click(Sender: TObject);
  81. begin
  82.   Form1.Close;
  83. end;
  84.  
  85. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  86.   Shift: TShiftState; X, Y: Integer);
  87. begin
  88.    ReleaseCapture;
  89.    SendMessage(Form1.Handle, WM_SYSCOMMAND, 61458, 0) ;
  90. end;
  91.  
  92. procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  93.   Shift: TShiftState; X, Y: Integer);
  94. begin
  95.    ReleaseCapture;
  96.    SendMessage(Form1.Handle, WM_SYSCOMMAND, 61458, 0) ;
  97. end;
  98.  
  99. end.
  100.  
  101.  
Gracias.
Envio sin ejecutable todo elcode, con ejecutable era demasiado grande.
LO compilé en el trunk version 65190....

Edson

  • Hero Member
  • *****
  • Posts: 1208
Re: hint y otra cuestion
« Reply #1 on: June 11, 2021, 04:05:56 pm »
A simple vista me parece que debes inicializar las variables "part1" y "part2" antes de usarlas.

Con respecto al "Hint" del botón, no puedo verificarlo, porque al abrir tu proyecto, me aparece como vacío, sin archivos.
« Last Edit: June 11, 2021, 05:21:55 pm by Edson »
Lazarus 2.0.10 - FPC 3.2.0 - x86_64-win64 on Windows 8

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: hint y otra cuestion
« Reply #2 on: June 11, 2021, 04:57:02 pm »
Sí, como son globales, cada vez que se ejecuta el manejador del evento las variables aún tienen los valores del cálculo anterior.

Dado que sólo las usas ahí yo que tú lo haría así:

Code: Pascal  [Select][+][-]
  1. procedure TForm1.BitBtn1Click(Sender: TObject);
  2. var
  3.   buffer: array[0..255] of char;
  4.   size: dword;
  5.   i: Integer;
  6.   nombre, user: string;
  7.   part1: Integer = 0; { Initialization }
  8.   part2: integer = 0; { Initialization }
  9. begin
  10.   size := 256;
  11.   FillChar(buffer, size, 0); { make sure buffer is cleared }
  12.   GetUserName(buffer, size);
  13.  
  14.   user := buffer;
  15.   for i := 1 to length(user) do
  16.     part1 := part1 + Ord(user[i]);
  17.  
  18.   nombre := Edit1.Text;
  19.   if length(nombre) = 0 then
  20.   begin
  21.     ShowMessage('Introduce algun nombre');
  22.     Edit2.Clear;
  23.   end else begin
  24.     for i := 1 to length(nombre) do
  25.       part2 := part2 + Ord(nombre[i]);
  26.     Edit2.Text := IntToStr(part1 + part2 + $7A69 +
  27.       ((length(user) + length(nombre)) * $186A0));
  28.   end;
  29.   Edit1.SetFocus;
  30. end;

Hay otras cosillas que mejorar pero eso es básicamente todo.

En cuanto el Hint, debería aparecer si lo has añadido, pero (¿estás usando Trunk?) el proyecto no se puede abrir bien con la última distribución (Laz/FPC 2.0.12/3.2.0) así que no he podido comprobarlo. :-[
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

mav

  • Jr. Member
  • **
  • Posts: 60
Re: hint y otra cuestion
« Reply #3 on: June 11, 2021, 08:06:57 pm »
Hola de nuevo, recompilado con los cambios y la versión estable, no trunk, el problema es...por ejemplo
en nombre introduzco 'm', pulso el botón generar y me da el código correcto, lo pulso otra vez o cambio el nombre y pulso
y el código ya no es correcto...a no ser que reinicie el programa...
Un Saludo

mav

  • Jr. Member
  • **
  • Posts: 60
Re: hint y otra cuestion
« Reply #4 on: June 11, 2021, 08:28:23 pm »
...no habia cambiado las variables de globales a locales, fallo técnico :) :) :)
Así funciona perfecto... a escepción del Hint..el problema eran las variables globales..O sea ,
que si importa decidir cuando una variable es global o no..
Gracias....

mav

  • Jr. Member
  • **
  • Posts: 60
Re: hint y otra cuestion
« Reply #5 on: June 11, 2021, 08:34:42 pm »
..en cuanto al código que más se podría optimizar..si se puede hacer algo.. :) :)
 

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: hint y otra cuestion
« Reply #6 on: June 11, 2021, 09:26:10 pm »
[...]el problema eran las variables globales..O sea , que si importa decidir cuando una variable es global o no..
Importa, claro, pero en este caso no tanto como que sean inicializadas cuando haga falta. Podrías haber conseguido el mismo resultado simplemente cambiando el código original a:
Code: Pascal  [Select][+][-]
  1. procedure TForm1.BitBtn1Click(Sender: TObject);
  2. begin
  3.   { Inicialización }
  4.   part1 := 0;
  5.   part2 := 0;
  6.   size := 256;
  7.   FillChar(buffer, size, 0); { make sure buffer is cleared }
  8.  
  9.   {...resto del código ...}
  10. end;
pero ya puestos, siempre es mejor hacer las cosas bien. Así evitas que luego surjan otros errores :)

..en cuanto al código que más se podría optimizar..si se puede hacer algo.. :) :)
No es exactamente "optimizar" (bueno, también...) sino evitar usar variables innecesarias, usar los tipos de datos adecuados, etc.

Por ejemplo, en vez de:
  buffer: array[0..255] of char;
  user: String;

yo probablemente declararía y usuaría simplemente:
  user: ShortString;
aunque depende de cómo esté declarado GetUserName

Además, no parece que hagan falta dos variable Part1 y Part2, porque todo lo que haces después es sumar ambas (amén de otras cosas), así que basta con:
Code: Pascal  [Select][+][-]
  1. var
  2.   {...}
  3.   part: Integer = 0; { Initialization }
  4. begin
  5. {...}
  6.   for i := 1 to length(user) do
  7.     part := part + Ord(user[i]);
  8.  
  9.   nombre := Edit1.Text;
  10.   if length(nombre) = 0 then
  11.     {...}
  12.   else begin
  13.     for i := 1 to length(nombre) do
  14.       part := part + Ord(nombre[i]);
  15.     Edit2.Text := IntToStr(part + $7A69 +
  16.       ((length(user) + length(nombre)) * $186A0));
  17.   end;
  18. {...}
  19. end;

Otra cosa que haría sería declarar size como una constante, que es básicamente lo que es, y en vez de usar nombre usaría directamente el valor de Edit1.Text, aunque ...

En realidad, lo primero que haría sería separar el cálculo de la visualización y generalizarlo a una función que tomase un par de cadenas y retornase un entero. De ese modo si mañana decidieras cambiar totalmente el interfaz de usuario o tomar los valores de un fichero o lo que sea sólo afectaría un par de líneas o tres. Además, tendrías todo el cálculo en un sólo sitio y podrías cambiarlo o añadir otro distinto sin problemas.

Teniendo todo en cuenta, sería algo así como:
Code: Pascal  [Select][+][-]
  1. function MiCalculo(const user, nombre: String): Integer;
  2. {Toma dos cadenas y devuelve un entero calculado
  3.   o cero (si "nombre" está vacío), aunque en este
  4.   ejemplo no se comprueba porque ya se hace antes
  5.   de la llamada }
  6. var
  7.   i: Integer;
  8. begin
  9.   Result := 0
  10.   if length(nombre) > 0 then begin
  11.     for i := 1 to length(user) do
  12.       Result := Result + Ord(user[i]);
  13.     for i := 1 to length(nombre) do
  14.       Result := Result + Ord(nombre[i]);
  15.     Result := Result + $7A69 + ((length(user) + length(nombre)) * $186A0));
  16.   end;
  17. end;  
  18.  
  19. procedure TForm1.BitBtn1Click(Sender: TObject);
  20. {Aún hay un pequeño error que no sé cuan importante pueda ser:
  21.  size es 255 pero buffer tiene 256 bytes (de 0 a 255) ...}
  22. const
  23.   size: dword = 255;
  24. var
  25.   //buffer: array[0..255] of char;
  26.   buffer: ShortString; {suponiendo que GetUserName lo admita}
  27.   calcres: Integer;
  28. begin
  29.   {Se usan algunos "type helpers" de SysUtils pero no dejes que eso te intimide ;)}
  30.   if Edit1.Text.IsNullOrEmpty then begin
  31.     ShowMessage('Introduce algun nombre');
  32.     Edit2.Clear;
  33.   end else begin
  34.     FillChar(buffer, Length(buffer), 0); { make sure buffer is cleared }
  35.     GetUserName(buffer, size);
  36.     calcres := MiCalculo(buffer, Edit1.Text);
  37.     Edit2.Text := calcres.ToString;
  38.   end;
  39.   Edit1.SetFocus;
  40. end;

No sé tú, pero a mí me parece más ... no sé ... ¿limpio? ;D
« Last Edit: June 11, 2021, 09:32:59 pm by lucamar »
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

mav

  • Jr. Member
  • **
  • Posts: 60
Re: hint y otra cuestion
« Reply #7 on: June 11, 2021, 09:44:43 pm »
 :) :)Mas que limpio, a mi me parece perfecto..para mi él código es arte y yo disfruto viendo código bien elaborado y espero llegar algún dia
a ser un "artista", por eso observo y leo todo lo que haceís ...pero bueno se vá avanzando lentamente, por cierto ¿Se puede abrir el archivo que envié?.
Lo pregunto, porque tengo los ides con el  DockerFormEditor y no sé si alguien sin él puede abrir los form.
Saludos y gracias por todo

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: hint y otra cuestion
« Reply #8 on: June 11, 2021, 10:35:23 pm »
[...] por cierto ¿Se puede abrir el archivo que envié?.
Lo pregunto, porque tengo los ides con el  DockerFormEditor y no sé si alguien sin él puede abrir los form.

Vaya, se me olvidó :-[

Sí, el nuevo se puede abrir sin problemas; sólo hay la pequeña pega de que el proyecto tiene fijados win32/i386 como objetivos y yo estoy en Linux, pero basta con darle a "¡Vale, m'entera'o!" en el mensaje que sale ;)

Degraciadamente no he podido hacer mucho más que abrirlo y comprobar que el Hint está puesto (para ambos, el panel superior y el botón); como usas la unidad Windows y yo estoy en Linux no he podido compilarlo pero a simple vista parece que el problema es que a pesar de que ambos tienen "Hint", la propiedad "ShowHint" está en False. Cámbiarla a True debería solucionarlo.

¡Suerte!
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

 

TinyPortal © 2005-2018