none
Propriedades Set and Get RRS feed

  • Pergunta

  • Olá pessoal,

    tentem me ajudar.

    Eu tenho uma DLL em C# que fará alguns processos no meu sistema.

    Porém, o aplicativo exe mesmo é em Delphi.

    Eu gostaria de saber se tem como eu passar pro C# algumas informações pelo Delphi, mas como props no C#.

    Por exemplo:

    Eu tenho a classe produtos em C# e nela eu vou ter as propriedades Descricao, unidade e etc.

    Eu testei da seguinte forma.

    Criei um .cs chamado interfaces

    Nele eu coloquei 

    public string fDesc

    public string Descricao { get { return fDesc; } set { if (string.IsNullOrEmpty(value)) fDesc = ""; else fDesc = value.Trim(); } }

    Porém ao chamar o fDesc já no C#, ele dá exceção. No delphi eu vi que está preenchendo normalmente, porém a leitura que não consegui fazer.

    Está faltando alguma coisa?


    Rodrigo Ataíde.

    quinta-feira, 3 de novembro de 2016 18:27

Respostas

  • Ataíde, boa tarde.

    Porque você não faz a declaração dos métodos que estão presentes na DLL do delphi em uma classe a parte.

    Por exemplo:

    // Declaração das funções não gerenciadas: GetPrivateProfileString e 
            // WritePrivateProfileString
            [DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString")]
            private static extern int GetPrivateProfileString(string lpAppName,string lpKeyName, string lpDefault, StringBuilder lpReturnedString,
            int nSize, string lpFileName);
    
            [DllImport("kernel32.dll", EntryPoint = "WritePrivateProfileString")]
            private static extern bool WritePrivateProfileString(string lpAppName,string lpKeyName, string lpString, string lpFileName);

    Em uma classe onde contém suas propriedades e seu construtor que terá suas validações e suas regras.

    Se suas validações estiverem OK você chama o método presente na sua Dll do Delphi passando as informações que estão na sua propriedade.

    Como o Willian mencionou, 

    Na verdade voce nao deveria declarar fDesc como Public... Ela é uma backingfield (campo de bastidores, em traduçao livre) e deveria ser private.. Todo acesso deveria ser feito pela propriedade Descricao.

    Espero ter ajudado.


    Klayton Gomes (Software Architecture) MCP/MCTS/MCAD/MCPD/MCSD Solution Developer

    quinta-feira, 3 de novembro de 2016 19:39

Todas as Respostas

  • Porém ao chamar o fDesc já no C#, ele dá exceção. No delphi eu vi que está preenchendo normalmente, porém a leitura que não consegui fazer.

    Que exceçao? Na verdade voce nao deveria declarar fDesc como Public... Ela é uma backingfield (campo de bastidores, em traduçao livre) e deveria ser private.. Todo acesso deveria ser feito pela propriedade Descricao.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 3 de novembro de 2016 18:40
    Moderador
  • Foi justamente essa parte que eu fiquei sem entender ao certo. No caso quando eu chamar essa propriedade no delphi, eu vou preencher a Descricao, e no set/get eu vou preencher a fDesc?

    Rodrigo Ataíde.

    quinta-feira, 3 de novembro de 2016 19:28
  • Ataíde, boa tarde.

    Porque você não faz a declaração dos métodos que estão presentes na DLL do delphi em uma classe a parte.

    Por exemplo:

    // Declaração das funções não gerenciadas: GetPrivateProfileString e 
            // WritePrivateProfileString
            [DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString")]
            private static extern int GetPrivateProfileString(string lpAppName,string lpKeyName, string lpDefault, StringBuilder lpReturnedString,
            int nSize, string lpFileName);
    
            [DllImport("kernel32.dll", EntryPoint = "WritePrivateProfileString")]
            private static extern bool WritePrivateProfileString(string lpAppName,string lpKeyName, string lpString, string lpFileName);

    Em uma classe onde contém suas propriedades e seu construtor que terá suas validações e suas regras.

    Se suas validações estiverem OK você chama o método presente na sua Dll do Delphi passando as informações que estão na sua propriedade.

    Como o Willian mencionou, 

    Na verdade voce nao deveria declarar fDesc como Public... Ela é uma backingfield (campo de bastidores, em traduçao livre) e deveria ser private.. Todo acesso deveria ser feito pela propriedade Descricao.

    Espero ter ajudado.


    Klayton Gomes (Software Architecture) MCP/MCTS/MCAD/MCPD/MCSD Solution Developer

    quinta-feira, 3 de novembro de 2016 19:39
  • Olá Klayton,

    Devo ter me expressado errado.

    Vamos lá.

    Eu tenho uma DLL feita em C# e um aplicativo feito em Delphi.

    Na DLL em C# eu tenho uma public string chamada cadProd por exemplo.

    A declaração dela hoje tá assim:

    Public String CadProd(string Desc, string UN, string Qtd)

    A CadProd eu to chamado no delphi através de uma TLB. E to passando como parametro o Desc, Un e Qtd.

    O que eu gostaria era, colocar os parametros Desc, Un e Qtd como propriedades de uma classe, e passar elas como se fossem apenas variáveis, tipo variáveis globais. No Delphi eu sei que ela ficaria declarada na TLB algo do genero:

    function Get_Desc: WideString; safecall;
    procedure Set_Desct(const pRetVal: WideString); safecall;

    Porém de todas as formas que eu to fazendo em C#, mesmo que eu consiga informar o valor ao pRetVal pelo delphi, quando vou ler no C#, dá uma exceção que não lembro agora e não tenho como ver agora.


    Rodrigo Ataíde.

    quinta-feira, 3 de novembro de 2016 20:46
  • To começando a descobrir como fazer, empaquei nesse erro agora.

    Mas aos poucos to conseguindo.


    Rodrigo Ataíde.

    sexta-feira, 4 de novembro de 2016 15:05
  • Bom dia Rodrigo Ataíde,

    Conseguiu resolver o problema?

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 7 de novembro de 2016 11:18
    Moderador
  • Bom dia,

    Devido a falta de interação do autor dessa pergunta,

    essa thread está sendo fechada. Caso o problema ainda

    esteja ocorrendo, favor abrir uma nova thread.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 9 de novembro de 2016 11:27
    Moderador