Interfaces matlab-delphi

Solo disponible en BuenasTareas
  • Páginas : 18 (4276 palabras )
  • Descarga(s) : 0
  • Publicado : 15 de febrero de 2011
Leer documento completo
Vista previa del texto
Capítulo

9 0

Interfaceando Matlab e Delphi através de Automation

Autor: Constantino Seixas Filho UFMG – Departamento de Engenharia Eletrônica

1

Utilizando o Matlab a partir de um programa em Delphi
O primeiro passo é instanciar um objeto da classe da aplicação desejada, no nosso caso o Matlab. Inicialmente usaremos um método de fácil utilização, mas que apresenta algunsinconvenientes. Nós iremos definir uma variável do tipo variant e atribuir a ela um objeto COM suportando a interface IDispatch. Depois vamos usar este objeto para chamar métodos do servidor. O aspecto negativo deste tipo de enfoque é que ele é mais lento e proporciona uma checagem de tipos muito pobre. Toda a checagem de tipos envolvendo variants é feita em tempo de execução.
CreateOleObjectCreateOleObject irá criar um objeto da classe indicada e retornar uma interface IDispatch. Para usar a função inclua ComObj na lista uses.
function CreateOleObject(const ClassName: string): IDispatch;

O parâmetro ClassName especifica a ClassID.
Exemplo Matlab := CreateOleObject('Matlab.Application'); // Cria instância de objeto

Matlab deve ser uma variável da classe Variant. O tipo Variant écompatível com quaisquer tipos básicos suportados por automation: inteiros, reais, booleanos, strings e arrays. Um outra alternativa é usar a função CreateComObject, quando o Class ID é conhecido:
CreateComObject function CreateComObject(const ClassID: TGUID): IUnknown;

Se o objeto não for liberado explicitamente ele permanecerá alocado. Para fechar o Matlab basta fazer:
Matlab := Unassigned; //Libera objeto

Para usar as funções disponibilizadas pela interface use:
Matlab.Execute('contour(a)');

Observe que CreateOleObject retorna um objeto do tipo IDispatch enquanto CreateComObject retorna um objeto do tipo IUnknown. A função Execute irá executar qualquer comando do Matlab. Para saber quais as funções disponibilizadas leia a seção seguinte: Importando o Arquivo Type library doMatlab.

2

Caso a aplicação já esteja em execução, a função a ser executada é:
function GetActiveOleObject(const ClassName: string): IDispatch;

Esta função retorna uma referência para uma interface IDispatch para um objeto COM registrado e em execução no momento da chamada.
Exemplo MyWordApp := GetActiveOleObject( ‘Word.Application’ ); Exemplo Completo de Aplicação: Este exemplo foi extraídode um forum de discussões do Delphi: unit TestMatlab1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComObj; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public Matlab : Variant; zr, zi : OleVariant; { Public declarations } end; var Form1: TForm1; implementation{$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var i, j : integer; begin Caption := 'Matlab Magic'; Matlab := CreateOleObject('Matlab.Application'); // Cria instância de objeto zr := VarArrayCreate([1, 16, 1, 16], varDouble); // Cria array de Variants com double precision zi := VarArrayCreate([0, 0], varDouble); for i := 1 to 16 do for j := 1 to 16 do zr[i, j] := Random; // Define amatriz zr (16, 16) Matlab.PutFullMatrix('a', 'base', VarArrayRef(zr), VarArrayRef(zi)); Matlab.Execute('contour(a)'); // Matlab := Unassigned; // Libera objeto end; end.

3

Quando o botão da aplicação for acionado, observe o surgimento do ícone relativo ao Matlab na parte inferior da tela. Caso o ícone não apareça é porque a aplicação não foi encontrada no registry. Confira no registry o nomeda aplicação, se ela suporta Automation e se o path para o executável está correto.

Importando o Arquivo Type library do Matlab
Existem duas maneiras de se conhecer os métodos de uma aplicação. Através da documentação do fornecedor e através da importação da type library. O Delphi fornece ferramentas tanto para a visualização de uma type library como para transformar uma type library em uma...
tracking img