Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-08-2017
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 110
Poder: 7
engranaje Va por buen camino
tipos enumerados de ejecutable delphi a dll lazarus

Saludos a todos

Estoy desarrollando una dll en lazarus 1.6.4 para utilizar desde una aplicación también desarrollada por mí en delphi 5. Tengo los fuentes de ambas herramientas.
intentando simplificar al máximo este es el código que compilo en delphi 5:
Código Delphi [-]
unit UDllColor;
interface

type
TColor = (
    oBlack,    
    oWhite,    
    oRed          
  );
  
Procedure PintarColor(aColor:tcolor); external 'color.dll';

implementation
end.

y este el código de la dll en lazarus:
Código Delphi [-]
library color;

{$mode objfpc}{$H+}

uses

 Interfaces, Forms,controls, Dialogs, Classes,sysutils;

type

TColor = (
    oBlack,    
    oWhite,    
    oRed     
    );

Procedure PintarColor(aColor:TColor); export;
begin
  // Mostramos el color elegido
  QuestionDlg('Color' ,'indice del color seleccionado ->'+inttostr(integer(acolor)), mtCustom,     
  [mrCancel,'Cancelar',mrRetry,'Reintentar'],0);
end; 

exports PintarColor;

{$R *.res}

begin
    Application.Initialize;  // Es necesario para poder llama a QuestionDlg;
end.

El caso es que cuando desde delphi llamo a PintarColor pasandole oBlack como parámetro (o sea el primer valor del tipo) todo funciona como espero, sin embargo cuando llamo a PintarColor pasando cualquier otro parámetro, la dll en lazarus en lugar de recibir el número esperado parece recibir otro o por lo menos pinta otro en el dialogo que muestro. Es decir si hago esto en delphi:
Código Delphi [-]
  if integer(oWhite) = 1 then
     PintarColor(oWhite);

El dialogo que pinta la dll es ' indice del color seleccionado -> 1378817 '.

Como pista puedo decir que que si modifico la función del lado de delphi para que acepte enteros y le paso un 1 la dll por supuesto muestra ' indice del color seleccionado -> 1 '

Alguien tienen una pista que me pueda inidicar lo que me puede estar pasando?

Entiendo que tiene fácil solución pasando a utilizar enteros, pero lo cierto que este mismo sistema lo he utilizado con versiones anteriores de lazarus y nunca tuve este problema.

Última edición por engranaje fecha: 07-08-2017 a las 14:01:29.
Responder Con Cita
  #2  
Antiguo 07-08-2017
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.393
Poder: 13
duilioisola Va camino a la famaduilioisola Va camino a la fama
En la librería Graphics de Delphi se definen los valores para los colores.
Quizás en Lazarus es distinto, ya que estos valores suelen ser internos.
Otra opción es que estés enviando el índice del color y no el color propiamente dicho.

En Delphi 6 he encontrado esta definición en Graphics.pas:

Código Delphi [-]
  clBlack = TColor($000000);
  clMaroon = TColor($000080);
  clGreen = TColor($008000);
  clOlive = TColor($008080);
  clNavy = TColor($800000);
  clPurple = TColor($800080);
  clTeal = TColor($808000);
  clGray = TColor($808080);
  clSilver = TColor($C0C0C0);
  clRed = TColor($0000FF);
  clLime = TColor($00FF00);
  clYellow = TColor($00FFFF);
  clBlue = TColor($FF0000);
  clFuchsia = TColor($FF00FF);
  clAqua = TColor($FFFF00);
  clLtGray = TColor($C0C0C0);
  clDkGray = TColor($808080);
  clWhite = TColor($FFFFFF);
  StandardColorsCount = 16;

Última edición por duilioisola fecha: 07-08-2017 a las 14:42:06.
Responder Con Cita
  #3  
Antiguo 07-08-2017
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 110
Poder: 7
engranaje Va por buen camino
Por si pudiera servir de pista he encontrado un comportamiento curiosos en un formulario sencillo con 2 botones de prueba utilizando la dll como expliqué en el punto anterior:

Código Delphi [-]

unit Principal;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,UDllColor;

type
  TForm1 = class(TForm)
    btnPrueba: TButton;
    btnPrueba2: TButton;
    procedure btnPruebaClick(Sender: TObject);
    procedure btnPrueba2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.btnPruebaClick(Sender: TObject);
begin

   if integer(oWhite) = 1 then
      PintarColor(oWhite);

   if integer(oRed) = 2 then
       PintarColor(oRed);

end;

procedure TForm1.btnPrueba2Click(Sender: TObject);
begin
    if integer(oRed) = 2 then
       PintarColor(oRed);
end;

Si en el onclick del boton solo se hace una llamada a pintarcolor la dll muestra un valor distinto tanto si se le pasa oWhite como oRed, sin embargo si se llama dos veces seguidas a PintarColor, la dll solo muestra un valor distinto en la primera llamada, la segunda llamada devuelve el valor esperado. Sigo peleandome con esto pero confieso que de momento me veo perdido.
Responder Con Cita
  #4  
Antiguo 07-08-2017
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 110
Poder: 7
engranaje Va por buen camino
Lo siento por error he creado 2 hilos identicos, habría que unificarlos si se puediera.

En cuanto al color, es solo un ejemplo, podia haber puesto TdiasSemana y poner los valores de lunes a domingo. Igual lleva a confusión el nombre elegido. No se trata de un problema con los colores sino con la diferencia entre el valor que se pasa como parametro desde delphi y el que le llega a la dll en lazarus.
Responder Con Cita
  #5  
Antiguo 07-08-2017
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.393
Poder: 13
duilioisola Va camino a la famaduilioisola Va camino a la fama
Ahora veo que no estás utilizando la librería Graphics.
Supongo que lo que muestras es solo codigo de ejemplo.
Asegúrate de que no utilizas la unidad Graphics o renombrea
Código Delphi [-]
unit UDllColor;
interface

type
TMiColor = (
    oBlack,    
    oWhite,    
    oRed,          
  );
  
Procedure PintarColor(aColor:TMiColor); external 'color.dll';

implementation
end.
Responder Con Cita
  #6  
Antiguo 07-08-2017
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 110
Poder: 7
engranaje Va por buen camino
Finalmente he enconrado mi problema. La solución es declarar el tipo en la dll con la directiva de compilador {$PACKENUM 1}
así ;
Código Delphi [-]
 type
 {$PACKENUM 1}      
  TColor = (     oBlack,         
                  oWhite,        
                  oRed             );

De este modo forzamos e número máximo de bytes de espacio a usar pra los tipos enumerados. El valor por defecto es mas alto y como resultado sucede lo que he planteado en esta tarea. Siento la confusión debido a llamar al tipo de ejemplo Tcolor.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
tipos enumerados de ejecutable delphi a dll lazarus engranaje Lazarus, FreePascal, Kylix, etc. 1 07-08-2017 14:39:30
Por que se esconde el icono del ejecutable Lazarus pedrolazarus Lazarus, FreePascal, Kylix, etc. 6 05-05-2013 02:21:51
Instalar Tipos de Letras en ejecutable JPMMVR OOP 2 18-01-2009 19:14:59
Tipos de datos enumerados en Delphi liriko OOP 8 19-11-2005 00:32:02
Tipos enumerados no excluyentes? Lepe Varios 4 24-09-2004 02:41:57


La franja horaria es GMT +2. Ahora son las 16:13:29.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi