お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"淺山版のTeXDLLをDelphiから呼び出す"




淺山版のTeXDLLを利用してPTeXをコンパイルするサンプルです.
DLLの詳細はパッケージに付属のドキュメントを参考にして下さい.

(DLLインポートユニット.パッケージに付属しているtexdll.hの最低限
必要な部分だけDelphiで書き直したユニット)
//-----------------------------------------------------------------
unit TeX;

interface

uses
   Windows;

const
// TeX DLL Path DLLをインストールしたフォルダを指定します.
   TEXDLL = 'c:\program files\tex\system\ptex.dll';

// TeX DLL Messages
   TEXDLL_CONSOLE_WRITE  =  1;
   TEXDLL_CONSOLE_GET    =  2;
   TEXDLL_STDOUT_WRITE   =  3;

type
// TeX Handle
   HTeX = THandle;

// Array of Argument
   TTeXArgumentArray = array[ 0..255 ] of PChar;
   PTeXArgumentArray = ^TTeXArgumentArray;

// TeX DLL Callback Procedures
   TTeXCallbackProc = function ( Msg: UINT; dwParam1, dwParam2: DWORD;
         lpAppData: Pointer ): Integer; stdcall;


function PTeXInitialize( TeXCallbackProc: TTeXCallBackProc;
   lpAppData: Pointer; lpszWorkDir: PChar ): HTeX; stdcall;
   external TEXDLL name 'PTeXInitialize';

procedure PTeXUninitialize( Handle: HTeX ); stdcall;
   external TEXDLL name 'PTeXUninitialize';

function PTeXMain( Handle: HTeX; lArgc: Integer;
   pArgumets: PTeXArgumentArray ): Integer;
   stdcall; external TEXDLL name 'PTeXMain';


implementation

end.
//-----------------------------------------------------------------

(呼び出し側ユニット.フォーム上にMainMenu, RichEdit, OpenDialogが
おいてあります.コールバック関数内でRichEditに処理の途中経過を示す
文字列を追加します.)
//-----------------------------------------------------------------
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
Dialogs,
  StdCtrls, FileCtrl, TeX, ComCtrls, ExtCtrls, Menus;

type
  TMainForm = class(TForm)
    RichEdit: TRichEdit;
    MainMenu: TMainMenu;
    File1: TMenuItem;
    Exit1: TMenuItem;
    N1: TMenuItem;
    OpenFile: TMenuItem;
    OpenDlg: TOpenDialog;
    TeX: TMenuItem;
    procedure OpenFileClick(Sender: TObject);
    procedure TeXClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FTeXFile: String;
  public
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

var
  Sout: String;

function TeXCallBack( Msg: UINT; dwParam1, dwParam2: DWORD;
         lpAppData: Pointer ): Integer; stdcall;
var
  S, SS: String;
  C: Char;
begin
   case Msg of
   TEXDLL_STDOUT_WRITE:
   begin
      S := PChar( dwParam1 );
      C := S[ Length( S ) ];
      // 送られてきた文字列の最後がLFだったらRichEditに追加
      if C = #10 then
      begin
         SS := Copy( S, 1, Length( S ) - 1 );
         Sout := Sout + SS;
         MainForm.RichEdit.Lines.Add( Sout );
      // 追加した文字列が常に表示されるようにする.
         SendMessage( MainForm.RichEdit.Handle, EM_SCROLLCARET, 0, 0 
);
         Sout := '';
      end
      else Sout := Sout + S;
   end;
   end;
   Result := 0;
end;

function MakeInputFilename( S: String ): String;
begin
   //PATH名の\を/に変換(こうしないとTeXDLLが正確に認識できない)
   Result := StringReplace( S, '\', '/', [ rfReplaceAll ] );
end;

procedure ExecuteTeX( TeXFile: String );
var
  Args: array[ 0..1 ] of PChar;
  Handle: HTeX;
  R: Integer;
begin
   Args[ 0 ] := 'platex';
   Args[ 1 ] := PChar( MakeInputFilename( MainForm.FTeXFile ) );
   // HTeXを取得
   Handle := PTexInitialize( @TeXCallback, nil, nil );
   try
     //TeXMainの呼び出し.2は配列要素の数
     R := PTeXMain( Handle, 2, @Args );
     MainForm.RichEdit.Lines.Add( '' );
     if R = 0 then
        MainForm.RichEdit.Lines.Add( '>>> platex finished normally.' )
     else
        MainForm.RichEdit.Lines.Add( '>>> platex finished with 
errors!' );
   finally
     //HTeXの開放
     PTeXUninitialize( Handle );
   end;
end;


procedure TMainForm.OpenFileClick(Sender: TObject);
begin
   if OpenDlg.Execute then
   begin
      FTeXFile := OpenDlg.FileName;
      MainForm.RichEdit.Lines.Clear;
   end;
end;

procedure TMainForm.TeXClick(Sender: TObject);
begin
   MainForm.RichEdit.Lines.Clear;
   ExecuteTeX( FTeXFile );
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
   RichEdit.Align := alClient;
end;

end.
//-----------------------------------------------------------------


                                                     うより(YQF00722)

Original document by うより          氏 ID:(YQF00722)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum