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()内には、起動時のデフォルトのフォルダー名を使いたいのですが、どうしたらよいでしょうか?
No.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;
はい、何かを勘違いしてたみたいです。
>s1: String;
>LoadCursorFromFile(PChar(s1));
で、うまくいきました。
ありがとうございます。
No.1
- 回答日時:
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)となっています。
ご指導を試しましたが、うまくいってません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- モニター・ディスプレイ 「.cur」のアイコン表示について 4 2023/03/04 10:21
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Visual Basic(VBA) 該当セルに行替えを含むデータを命令文に入れて、2行に表示したい。 5 2023/07/20 11:51
- Visual Basic(VBA) outlook マクロが終了しません。 1 2022/09/02 11:14
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Windows 10 パソコンの操作ができません。。。 4 2022/06/02 18:38
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
【C言語】再帰が時間がかかる...
-
マインスイーパ、自動解析プロ...
-
sil_rew_memのメモリアクセスに...
-
大容量のメモリ確保をスワップ...
-
C言語で、メモリを解放しないで...
-
ターボDelphi 独自カーソルの設定
-
メモリ不足
-
メモリのセグメント違反の解決...
-
メモリの解放の仕方
-
メモリの増加に関して
-
ファミコンって8ビットしかない...
-
エクセルのメモリ使用状況/Appl...
-
「memcpy」と「strcpy」について
-
VBAで2進数を返すプログラムの...
-
CImage::ReleaseDC()のエラーで...
-
C,C++プログラムの強制終了時の...
-
ExitProcessの関数コールについ...
-
GPUプログラミング時の表示用GPU
-
スーパーマリオのパワーアップ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
「ヒープサイズの設定」て何?
-
C言語における再帰呼び出しの...
-
エクセルVBA 大容量CSVファイル...
-
動的メモリとexit(C言語)
-
エクセルのメモリ使用状況/Appl...
-
メモリが不足しています(VBA)
-
ファイルマッピング関数で失敗
-
大容量のメモリ確保をスワップ...
-
メモリのセグメント違反の解決...
-
EXCEL-VBAにてADOのレコードセ...
-
メモリ不足
-
エクセル キャッシュメモリー...
-
【C言語】再帰が時間がかかる...
-
C#のOutOfMemoryException発生...
-
closeとメモリの開放について
-
バッチファイルでの実行EXEのメ...
-
メモリの解放について VB6 VBA
-
「memcpy」と「strcpy」について
おすすめ情報