[...]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:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
{ Inicialización }
part1 := 0;
part2 := 0;
size := 256;
FillChar(buffer, size, 0); { make sure buffer is cleared }
{...resto del código ...}
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
GetUserNameAdemá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:
var
{...}
part: Integer = 0; { Initialization }
begin
{...}
for i := 1 to length(user) do
part := part + Ord(user[i]);
nombre := Edit1.Text;
if length(nombre) = 0 then
{...}
else begin
for i := 1 to length(nombre) do
part := part + Ord(nombre[i]);
Edit2.Text := IntToStr(part + $7A69 +
((length(user) + length(nombre)) * $186A0));
end;
{...}
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:
function MiCalculo(const user, nombre: String): Integer;
{Toma dos cadenas y devuelve un entero calculado
o cero (si "nombre" está vacío), aunque en este
ejemplo no se comprueba porque ya se hace antes
de la llamada }
var
i: Integer;
begin
Result := 0
if length(nombre) > 0 then begin
for i := 1 to length(user) do
Result := Result + Ord(user[i]);
for i := 1 to length(nombre) do
Result := Result + Ord(nombre[i]);
Result := Result + $7A69 + ((length(user) + length(nombre)) * $186A0));
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
{Aún hay un pequeño error que no sé cuan importante pueda ser:
size es 255 pero buffer tiene 256 bytes (de 0 a 255) ...}
const
size: dword = 255;
var
//buffer: array[0..255] of char;
buffer: ShortString; {suponiendo que GetUserName lo admita}
calcres: Integer;
begin
{Se usan algunos "type helpers" de SysUtils pero no dejes que eso te intimide ;)}
if Edit1.Text.IsNullOrEmpty then begin
ShowMessage('Introduce algun nombre');
Edit2.Clear;
end else begin
FillChar(buffer, Length(buffer), 0); { make sure buffer is cleared }
GetUserName(buffer, size);
calcres := MiCalculo(buffer, Edit1.Text);
Edit2.Text := calcres.ToString;
end;
Edit1.SetFocus;
end;
No sé tú, pero a mí me parece más ... no sé ... ¿limpio?