Conversão de Variáveis Integer,String e Cardinal

10/11/2009

Olá Pessoal     Tenho as sequintes variaveis   sRetorno  : String aParametro: Array[0..10] Of String; pParametro : Pchar iIndice: Integer; sRetorno := IntToStr(ConfiguraBalanca (aParametro[0], aParametro[1]));   Mas esta me dando erro no retorno, a minha função configurabalanca é (Const Balanca: Integer; Aplicativo: THandle) Incompatible types: 'Integer' and 'String' Incompatible types: 'Cardinal' and 'String'   como eu poso fazer essa conversão?     Obrigado pela ajuda

Carlos Silva

Respostas

10/11/2009

Alanps

seu array é de String e vc tá tentando passar ele como Integer em "(const Balanca: Integer,..."
Responder Citar

10/11/2009

Carlos Silva

É um array, o código do programa é esse : Library CarregaDLL; uses
  SysUtils, Classes, Windows, Dialogs; {$R *.RES} //----------------------------------------------------------------//
{                   INICIO FUNCOES DA DLL PcScale                  }
//----------------------------------------------------------------// {Declara a função ConfiguraBalanca existente na DLL "PcScale.dll"}
Type TConfiguraBalanca = Function (Const Balanca: Integer; Aplicativo: THandle): Boolean; stdcall; //external PcScale; {Declara a função InicializaLeitura existente na DLL "PcScale.dll"}
Type TInicializaLeitura = Function (Const Balanca: Integer): Boolean; stdcall; //external PcScale; {Declara a função ObtemInformacao existente na DLL "PcScale.dll"}
Type TObtemInformacao = Function (Const Balanca: Integer; Campo: Integer): double; stdcall; //external PcScale; {Declara a função FinalizaLeitura existente na DLL "PcScale.dll"}
Type TFinalizaLeitura = Function (Const Balanca: Integer) : Boolean; stdcall; //external PcScale; {Declara a função ExibeMsgErro existente na DLL "PcScale.dll"}
Type TEnviaPrecoCS = Function (Const Balanca : integer; Preco : double) : Boolean; stdcall; //external PcScale; {Declara a função FinalizaLeitura existente na DLL "PcScale.dll"}
Type TObtemParametrosBalanca = Function (Const Balanca: Integer; Modelo: PInteger;  Porta: PInteger; BaudRate: PInteger ): Boolean; stdcall; //external PcScale; {Declara a função ObtemNomeBalanca existente na DLL "PcScale.dll"}
Type TObtemNomeBalanca = Function (Const Modelo, Ret: String): Integer; stdcall; //external PcScale; {Declara a função ExibeMsgErro existente na DLL "PcScale.dll"}
Type TExibeMsgErro = Function (Const Aplicativo : THandle): String; stdcall; //external PcScale; type
  PInteger = ^Integer; var   //Variaveis que armazenarão os retornos da função ObtemParametrosBalanca
  Modelo, Porta, BaudRate: Integer;   //Mascara para formatacao do peso com casas decimais
  mascara : String;   //Variável que armazenará o modelo da balança, função ObtemNomeBalanca
  CModelo: array[0..50] of char; // iFuncId    -> Código identificador da função
// pParametro -> Parâmetros passados para a função
// pBuffer    -> Retorno da função
// iBuffer    -> Tamanho do buffer de retorno pré-alocado ( São alocados 20000 Bytes por padrão ) Procedure Funcao2; Begin    MessageDlg('Funcao 1', mtinformation, [mbok], 0); End; Procedure ExecInClientDLL( iFuncId : integer; pParametro, pBuffer : pChar; iBuffer : integer ); StdCall; Var
ConfiguraBalanca : TConfiguraBalanca;
InicializaLeitura : TInicializaLeitura;
LibHandle: THandle; sRetorno: String;
aParametro: Array[0..10] Of String; iParametros, iPos, iIndice: Integer; Begin     Case iFuncId Of
    1:     Begin        LibHandle := LoadLibrary (PChar (Trim ('PcScale.dll')));
       If LibHandle <=  HINSTANCE_ERROR Then
          Raise Exception.Create ('Dll não carregada');
       @ConfiguraBalanca  :=  GetProcAddress (LibHandle, 'ConfiguraBalanca');
       iParametros := 1;
       sRetorno := pParametro;
       While Pos(',', sRetorno) > 0 Do
          Begin
             sRetorno := Copy(sRetorno, Pos(',', sRetorno) + 1, Length(sRetorno));
             Inc(iParametros, 1);
          End;
       sRetorno := pParametro;        iIndice := 1;
       While iIndice <= iParametros Do
          Begin
             If Pos(',', sRetorno) > 0 Then
                iPos := Pos(',', sRetorno) - 1
             Else
                iPos := Length(sRetorno);
             aParametro[iIndice - 1] := Copy(sRetorno, 1, iPos);
             sRetorno := PChar(Copy(sRetorno, Pos(',', sRetorno) + 1, Length(sRetorno)));
             Inc(iIndice, 1);
          End;
        sRetorno := IntToStr(ConfiguraBalanca (aParametro[0], aParametro[1]));
       StrPLCopy(pBuffer , sRetorno, iBuffer);     End;     2: Funcao2()     End; End;
Exports ExecInClientDLL; // Essa será a única função lida pelo client do Protheus Begin End.  
Responder Citar

11/11/2009

Carlos Silva

Bom dia Alguém tem uma ideia de como eu posso revolver, essa conversão de variável?   Att. Carlos
Responder Citar

11/11/2009

Alanps

sei que não vai resolver seu problema, mas tenta passar assim, que provavelmente vai rodar:

ConfiguraBalanca(StrToInt(aParametro[0]),Application.Handle);

Responder Citar

11/11/2009

Carlos Silva

Obrigado, coloquei mas não foi, passou a dar outro erro.
Responder Citar

11/11/2009

Carlos Silva

sRetorno := IntToStr(ConfiguraBalanca (StrToInt(aParametro[0]), aParametro[1])); agora  esta dando o erro em aParametro[1])); Incompatible types: 'Cardinal' and 'String'
Responder Citar

11/11/2009

Alanps

tente passar o Handle como inteiro também

ConfiguraBalanca(StrToInt(aParametro[0],StrToInt(aParametro[1])));


Responder Citar

11/11/2009

Carlos Silva

Da o mesmo erro, ainda
Responder Citar

12/11/2009

Carlos Silva

Resolvido colocando a seguinte expressão   sRetorno := BoolToStr(ConfiguraBalanca (StrToInt(aParametro[0]), StrToInt(aParametro[1])));
Responder Citar