3ENGINE

Programación y otros cachivaches

Etiqueta: Delphi

Página 1/2

Tecnologia

Delphi: cómo ordenar un array dinámico (Dynamic array)


Para ordenar un array dinámico (de tipo Array of…) no hay ningun método específico.

Cómo ordenar un array dinámico

Pego un ejemplo muy básico que ordena un array dinámico de tipo Array of THuman donde THuman es una clase con dos atributos. El código hace uso de un TStringList auxiliar y un método sort() para ordenar el array dinámico.

Type
  THuman = Class
  Public
    Name: String;
    Age: Byte;
    Constructor Create(Name: String; Age: Integer);
  End;

Constructor THuman.Create(Name: String; Age: Integer);
Begin
  Self.Name:= Name;
  Self.Age:= Age;
End;

Var
 Human: THuman;
 Humans: Array Of THuman;
 List: TStringList;
Begin

 SetLength(Humans, 3);
 Humans[0]:= THuman.Create('David', 41);
 Humans[1]:= THuman.Create('Brian', 50);
 Humans[2]:= THuman.Create('Alex', 20);

 List:= TStringList.Create;
 List.AddObject(Humans[0].Name, TObject(Humans[0]));
 List.AddObject(Humans[1].Name, TObject(Humans[1]));
 List.AddObject(Humans[2].Name, TObject(Humans[2]));
 List.Sort;

 Human:= THuman(List.Objects[0]);
 Showmessage('The first person on the list is the human ' + Human.name + '!');

 List.Free;
End.



Tecnologia

Delphi: Cómo mostrar en pantalla nombre de un enumerado mediante RTTI


Si por algún motivo, necesitas mostrar en pantalla el nombre de un enumerado. Esto es posible mediante RTTI (Runtime Type Information) y haciendo uso de la UNIT TypInfo

Uses
 TypInfo;

Type
 TMiEnum = ( meAmarillo, meVerde, meRojo);

[....]
ShowMessage('El nombre del enumerado es: '+ GetEnumName(TypeInfo(TMiEnum),
Integer(meVerde)));

Esto mostrará:

  El nombre del enumerado es: meVerde



Tecnologia

Delphi: cómo almacenar contenido como recurso en el propio ejecutable y extraerlo


A veces puede interesar almacenar recursos en el propio ejecutable de Delphi. Ya sean imágenes que la aplicación utiliza o disponer de una hoja de cálculo que el usuario puede abrir desde la propia aplicación o una página HTML para abrirla desde el propio navegador que ofrece Delphi, etc. Además también consigues que al distribuir la aplicación con entregar el ejecutable (exe) ya es suficiente. Aquí te explico cómo hacer todo esto.

almacenar contenido como recurso en el propio ejecutable de delphi

Pasos para almacenar recursos en el propio ejecutable de Delphi:

1. Crear un fichero de texto con extensión .rc , por ejemplo ‘aboutresource.rc’

2. Editar el fichero, especificando para cada recurso y en una linea de texto el nombre del recurso, el formato y la ruta. Ejemplo:

ABOUT HTML "D:\Delphi\miproyecto\about.htm"
FINISH PNG "D:\Delphi\miproyecto\finish.png"
ACERCA_DE GIF "c:\libreria\about.gif"

3. Crear el fichero de recursos desde la línea de comandos con:

  BRCC32 aboutresource.RC

4. Añadir en la Unit que nos interese, la directiva:

  {$R aboutresource.RES}

La siguiente rutina extrae y graba en un fichero el recurso especificado donde le indiquemos:

{$R aboutresource.RES} 
procedure ExtractResource(ResType, ResName, ResNewName : String);
var
Res : TResourceStream;
begin
  Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
  Res.SavetoFile(ResNewName);
  Res.Free;
end;

Ejemplo de uso:

 ExtractResource('GIF','ACERCA_DE','c:\miabout.gif');

Recursos:
Web Site inside a Delphi EXE
Run a EXE RESOURCE file … (Read Inside)




Tecnologia

Invocando un Servicio Web WCF desde Delphi 7


Para que Delphi 7 importe el WSDL y genere el stub correctamente de un Servicio Web implementado en WCF (Windows Communication Foundation) hay que actualizar previamente D7 y añadir una línea de código.

Pasos a seguir.

1. Bajarse de la Web de Embarcadero el zip Delphi SOAP Runtime and Importer Update
2. Descomprimir el zip en una carpeta
3. Realizar previamente una copia de $(DELPHI)\Source\soap y copiar dentro el contenido de la carpeta src del zip
4. Realizar previamente una copia de $(DELPHI)\Bin\WSDLImp.exe y reemplazarlo por el que se encuentra en el zip
5. Abrir D7 y generar el stub.
6. Editar el stub generado y añadir, dentro de la sección initialization, la siguiente línea:

InvRegistry.RegisterInvokeOptions(TypeInfo([Nombre del servicio]),ioDocument);

7. Añadir las directivas de compilación CLEANUP_SOAP_HEADERS;FIX_ELEM_NODE_NS al proyecto
8. Añadir al Search Path del proyecto $(DELPHI)\Source\soap

Con estos pasos se solucionan, al menos, tres problemas:

1. Al invocar un método con parámetros D7 devuelve un error:

The formatter threw an exception while trying to deserialize the
message: Error in deserializing body of request message for operation ‘Testing’. End element ‘Body’ from namespace ‘http://schemas.xmlsoap.org/soap/envelope/’
expected. Found element ‘parameters’ from namespace

2. Al invocar un método con parámetros primitivos string, WCF recibe parámetros nulos
3. Al invocar un método con parámetros de instancia de una clase, WCF devuelve un error:

System.NullReferenceException: Object reference not set to an instance of an object