アプリ版:「スタンプのみでお礼する」機能のリリースについて

Screen.Cursors[1] := LoadCursorFromFile('C:\Users\ユーザー名\Documents\自作ソフト\Test\自作.cur');
直接場所を指定すると、うまくいきます。

しかし、
strFileName := Application.Exename;
strFilePath := ExtractFilePath(strFileName);
//-------------------
s1:PAnsiChar;
//--------------------
s1:= PChar(strFilePath+'自作.cur');
Screen.Cursors[1] := LoadCursorFromFile(s1);
で、うまくいきません。

LoadCursorFromFile()内には、起動時のデフォルトのフォルダー名を使いたいのですが、どうしたらよいでしょうか?

A 回答 (2件)

何か勘違い、見落としはないでしょうか?



>直接場所を指定すると、うまくいきます。
それで動作するなら、何か条件が異なるということです。

>起動時のデフォルトのフォルダー名を使いたい
これがexeと同じフォルダ内に 自作.cur を置くという意味ならば、
以下のようにすれば動作しました。(Wr5さんと変わりありませんけど。)

procedure TForm1.Button1Click(Sender: TObject);
var
strFileName: String;
strFilePath: String;
s1: String;
begin
strFileName:=Application.Exename;
strFilePath:=ExtractFilePath(strFileName);

s1:=strFilePath+'自作.cur';
Screen.Cursors[1]:=LoadCursorFromFile(PChar(s1));

Screen.Cursor:=1;
end;


うまくいかない場合は「どのようにうまくいかないのか」を、エラーなら「エラーメッセージ」を添えてください。
コンパイルエラーもエラーダイアログも、その内容はCtrl+Cでコピーできます。

なお、
LoadCursorFromFile('C:\Users\ユーザー名\Documents\自作ソフト\Test\自作.cur');
このように文字列を定数として記述した場合はコンパイラが適切に解釈し、定義に従いPAnsiChar型の文字列としてコンパイルしてくれます。
String型の場合はPChar(s1)のように明示的にキャストを行わないといけません。
※PChar型はDelphi2007まではPAnsiChar型のエイリアス、Delphi2009以降はPWideChar型のエイリアスです。


PChar型の引数を渡す方法としては以下のようにも出来ますが、面倒かつ無駄な処理が増えるので、Delphiではほとんど使われません。

// PCharにメモリを割り当てて使用
procedure TForm1.Button2Click(Sender: TObject);
var
strFileName: String;
strFilePath: String;
s1: PChar;
begin
strFileName:=Application.Exename;
strFilePath:=ExtractFilePath(strFileName);

GetMem(s1,MAX_PATH+1); // メモリを割り当て
StrPLCopy(s1,strFilePath+'自作.cur',MAX_PATH); // メモリに書き込む
Screen.Cursors[1]:=LoadCursorFromFile(s1);
FreeMem(s1); // メモリを破棄

Screen.Cursor:=1;
end;

// PChar型と互換性のある、Char型の配列を使用
procedure TForm1.Button3Click(Sender: TObject);
var
strFileName: String;
strFilePath: String;
s1: array[0..MAX_PATH] of Char; // Char型の配列を用意
begin
strFileName:=Application.Exename;
strFilePath:=ExtractFilePath(strFileName);

StrPLCopy(s1,strFilePath+'自作.cur',MAX_PATH); // メモリに書き込む
Screen.Cursors[1]:=LoadCursorFromFile(s1);

Screen.Cursor:=1;
end;
    • good
    • 0
この回答へのお礼

はい、何かを勘違いしてたみたいです。
>s1: String;
>LoadCursorFromFile(PChar(s1));
で、うまくいきました。

ありがとうございます。

お礼日時:2013/04/10 22:31

Delphiはいまいちよく判っていませんけど……



s1:AnsiString;

strFileName := Application.Exename;
strFilePath := ExtractFilePath(strFileName);
s1:= strFilePath+'自作.cur';
Screen.Cursors[1] := LoadCursorFromFile(PAnsiChar(s1));

ではダメなんでしょうか?

>s1:= PChar(strFilePath+'自作.cur');

だと、strFilePath+'自作.cur'の一時バッファで使用したアドレスを返却するだけで、
その式が終わった後にその一時バッファの内容は保証されないんじゃないかと思われますが。
一時的にstring型のインスタンスが生成され、それにstrFilePath+'自作.cur'を代入して、その際に用意されたアドレスをPChar()で取り出し。
一通りの実行が終わったので一時的に作成されたインスタンスは破棄される。となるかと。

この回答への補足

ご回答ありがとうございます。
当方、AnsiString・PAnsiCharなんとか、理解できない程度でして。
関数は、LoadCursorFromfile(lpfileName: PAnsiChar)となっています。

ご指導を試しましたが、うまくいってません。

補足日時:2013/04/04 21:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!