- ベストアンサー
ターボDelphi独自カーソルの設定
- ターボDelphiで独自のカーソルを設定する方法を解説します
- 起動時のデフォルトのフォルダー名を使用してLoadCursorFromFile内でカーソルファイルを指定する方法を教えてください
- 直接場所を指定するとカーソルの設定がうまくいくが、起動時のデフォルトのフォルダー名を使って指定するとうまくいかない問題について解決策を教えてください
- みんなの回答 (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;
その他の回答 (1)
- Wr5
- ベストアンサー率53% (2173/4061)
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)となっています。 ご指導を試しましたが、うまくいってません。
お礼
はい、何かを勘違いしてたみたいです。 >s1: String; >LoadCursorFromFile(PChar(s1)); で、うまくいきました。 ありがとうございます。