-1

コンポーネントの作成を開始しましたが、DCR ファイルを生成するプログラムを作成したいと考えています。コンポーネントの画像は 24x24 のビットマップである必要があるため、リソース ファイルを作成し、それを使用brcc32して DCR を作成する必要があります。

手順:

  1. 24x24 ビットマップを作成します (ペイント、古いがゴールド)
  2. RC ファイルを作成する
  3. brcc32 を使用して DCR を作成します。

それで、私はこれらすべてのものを私のために作るプログラムを書きたいと思っています。これがフォームです。Name編集フィールド内に、プロパティを書きました。

画像

これはコードです:

unit uBmp2rc;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.IOUtils,
  Vcl.ExtDlgs, Vcl.ExtCtrls, ShellApi;

type
  TBitmapConverter = class(TForm)
    Label1: TLabel;
    edtClassName: TEdit;
    Label2: TLabel;
    edtSource: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    edtDirectory: TEdit;
    OpenPicture: TOpenPictureDialog;
    Label5: TLabel;
    edtBitmap: TEdit;
    Button1: TButton;
    Button2: TButton;
    Label6: TLabel;
    Preview: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    path: string;
  public
    { Public declarations }
  end;

var
  BitmapConverter: TBitmapConverter;

implementation

{$R *.dfm}

procedure TBitmapConverter.Button1Click(Sender: TObject);
begin

 if OpenPicture.Execute then
  begin
   edtBitmap.Text := OpenPicture.FileName;
   Preview.Picture.LoadFromFile(OpenPicture.FileName);
  end;

end;

procedure TBitmapConverter.Button2Click(Sender: TObject);
var sw: TStreamWriter;
    tmpName, source, command: string;
begin

 path := edtDirectory.Text;
 source := edtSource.Text;

 tmpName := TPath.Combine(path, source+'.rc');
 Preview.Picture.SaveToFile(TPath.Combine(path, source + '.bmp'));

 sw := TStreamWriter.Create(tmpName, False, TEncoding.UTF8);
 try
  sw.Write(edtClassName.Text + ' BITMAP "' + source + '.bmp"');
 finally
  sw.Free;
 end;

 command := '/C brcc32 -fo"' + TPath.Combine(path, source) + '.dcr" "' + TPath.Combine(path, source) + '.rc"';
 ShellExecute(0, nil, PChar('cmd.exe'), PChar(command), nil, SW_HIDE);

end;

procedure TBitmapConverter.FormCreate(Sender: TObject);
begin
 edtDirectory.Text := TPath.GetDocumentsPath;
end;

RC ファイルは正しく作成できますが、DCR が作成されません。コマンドで何か間違ったことをしていますか?

これをグーグルで検索した後に追加しましたPChar()が、StackOverflow でヒントを見つけましたが、まだわかりません。

4

1 に答える 1

5

filename.rcコンポーネントのイメージを作成するときは、メモ帳を使用し、ファイルをデフォルトのエンコーディング ( UTF8 ではなくANSI ) で保存します。UTF8 を使用しているため、次のように変更する必要があります。

sw := TStreamWriter.Create(tmpName, False, TEncoding.UTF8);

これとともに:

sw := TStreamWriter.Create(tmpName, False, TEncoding.ANSI);

ANSI エンコーディングを使用すると、プログラムが動作します。あなたのコマンドは正しいです。これらのパラメーターを使用して brcc32を実行cmd.exeして呼び出すと、UTF8 エンコーディングでエラーが発生することがわかります。代わりに、ANSI エンコーディングが完全に機能し、yout*.drcファイルをすぐに使用できるようになります。

hereに似たものを参照してください。これはc ++ビルダーに関するものですが、問題がUTF8エンコーディングに関連していることを示しています。

于 2017-08-01T11:31:57.060 に答える