喫茶XRAYトップページ


[13130] Delphi 雑感返信 削除
2019/11/11 (月) 15:11:56 Mr.XRAY
ポインタ関係と TList の記事とサンプルをかなり修正変更しました.

もしかしたら C とか C++ の経験がないと実感てきないのかも知れませんが,
Delphi というのは実によくできています.
スゴイですわ.今更ですが.
業務アプリの開発に集中している時は気にもしなかったのですが.

気にもしなかった言えば,思い出したことがあります.
昔,ML だか Nifty のフォーラムで TOpenDialog の質問がありました.
Delphi 6 / 7 の時代の頃です.
レスした方が,
「ヘルプに書いてありますよ」
質問された方の反応
「私のヘルプには OpenDialog がないんですよ」

その後の経過は知りません.
当時はそういうことに興味が全くと言っていいほどありませんでしたから.


[13133] Re:Delphi 雑感返信 削除
2019/11/13 (水) 20:38:29 Mr.XRAY
▼ Mr.XRAYさん
> ポインタ関係と TList の記事とサンプルをかなり修正変更しました.

てなわけで更にいじりました.
ポインタと言えば TLIst のサンプルで使っているな.
リストと言えばコンポーネントのリストのサンプルがあったな.
コンポーネントと言えば,保存のサンプルがあったな.

という連鎖でいろいろ整備しました.
あと,多分画像の差し替えが 1 つで終わり,と思うのですが・・・


[13136] Re2:Delphi 雑感返信 削除
2019/11/14 (木) 22:30:07 Mr.XRAY
> という連鎖でいろいろ整備しました.


整備中に見つけたバグ

procedure TForm1.Button2Click(Sender: TObject);
begin
  //要素そのものがTPanelなのでキャストは不要
  FPanelList[1].Visible := False;

  if Assigned(FPanelList) then begin
    if FPanelList.Count > 2 then begin
      FPanelList.Delete(2);
    end;
  end;
end;

if Assigned(FPanelList) then begin

が意味ない.


> ジェネリックスの継承クラスを作成して・・・

できねぇよ.
最近報告のあったコンテキストメニューもそうですが,
こういうのがまだまだあるんだろろうな・・・


[13141] Re3:Delphi 雑感返信 削除
2019/11/16 (土) 16:49:39 Mr.XRAY
> 最近報告のあったコンテキストメニューもそうですが,
> こういうのがまだまだあるんだろろうな・・・


とにかく記事というか,サンプルというか増えすぎました.
最初はこななつもりではなかったんです.

今年は記憶では 5 月までは質問関係のメールが一通もありませんでした.
これで隠居か,と思ったら Windows XP の元号問題が.
こんなの私に関係ないだろうと思いつつもやってしまったバカな私ですが,
ポインタの記事で終わりにしたいです.

このポインタの記事,何度読み返してももやもや感というか,スッキリしないんです.


[13137] Re:Delphi 雑感返信 削除
2019/11/15 (金) 18:55:52 Mr.XRAY
▼ Mr.XRAYさん
> ポインタ関係と TList の記事とサンプルをかなり修正変更しました.

まだまだ続いています.

[ なんでポインタ演算ができないのよ(しくしく) ]
https://hp.vector.co.jp/authors/VA015850/delphi/tips/etc04.html

こういうことなのかな ?
よくわからんけど.
C のようにはいきませんね.ポインタを移動してから代入となるでしょう.

C の char がポインタ型だからと,Delphi で
   var
     P : ^Char;
とすると Char 型 (1 文字の文字型) のポインタ型の変数になってしまいます.


procedure TForm1.Button1Click(Sender: TObject);
var
  P : PChar;    // char *p 相当
  S : array[0..999] of Char;
begin
  StrCopy(S, 'Hello World');

  p := @S;
  Memo1.Lines.Add(P);

  P[5] := 'W';
  Inc(P, 5);
  Memo1.Lines.Add(P);
end;



[13138] Re2:Delphi 雑感返信 削除
2019/11/16 (土) 10:02:57 福士

[13139] Re3:Delphi 雑感返信 削除
2019/11/16 (土) 14:20:08 Mr.XRAY
▼ 福士さん
> {$POINTERMATH ON} でCっぽくできますね。
> http://docwiki.embarcadero.com/RADStudio/Rio/ja/Pointer_Math_%EF%BC%88Delphi%EF%BC%89


へぇー,こんなのがあるんですね.
知りませんでした.
PChar 型だとこんなことができるんですが.


procedure TForm1.Button1Click(Sender: TObject);
var
  LPChar : PChar;
begin
  Memo1.Lines.Clear;

  LPChar := '日本語テスト文字列';
  LPChar := LPChar + 6;

  Memo1.Lines.Add(LPChar);
end;



[13140] Re2:Delphi 雑感返信 削除
2019/11/16 (土) 14:30:59 Mr.XRAY
> C の char がポインタ型だからと,Delphi で

Delphi だと変数を宣言する時の変数の型の部分 (右側) で決まりますが,
C の場合は「型と変数名」で決まります.

char a       1 バイトの文字の変数
char b[10]   10 バイトの文字列の変数
char c[]      文字列の変数
char *d       ポインタ型の文字列の変数

文字列の最後は Null 終端文字でなければなりません.
ただし,文字列を代入する時にダブルクォーテーションを使用すると,自動的に
Null 終端文字を追加してくれます.
C++ には string 型という文字列の型があります.

PChar 型は Null 終端文字列のポインタ型です.つまり,上の
    char *d
と同じです.
char に P がついていますが,
Char (1 文字の変数型) のポインタ型ではありません.
が,PChar を Char (1 文字) のポインタという見方をすると,
文字列の先頭アドレス (1 文字目のアドレス) という見方もできなくはない ?
かも知れません.

また,変数をポインタ型の変数として使用する際,

  var
   LpValue : ^TAnyType;

のような使用方法はお勧めできません.ポインタ型を宣言して使用した方がいいでしょう.

type
  PAnyType = ^TAnyType;
var
  LpValue : PAnyType;


[13142] Re3:Delphi 雑感返信 削除
2019/11/16 (土) 23:11:09 Mr.XRAY
> PChar 型は Null 終端文字列のポインタ型です.つまり,上の
>     char *d
> と同じです.



まっ,その,あれです.以下のような記事だとこんなくどい説明なしに,
簡単に「素直な移植」で「ベタ移植」なんですけどね.

[ [Delphi] 構造体と文字列とポインタ ]
https://qiita.com/ht_deko/items/87aee1c7aee75aba90a2

char *str;

str: PChar;
となっているわけですから,素直に受け入れてもらいたいですね.

# 先に提示したページは Delphi 4 時代のものです.


INCM/CMT
Cyclamen v3.82