Array
(
)

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

Carlos Silva
   - 10 nov 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

Alanps
   - 10 nov 2009

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

Carlos Silva
   - 10 nov 2009

É 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.

 

Carlos Silva
   - 11 nov 2009

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

Alanps
   - 11 nov 2009

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

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

Carlos Silva
   - 11 nov 2009

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

Carlos Silva
   - 11 nov 2009

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

Alanps
   - 11 nov 2009

tente passar o Handle como inteiro também

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


Carlos Silva
   - 11 nov 2009

Da o mesmo erro, ainda

Carlos Silva
   - 12 nov 2009

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