Clipper On Line • Ver Tópico - Passar array como parâmetro do Clipper/xH para dll em Delphi
Mudar para estilo Clássico
Discussão sobre outras linguagens de programação.
Postar uma resposta

Passar array como parâmetro do Clipper/xH para dll em Delphi

05 Dez 2013 16:09

Olá a todos.

De antemão peço desculpas se postei no lugar errado.

Meu patrão me pediu para investigar se é possível fazer uma função em Delphi (dentro de uma dll) em que ele irá utilizar na sua linguagem Clipper/xHarbour onde o parâmetro passado seja um Array.

De Delphi (exe) para Delphi (dll) dá certo, basicamente passando o endereço da variável. Como o tipo de array declarado na dll é o mesmo no programa executável em que uso para testar a dll, funciona corretamente.

Código da DLL (é apenas um teste)

Código:
library vetor;

uses
  System.SysUtils,
  System.Classes,
  Vcl.Dialogs;

type
  TArrayofString = array of string;
//  TArrayofString = array[1..100] of string;

{$R *.res}

procedure AVetor(pVetor: TArrayofString; Colunas: Byte); stdcall; export;
var
  I: Byte;
  Tamanho: Byte;
begin
  SetLength(pVetor, Colunas);

  for I := 1 to Colunas do
    showmessage(pVetor[I]);
end;

exports
  AVetor;

begin
end.


Código do Executável para testar a dll (em Delphi)

Código:
unit uTesteVetor;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons;

type
  TfrmTesteVetor = class(TForm)
    btnTestar: TBitBtn;
    procedure btnTestarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TArrayofString = array of string;

var
  frmTesteVetor: TfrmTesteVetor;

implementation

{$R *.dfm}

procedure AVetor(pVetor: TArrayofString; Colunas: Byte); stdcall; external 'vetor.dll';

procedure TfrmTesteVetor.btnTestarClick(Sender: TObject);
var
  loVetor: TArrayofString;
begin
  SetLength(loVetor, 3);

  loVetor[1] := 'Coluna 1';
  loVetor[2] := 'Coluna 2';
  loVetor[3] := 'Coluna 3';

  AVetor(loVetor, 3);

  ShowMessage('Fim.');

  Close;
end;

end.


Abaixo segue o código de um pequeno prg (exe) criado pelo meu chefe para testar já com Clipper/xHarbour

Código:
func main()
aviso("Entrou",0)
NDLL_pro := LoadLibrary("vetor.dll")

clear
mretorno = space(20)
declare vetor[255]
vetor[1]="MARCOS"
VETOR[2]="MAURO"
VETOR[3]="RAFAEL"
MITENS=3
mret_dll := DLLCALL(NDLL_pro, 32, "AVetor", mretorno, vetor, MITENS)


Talvez se passasse o endereço do array (ponteiro?) como parâmetro e o Delphi sabendo manipular como um Array interno poderá dar certo. Mas não sou expert no assunto e peço ajuda a vocês.

A função acima se destina para o seguinte: meu chefe em seu programa Clipper/xHarbour exibe uma tela quando gera um relatório informando os resultados como uma visualização (preview). Porém, os procedimentos que ele utiliza comporta 80 caracteres na coluna. Vi até uns tópicos sobre esse problema aqui no fórum e passei para ele. Mas como ele quer melhorar a estética da apresentação desse resultado em tela, ele insistiu se tem como passar um array... A necessidade dele é de uma função genérica que ele poderá usar em qualquer relatório (visualização de informações na tela).

Foi mal se não expliquei direito, mas não entendo de Clipper/xHarbour. E ainda estou começando em Delphi.
Obrigado a todos.

Passar array como parâmetro do Clipper/xH para dll em Delphi

01 Jan 2014 21:48

Amiguinho,

Vejamos se entendi,

Voce tem um sistema em Clipper/DOS que gera um relatorio, em tela, mas desejam que este relatorio possa apresentar mais colunas, ok?

Primeiro. Se voce possui o código em Clipper/DOS é possivel utilizar esta saida em tela de forma mais dinamica e a saida poderia ser de várias maneiras.

Uma delas é direcionar o conteúdo do preview para um arquivo TeXTo e abrir este arquivo com os comandos de edição de memo, MemoEdit( "Arquivo.txt", 132 ). Se é que é assim o comando, pois já não uso mais o Clipper/DOS.

O parâmetro 132 seria a largura do conteudo em colunas.

Digo isto se for o caso de voce conhecer melhor o Clipper que o Delphi.
Postar uma resposta