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