喫茶XRAYトップページ

[スレッド全体
]

[12026] PAnsiCharをStrPCopy関数で使用返信 削除
2018/7/11 (水) 06:27:25 Mr.XRAY
Unicode 版の Delphi で PAnsiChar 型の文字列を StrPCopy 関数で使用する
場合は,次のように,uses に AnsiStrings を追加して明示的に AnsiStrings を
記述しみてください.

implementation

uses
  AnsiStrings;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  LPAnsiChar  : PAnsiChar;
begin
  LPAnsiChar := AllocMem(200);
  try
    AnsiStrings.StrPCopy(LPAnsiChar, '日本語 ABC 文字列');
    Memo1.Lines.Add(string(LPAnsiChar));
  finally
    FreeMem(LPAnsiChar);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  LAnsiString : AnsiString;
  LPAnsiChar  : PAnsiChar;
begin
  LAnsiString := '日本語 ABC 文字列';
  LPAnsiChar  := AllocMem(Length(LAnsiString) + 1);
  try
    AnsiStrings.StrPCopy(LPAnsiChar, LAnsiString);
    Memo1.Lines.Add(string(LPAnsiChar));
  finally
    FreeMem(LPAnsiChar);
  end;
end;



[12032] Re:PAnsiCharをStrPCopy関数で使用返信 削除
2018/7/11 (水) 11:58:59 Mr.XRAY
> AnsiStrings を追加して明示的に AnsiStrings を

Move 関数を使ってしまう手もあります.
Move 関数を使用する場合は uses に AnsiStrings は不要です.

※ Length(Ansi文字変数) はバイト数を返します.

procedure TForm1.Button3Click(Sender: TObject);
var
  LAnsiString : AnsiString;
  LPAnsiChar  : PAnsiChar;
begin
  LAnsiString := '日本語 ABC 文字列';
  LPAnsiChar  := AllocMem(Length(LAnsiString) + 1);
  try
    Move(LAnsiString[1], LPAnsiChar^, Length(LAnsiString));
    Memo1.Lines.Add(string(LPAnsiChar));
  finally
    FreeMem(LPAnsiChar);
  end;
end;


[12038] RS-232Cコンポーネント返信 削除
2018/7/12 (木) 06:23:43 Mr.XRAY
Delphi 6 から Delphi 10 に移行中で,RS-232C 用の CommX を Delphi 10 で
使用可能にするために「苦戦」(失礼 !) されているんですね.

私は RS-232C (COM ポート) の制御はやったことがないのですが,
unicode 版の Delphi で利用可能なコンポーネント類があったと思います.

あったとして,それを使用することになっても,苦戦した内容は今後役に立つと
思ってくださいませ (笑).

例えば
[ [Blog] Delphi / C++Builder RS232cコンポーネント MITライセンス配布版[JAPAN]]
https://ht-deko.com/delphiforum/?vasthtmlaction=viewtopic&t=1865.0

他にも探せばあると思いますが,私は調べていません.あしからず.
検討をお祈りしています.
時間があったら喫茶XRAY にもお立ち寄りくださいませ.
飲み物は自分持ちとなっております (^^)


[12040] Re:RS-232Cコンポーネント返信 削除
2018/7/12 (木) 08:03:17 SO
▼ Mr.XRAYさん

最近、某掲示板にてタイプライブラリのインポートで、
sapi.dllが見つからない??と書かれていたので、
確認のためにStarterインストールしたSOです。

Windows APIのAとWを自動的に切り替えているということは、
プロジェクトの設定にそこらへんの設定があるのではないでしょうか?
ぃゃまぁ、Starterインストールしたから、お家で見てみれば分かるんでしょうけど、
気になってしまいました。。。

# COM通信をするアプリでUnicodeが必要な場面がぱっと思い浮かびません(^^;A

[12041] Re2:RS-232Cコンポーネント返信 削除
2018/7/12 (木) 10:12:17 Mr.XRAY
> 最近、某掲示板にてタイプライブラリのインポートで、
> sapi.dllが見つからない??と書かれていたので、


あの方の場合,単にタイプライブラリの本体が dll ということを知らないだけですね.
インストールの画面の見方も知らないようです (というか知ろうとしていない).
当サイトの記事を見てやってみたということですが,記事通りにやっていないことも
明白ですし.
メールでの質問でも結構この手の質問あります.
「記事の説明通りにやったのにうまくいきません」
というやつです.実際は記事通りにやっていなんですよね.
で訊くと「〇〇は XX したんですが関係ありますか ?」
そういう問題ではないのですね.記事通りというから私は悩んでしまうのですよ.
質問してきた方がどんなコードを実行しているかなんて分かりません.
インターネットの向こう側は見えないのですよ.

> 確認のためにStarterインストールしたSOです。

この姿勢が大切だと思っています.コミュニティの場を質問の場ではなく,
情報源として利用するというか,
私もよくやっていました.
最近あまりやらなくなりました.だんだん気力が (笑)

> Windows APIのAとWを自動的に切り替えているということは、
> プロジェクトの設定にそこらへんの設定があるのではないでしょうか?


私の書き込みは正確ではないです.
そうなるように記述してあるだけですね.Windows.pas でしたっけ.
Delphi で提供していない DLL の関数を使用する時もそうすればいいのでしょうけど
当サイトの記事ではそうはしていないので,明示的に W が必要です.
(ほとんど全てのサンプルが Delphi XE 以降ですので A は不要 !!)
 
> # COM通信をするアプリでUnicodeが必要な場面がぱっと思い浮かびません(^^;A

COM 通信で Unicode が必要というわけではなく,Unicode 版の Delphi で
使用可能にするということではないでしょうか.
CommX は Ansi 版の Delphi で開発されていますから.
ん ? Unicode が必要な場合ってあるのかな ?


[12042] 管理者として実行返信 削除
2018/7/12 (木) 10:28:30 Mr.XRAY
> そういう問題ではないのですね.記事通りというから私は悩んでしまうのですよ.

これで一番印象というか記憶にあるのは今回もありましたが,
Delphi 6, 7 を Windows 7, Windows 10 にインストールするやつです.
「管理者権限」を理解してもらうのに苦労しました.
記憶に残っているのは二人です.
かなりのメールのやりとりで理解して頂き,無事インストールできたということです.
後の方々は分かりせん.
とにかく「自分は管理者権限」で実行していると主張する方がほとんどてした.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82