AFsoft World

AF日記。 コンピュータ・CAD・漫画・アニメ・ゲーム・スポーツ等についてのたわいもない話、などなど。

プログラミング

AF3D_TEST

という訳で 今年も既に3月に入り
昨年末から作り始めてる3Dなテストプログラムの
現状報告ですw
まぁ、全然進んでませんが 中途半端ですが 取りあえず
AF3D_TEST
http://afsoft.jp/test/af3d_test.zip
基本的には、3Dモデルを 2Dドローソフトのように作れるアプリを目指しています。
メイン画面では面は半透明化して表示し、陰線処理・陰面処理はしてません。
断面=現在2Dビュー面での断面表示
投影=現在2Dビュー面への投影表示
投影+=現在2Dビュー面への+側部分の投影表示
投影−=現在2Dビュー面への+側部分の投影表示
赤色=X軸、緑色=Y軸、青色=Z軸、を想定しています。ダイヤルは表示軸の回転ではなく、現在表示ビュー画面での回転となります。(回転中心点はモデル中心原点)
3Dビュー画面では、点・線の表示は行いません。面のみです。Delphi FMX の 3D Shapeコンポーネントに点や線が無い、というのもありますが、最終的に STL・OBJ で出す際には面だけになりますからこれでもいいと思ってます。メイン画面で作図編集を行った内容はリアルタイムで反映されません。[更新]をクリックする必要があります。現在のオブジェクトを全部クリアしたあとに再生成してますが、データが多くなると遅くなりますのでどうしようかと考え中です。

作図時の右クリックはデータ端点の3D点を読み取り、左クリックはデータ端点をビュー面へ投影した点を取得、無ければ、目盛表示時は目盛点、目盛非表示時は任意点、となります。オフセット指示はビュー面でのX/Y/Z量ではなく、3D点に変換した後の実点でのX/Y/Z量となります。でないとおかしくなるので。

しかし・・・ラバーバンドとアンドゥ・リドゥがないと、作図出来ないなコレwww

面は、左回りで上方向が表面となります。

なんか上手く動かないなぁ〜と思ったら・・・

Delphi でプログラミングしてて
なんか うまく動かないなー???
と思ってたんだけど
んーー
再度チェックしてみると・・・

線を描いてるルーチン内で
 変換を掛けて線を描画
ってやってるのに(作ってる時は、その方が便利だろーとか思ってた)、変換してるのを忘れてて、変換を掛けてそのルーチンに飛ばしてた・・・
つまり
 2回変換を掛けて線を描画
みたいな事をしてた・・・

あーーー こりゃマトモに動く訳 無いわw


あと、逆行列の計算でガウスの消去法(掃き出し法)を使っていたけど、これもなんか変だなぁ?と思ってたら、ループのカウンタの変数が間違ってた・・・ というのも以前は、連立方程式の解を求めるために使っていて、横の数=縦の数+1 だったんだけど、逆行列を出す場合は、横の数=縦の数×2 になるので当然、ループカウンタに注意が必要だったんだ・・・

テストで計算結果を表示させて、う〜ん、おかしいな〜、なんでだろう?なんでだろう? とか思ってたけど、原因はソレだった・・・ そのルーチンを作ったのも20年位前の話だからすっかり忘れているってのもwww

しかし 動かす毎に挙動が変わる?みたいな怪動作は無くなったんだけれども、そもそも、なぜ、動かす毎に挙動が変わったのだろうか? ・・・ 謎だ・・・www

逆行列

ちょっとプログラムで逆行列を算出したい
どうやるんだっけ?
たすき掛け? 忘れたw
でも3次・4次だとどうするんだっけ? 忘れたw

そういえば補間のスプライン曲線を出すとき
確か、連立方程式を解くのに掃き出し法(ガウスの消去法)を
使ってたよなー あったあった これこれ
これ 逆行列を出すのも出来るかな?
値を入れてと・・・ あ、出た出たw これでいいやw


本日は今年のゴミ最終日
寝るのがヒジョーに遅かったため、起きれるかどうか?
というかなかなか眠れなかったんですが
なんとか無理矢理起きて、水やりのあと、ゴミ出し〜

缶の中の使用済油(※何度か使用した)を紙に吸わせて
捨てたんですが、その缶が結構汚れていたので
その缶の掃除に 1時間位 掛かってしまいましたw
取れない錆みたいなのはあるけど
うん、そこそこ綺麗になったかな?

開発(動作)環境は提示してほしい

アプリを公開する人には
開発環境を提示して欲しいと思います
(出来れば動作環境も、ですが、どうしてもという訳ではありません。動作環境だけ提示するってのもアリだと思います。)

私はエンバカデロ社の「Delphi」という開発環境を利用していますが、現在、
(PC-A)
・Delphi 11.2
・Delphi 10.4.2
(PC-B)
・Delphi XE4
・Delphi 7
の4種類が使える状態なのですが、最新である「11.2」だけを利用すれば良いのでしょうけれども、悲しいかな、出来ません。というのも、これで作成した Androidアプリは、所持している8インチタブレット(Android 6)では動作出来ないからです。そのため今でも「10.4.2」を利用しています。

Delphi 10〜で作成したプログラムは、基本的に Windows Vista以降対応となりますし、実行ファイルのファイルサイズもかなり大きくなってしまいます。そのため、対応OSは 2000/Xp以降〜で ファイルサイズを小さくしたい、という場合に Delphi 7 を利用する場合が多いです。

Delphi XE〜・10〜 では 作ったプログラムが動作出来るOSのバージョンが限定されてしまう為、結構難儀しています。Macはほとんど全く使わないため、さっぱり分かりませんw そういう意味で、今現在よく利用されている Android のバージョンはどれなのだろう? 最低限サポートすべきバージョンはどれなのだろう?と考えると実際問題、よく分からんとゆーかw 中古では未だに 4.4 のタブレットも売ってるしー

みたいな感じですが
スクリプト系の awk とか ruby とか
私は全く勉強してないんで全く分からないんですが、色々な種類・バージョンがあって、それによって微妙に違ってくる場合が多くて、動作する・動作しない、ってことがあると思います。
近い例として、awk ですが
これまでよく利用されてきた WILLs氏の「gawkm115」は非公開状態となって、現行、Bruce.氏の「gawk 3.1.5 for Windows」が利用される状態になるのでしょうけれども、やはり異なる部分があって、そのまま動作するスクリプトと、そのまま動作しないスクリプトが出てると思います。
ruby でも
Jw_cad 外部変形では 1.8系がよく利用されてきましたが、1.9.2 ではそのまま利用出来ない、って事がすぐに出てきましたし、Ver.2〜、Ver.3〜、と出てきて当然、仕様は変更追加されてるでしょうから、やっぱり、「ruby 2.2で作成しています」とかは書いて欲しいです。

ソフトウェア使用ライセンス

プログラミングを行う際、開発用ソフトウェアや開発環境等が OSに組み込まれていて、そのOSを利用している場合には実質的に無料で自由利用出来る、という場合があります。例えば
sun の「cc」、昔のMS-DOSの「masm」や「symdeb」等(「MASM」は後に別パッケージソフトとして有料化)
フリーウェアやGNU等で無料のソフトが提供されているのは今さら言うまでもありません。

で、ソフトウェアの規模が大きくなっていくと、○○を行うプログラム/ルーチン、△△を行うプログラム/ルーチン、と分割して作ってまとめたりするようになりますが、別途、目的別に開発され配布・販売されているモジュールプログラム=ミドルウェアを利用したくなる場合も出てきます。例えば、帳票用、画像処理用、等があり、プログラマーがそういうのが苦手だけれども必要だからという事でそういったミドルウェアを利用する場合も多くなっています。Delphi で言えばサードパーティ製のコンポーネントです。有料なものもあれば無料なものもあります。Delphi 内では「Indy」とか「TeeChart」とか「FastReport」とか最初から入ってますが、「FastRepot」の上位版は有料ソフトとして販売されてます。この上位版が欲しい開発者は、そのライセンス料を支払って入手し利用して自分のソフトウェアに組み込む訳ですが、その作成したソフトを利用する側は、その「FastReport上位版」の料金を別途支払う必要はありません。現行「ランタイムフリー」と明記されているからです。(そのソフトの料金内に含まれていると考える事もできます)
ミドルウェアのライセンスは、基本的に、
 ・開発者用ライセンス
 ・配布用(ランタイム)ライセンス
があります。
ソフトウェアによっては配布用ライセンスが有料のものもあります。
例えば、ニュートン社の場合です。
https://www.newtone.co.jp/license.html

例えばデータベース(DB)ソフトウェアを開発する際、Delphi開発者がデータベースエンジンに何を利用するのか?で考えないといけない事がいくつか発生します。
まず、PC単体でDBを使う場合(スタンドアロン)、昔であれば、Borland Paradox(BDE)を使ったり、Microsoft ACCESSを使ったり、したでしょうけれども今では、SQLite 等も利用できます。次に、C/S型DBの場合は、MS SQL Server や Oracle 等もありますが、Delphi開発者であれば、Interbase (IB) を利用するケースもあるでしょう。この場合、Delphi 内に IB用コンポーネントが標準搭載されていて便利だからというのもありますし、開発用の無料の Interbase Edition もあります。ですがその作成したアプリのユーザーは、Interbase Server とクライアント(端末PC)台数分のライセンスが必要となります。パフォーマンスは多少落ちると思いますがフリーの「Firebird」というものもあります。

こういった内容は、当然ながら、ソフトウェア開発者側は抑えた上で、ミドルウェアを使用する・しない、どんなミドルウェアを使用するか、その際のランタイムライセンスはどうなっているか、を把握した上で利用し、利用者にその旨を伝えます。例えば、別途費用が必要なのであれば、それを明示する、という感じです。そんなのは当たり前の話です。

従って、有料無料に関わらず、ソフトウェアを利用する場合、それそのものの費用と、付随するものの費用があるのなら、それが提示されているでしょうから、それに納得出来れば利用すれば良いし、納得出来なければ別のソフトウェアを利用すれば良いと思います。

そのソフトウェアや開発者や提示内容等が信用できなければ、そのソフトウェアを利用しない方が良いです。この日本はなんだかんだ「信用社会」で成立しているのですから。特に最近は、特殊詐欺というのがどんどん多くなっているようなので、注意するに越した事はありません。

Ruby 本を購入

Ruby の簡単な紹介本ってのは1冊持っているんですが、ま、暇な時にでも眺めようかな?というわけで、Ruby 本を1冊購入しました。

これ

う Amazon 超安いなw

これまた ボンビーなので 古本での購入です

今は新版がありますね


窓の位置・サイズ

Windowsアプリにおけるウインドウの位置制御は
フツーは、Windows任せ、開発環境任せ、ではなく
基本的に、アプリ任せです。

Windowsでの位置指定は通常、
1024×768 解像度の場合、ウインドウ左上の座標は
0,0 〜 1023,767 の範囲を取りますが
アプリが起動時に自分の位置を指定しない場合
Windows任せとなって、アプリを起動するたびに
位置が変わってしまう場合があります。
それではユーザーの意図に反する場合が多いので
一般的には、アプリ終了時に前回の位置・サイズを記憶し
次回起動時にはその位置・サイズで表示する、という事になります。

記憶場所は一般的に、.iniファイル(プロファイルファイル)、
レジストリ、専用のデータファイル、というのが多いです。
Jw_cad の場合はレジストリに記憶されます。

次に
マルチモニタを利用する場合、ですが、この場合
アプリでどのように対処するのか?は アプリ作成者が決めます。
1)プライマリモニタ(メインモニタ)に対する指定
2)特定モニタに対する指定
3)気にしない指定・全モニタを1枚のモニタと見なす指定
3の場合は、座標値にマイナスがつくこともありますし、かなり巨大な値になることもあります。Windowsのモニタのレイアウトに依ります。なのでメインが右側でサブが左側だとすると、サブのほうはX座標がマイナス値になります。その状態でアプリを動かし終了するとアプリのウインドウをサブ側に置いた場合、マイナス値の座標になります。そのあと、Windowsの設定でメインモニタを左側にすると、メインモニタもサブモニタもプラス値の座標になりますが、アプリを起動すると、前回位置=マイナス値の位置で表示され、画面には見えなくなる、という事になります。

ただし、アプリ側で、ウインドウ位置が
全モニタの座標範囲内に無い場合は、モニタ範囲内にせよ、
とプログラミングされている場合には
画面が表示されないって事にはならないです。
しかし
そんな判定・対処をしているアプリが
この世に一体どれだけあるのだろうか? というのは謎ですw

Delphi 10.3.3 FMX で OpenGL描画?

というわけで やってみようとしたけど論外状態でしたw
もう完全に忘れているんで
「Script!3D」のコードをコピペしようとしたんですが
FireMonkey(FMX)では、何それ?状態で蹴られまくりでしたw
従来同様な VCL では問題無くOK

FMXでも 何か特別なことをすれば可能になる、んかもしれないけど
(※Mac用・Android用でのOpenGLオーバーライドをしたい訳ではありません)
まぁいいか、普通に 3Dアプリにしろって事だろうな

ところで OpenGLで
カメラ(視点)移動って、それ単体で出来なかったっけ?
どうもうまく行かず結局、カメラ(視点)移動して描画して、って事をして思ったように?動きました。しかしやっぱり、100万点をグリグリ動かすってのはかなり無理があるようでしたw(まぁノートパソコンのマザーオンチップだから元より無理だわw)

今後のプログラミングは、FireMonkey(FMX) でやっていくとして
FMXで OpenGLを使うって事は出来ない様子だから
FMXの 3D関連のコンポーネントを使う以外に無い訳で
(或いは他社製コンポーネント?)
う〜ん・・・

AutoEnter

CubePDF 等で印刷〜PDF保存をする際、
出力先の画面が表示されて[変換]をクリック([Enter]キー)
しますが、連続で複数の印刷をする際
何度も[変換]をクリックするのが 超めんどくせぇ〜
という場合、
「AutoEnter」ってツールを事前に動かし[開始]しておけば
勝手に[Enter]キーを送信して
クリックする手間を省こう〜 って
たわいもないツール(フリーウェア)を作ってみたw

うちのサイトのフリーウェアコーナーでダウンロードして
ZIP解凍(展開)して、エクスプローラで exeファイルを右クリックし
プロパティで[ブロックの解除]をしてから使って下さい。
設定ファイルやレジストリは使いません
(前回値の記憶・呼び出しは行いません)

CubePDF で PDF保存先を事前に設定保存し
20220714a
そのフォルダ内は 空っぽにしてから
本ツールを動かしてください

でないと、ファイルを上書きしますか?のメッセージが
何度も出て これまた 超めんどくせぇ〜 となりますんで

なお、たまに「漏れ」が出ることがあるみたいで
その場合は、マウスで[変換]をクリックして下さい。


追記:
CubePDF 最新バージョン 2.0.2 (64bit版) を入れて試してみました。
本アプリを実行・開始してから連続印刷を行うと「漏れ」が出る確率が上がったような感じがします。それを防ぐには、アプリで連続印刷を行ったあと、画面に CubePDF画面がたくさん出た状態で、本アプリを実行・開始するのが確実性が高いと思われます。

Delphi での TModel3D が超ウザい件について 3rd.

というわけで Delphi 10.3.3 FireMonkey(FMX)にて
3D描画をさせるのに TModel3D コンポーネントを
使おうとしているんですがー

いや〜 やっぱり TModel3D は使えない、という事で終了かな

試しに、TMesh と TColorMaterialSource を 1000個ずつ
動的に生成して、ランダムな位置・ランダムな色で
四角面を作図するようにしてみましたが、ふつうに
描画出来ました

次に1万個 四角面を作図するようにしてみましたが
まぁ時間は掛かりますが、それなりに、描画出来ました

というわけで、結果、TModel3D は使いものにならない、
各コンポーネントを動的に生成して配置し描画する方が
遥かに高速だ、という結論となりました

Delphi での TModel3D が超ウザい件について 2nd.

というわけで Delphi 10.3.3 FireMonkey(FMX)にて
3D描画をさせるのに TModel3D コンポーネントを
使おうとしているんですがー

いや〜 なんかもうマジでウザいなーww

取りあえず軸は
   Z
   |
   |
  / \
 /   \
X     Y
って表示したいんだけどー

Model3D1.WrapMode := TMeshWrapMode.Fit;
Model3D1.RotationAngle.X := 270;
Model3D1.RotationAngle.Y := 0;
Model3D1.RotationAngle.Z := 0;
Model3D1.Scale.X := 1;
Model3D1.Scale.Y := 1;
Model3D1.Scale.Z := -1;
とやるんですがー う〜ん なんかおかしい動きするなー?
とか思ってたら やっぱり

Model3D1.Clear;
Model3D1.WrapMode := TMeshWrapMode.Original;
Model3D1.RotationAngle.X := 0;
Model3D1.RotationAngle.Y := 0;
Model3D1.RotationAngle.Z := 0;
Model3D1.Scale.X := 1;
Model3D1.Scale.Y := 1;
Model3D1.Scale.Z := 1;
Model3D1.LoadFromFile(〜〜);
みたいに初期化・ファイル読み込みをしてからでないと安定してくれなくて まいっちんぐ

なんかもう、よく分かりませんw


ちなみに、何がしたいのかというと
各コンポーネントを Create して画面上に配置していって3Dブツを描画する、のではなく、独自の面データ作成→DAEファイル作成→TModel3Dで読み込み→3Dブツを描画する、というようなことをしたいと思って作業をしています。
ファイルを仲介するのでその分、時間は掛かるだろうけど、まぁそれはそれで色々と便利で面白げなものが出来るんではないかと思っています。

DAEファイル=COLLADAファイルについては、ネットで検索すればすぐにドキュメントは見つかります。

昔、Delphi6 で「Script!3D」というツールを作っている時に DAEファイル出力を作ってましたのでそれを再利用しようとしましたが結構修正が色々あってドタバタwww


追記:
四角面を1000個描かせてみました
・・・カクカク
・・・
・・・えぇ? 1000個しかないのに、カクカク? ひでぇwww

四角面を10000個描かせてみました
・・・動かねぇ
・・・
・・・えぇ? たった1万個で動かない? 最悪www

LoadFromFile も遅いし、描画も遅い
安価なノートパソコンとはいえ、ここまで遅いとは・・・www


ダメですね、TModel3D 遅すぎて使い物にならないです
たぶん OpenGL で描かせた方が遥かに高速描画出来ると思います

TMeshを1万個Createして描画させた方が速いかもしれないですね

Delphi での TModel3D が超ウザい件についてw

というわけで Delphi 10.3.3 FireMonkey(FMX)にて
3D描画をさせるのに TModel3D コンポーネントを
使おうとしているんですがー

いちおー このコンポーネントは
ASE、OBJ、DAE(COLLADA)をサポートしてるらしいですが、うちの Script!3D で出力した DAEファイルを読み込もうとしても、線が出ないんですよね〜 どうも、面(Mesh?)にしか対応していないらしい
しかも、プロパティで「□TwoSide」にチェックを入れても、裏面が描画されない どーなってんねん?

さらに、デザイン時にファイルを開くことは出来るんだけど、実行時にファイルを開くことができない
 どーなってんねん?

もちろんヘルプには一切、記述無し
安定しとるなー
マジ 引くわー・・・



あちこち探して結局、サンプル見てようやく分かった・・・
uses節に
FMX.ASE.Importer
FMX.OBJ.Importer
FMX.DAE.Importer
を追加しなければならない

で、Model3D1.LoadFromFile(ファイル名) という感じ

えっと、これ、X/Y/Z軸 どーなってたんだっけ?w
忘れたw

TwoSideの件は
表裏ともに面を描くってのはダサいので止めるとして
結局
for i:=0 to Length(Model3D1.MeshCollection)-1 do
 if Model3D1.MeshCollection[i] is TMesh then
  TMesh(Model3D1.MeshCollection[i]).TwoSide := True;
とやることで
なんとか解決したよーです・・・

・・・疲れた・・・

たみくさw

先ほど、
アニメ「パリピ孔明」9話「たみくさのために」
を見ましたw

やはり、これ でしょうw

何のためにやるのか?

収入云々、生きていけるかどうか、色々あるけど

自分らしく 自分のやりたい事を 自分のため、そして
自分のコンテンツによって喜怒哀楽してくれる皆のため
自分の全てをこめ、全力を尽くす!

たみくさ、だね?www


う〜ん、感動だわこのアニメw めっちゃ面白いw

アーティストやクリエイターの基本、だよなw

結果なんかは、後で 付いてくるさ・・・たぶんw

所詮 夢物語かAFD w

今日、なんか オープンソースについてのクレーマーなコメントが付いてた

これは
オープンソースな 2D-ドローソフト「AFD」を公開した私に対する、嫌味なのか、クレームなのか、それとも、
無駄無駄無駄無駄無駄無駄無駄ぁぁあああ!
・・・やれやれだぜ!
ってのを言いたいのか

というわけで取りあえず、叩き台としての「AFD」を
出してみたけれども現在までに
オープンソースであるが故のコメント等は
一切ありませんw

やはり、オープンソース云々以前に、まず、
世間に普及していない事には、どーにもならん、
って事なんでしょうねww
まぁ、私のような マイナーな ただの1個人の
やれることなんて たかが知れてるから
仕方がない面も大きいかな。

元々が、私の中にある もやもや感を全部出して
すっきりしたかった、というのが大きな目的だったから
それはそこそこ叶ったので それで良しとしようw


で、「AFD」を作ってて思った事は
1)作った関数・手続き
 必要に応じてコピペ・作ったり付け足したり
 とかしていたので共通性があんまり無かったり
 やっぱりある程度、最初から、仕様・共通性を意識して
 作りこんでいかないといけなかったなぁ、と反省
2)ラバーバンド
 必要に応じて付けたし付けたしをしてたから
 あとになって見ると 訳が分からない事に…
 これもちゃんと最初から見越して
 管理しないといけなかったなぁ、と反省
3)端点・交点
 画面表示をする毎に計算しているけど
 これは仕方がないって思っているんだけど
 交点計算を行う対象データの絞り込みをもっとやって
 おくべきだったかな?と
 例えば、画面上で50ドット以上のものだけ計算対象、とか
 あと
 タブレットの場合、マウスが存在しないから
 今回のような想定検索ボックス表示が出来ないので
 結局、従来のような タッチ→検索→スナップ って
 ロジックが必要となり、現行の
   想定検索ボックス→クリック(スナップ)
 との辻褄合わせをどうするか? って辺り
4)線種
5)楕円の扱い
 今回、ほとんど何も考えてなかったけど。
 斜め軸対応?
6)複合曲線
7)ブロック図形
8)オブジェクト図形
9)外部参照
・・・
ネタが尽きないなぁw




ホームページでの「CADつくろ!」では、Delphi 6 Personal を使っているので、Delphi 6 が発売されたのは 2001年だそうですから、まぁ、その辺りの頃の話だと思います。時期から考えて、前の前の勤め先での奴隷状態だった頃ですねw
次の「CADを考える」は、平成23年からとありますから、2011年、11年前ですね

ブログで「俺は Delphi FMXでCADモドキが作れるのか?」ってのを始めたのが
http://blog.livedoor.jp/afsoft/archives/52118539.html
これ 2015年1月
しかし途中で何か限界を感じて投げ出してしまうww

再度、モチベーションを上げなおして
http://blog.livedoor.jp/afsoft/archives/52288905.html
っていうのをアップしてますが
これをしようと考えたのは 2020年1月
約2年半の結果が、現在の「AFD Ver.1.0.5」です。

先のパート先が赤字消滅して、さぁ、2020年。
何をしようかいな?
と思って開始したマイ・プロジェクトな訳でありますw

幸いにも、これとは別にプログラム開発の仕事が頂けて現在もかろうじて生きていますがw まぁそれも来年以降は全くの不明w 新しい仕事が頂けるか、貯金切り崩しか、新しいパート探しか、どうなるのかさっぱりわかりませんw


というわけで、私個人としては、「オープンソース」という事で
20年以上、ずっとウェブ上で続けている訳ですが
いやぁ
それにも関わらず、私のことを「反オープンソース連合」総帥 みたいな風に思って私を攻撃してくる人たちって、一体、何なんでしょうね?
たぶん、
叩きたい相手、どんどん叩いてやれ!って相手を見つけて
ひたすら
クレームしまくっているのでしょう。残念な人達です。

そんな時間があるんなら、オープンソース・プロジェクトを広げたいのなら、そういう活動をすればいいのに、と本気で思います。

疲れた・・・

というわけで昨晩から今日に掛けて結局、全く眠れず、
布団の中で体を休めていましたが耐えられずに
午前5時頃に起きて ネット確認して
頼まれ仕事を開始

当初のメールでの指示は、「AFJWV」と同じように
印刷できるプログラムを作ってくれ、との事でしたが
それだったら そんなに時間はかからないかな?
(流用できるだろうし)
などと思っていたら、やっぱり今回も後から
追加仕様、というか、全く別仕様に変更、ということを
やっちゃってくれまして・・・
Jw_cad と同じような画面・操作でできるようにしてくれ
とか・・・

全然 違うやんけ! マジか!?www

というわけで、早朝からひたすらプログラミング・・・
だんだん眠たくなるし、寝てないから頭も動かなくなってくるし
頭痛や耳鳴り
パソコン画面をずっと見てると目も痛くなるし肩も凝るw
う〜ん 精神的にも 肉体的にも 持たない

1日で出来るやろ〜などと軽く考えたのが大失敗でした。

さすがに昼食は取りましたが〜 いや〜
マジで 厳しかったw

午後3時過ぎに くたばった頭の休憩に
ちょい 株式チェックしたら おや〜
今日はそこそこ反発して 少しマシになってました。
でもまだまだ マイナス状態w
明日からどうせまた落ちるだろーしなーww
でも今日も急落してたら、ほんとヤバかったかも

とゆーわけで先ほど何とか形になったので
メールしました。14時間 ほぼ ぶっ続け。
死ぬわマジでw

SHIFT-JIS と Unicode

文字をコンピューターで扱う場合、コンピューターは基本、0 と 1 の世界→2進数→16進数、10進数、という事で文字も数値で表す必要はありますが、ASCIIコード表というものに従って ANK文字(A:アルファベット、N:数字、K:カナ)や記号文字は、0〜255 の数値として扱います。数値の前半は改行コード等のコントロールコード値があり、途中の部分には定義されていない部分があります。8bitパソコン等ではそこにグラフィック文字等が割り当てられていました。

昔はプログラムコード内に漢字等を入れる事は出来なかったのですが、グラフィック画面に漢字を描画する事は出来るパソコンも増えていきました。PUTKANJI命令でその際には JISコードで指定していました。

そのうち、プログラムコード内にも漢字等を使いたい、という事になりますが、JISコードは2バイトなので、第1バイト、第2バイト、と続けるにしても、通常の ASCIIコードと区別がつかなくなりますのでそのままでは扱えません。ですので、ASCIIコードで定義されていない部分に、コードをずらして、一緒くたに扱えるようにしましょう、と決められたのが、SHIFT-JIS です。

しかし、Windowsが流行し、いろんな国で、いろんな言語で使われるようになって、文字コードも拡張する必要性が出てきて、Windows2000辺りから Unicode というコード体系が言われるようになってきました。実際に実用されたのは WindowsXp からだとは思います。
Unicodeは、1文字のコードを最大21bit(最大3バイト)で表すようですが、プログラミング言語処理系の内部ではどのように扱うかはそのシステムに依るようです。テキストファイルとして扱う場合には、UTF-8、UTF-16 等に符号化されますが、文字によってバイト数が異なってきます。そのため、プログラミング言語で Unicode 文字を扱う場合は、バイト数で扱うのではなく、文字数で扱う事になっています。

これまでの SHIFT-JIS で扱うプログラミングでは、2バイト系文字の第1バイトがソレであるかどうかを確認し、ソレであれば次の文字を第2バイトとして扱う、という具合のプログラミングとなります。例えば、文字列の1文字1文字を表示するプログラムは
  i:=0
  while (i < Length(s)) do begin
   c := s[i];
   if (c が2バイト系文字の第1バイトの場合) then begin
    Inc(i);
    c := c + s[i];
   end;
   (文字 c を表示)
   Inc(i);
  end;
等のようになりますが、Unicodeで扱うプログラミングの場合、バイト単位で扱うのではなく、文字単位で扱う事になりますので、
  i:=0
  while (i < Length(s)) do begin
   c := s[i];
   (文字 c を表示)
   Inc(i);
  end;
のようになります。
簡単になるのですね。しかし文字を扱う部分全てにこの修正を行う必要があります。1からプログラミングする際には、楽になりますが、既存のプログラムを修正する場合は、結構な作業量が必要になります。

ファイル保存する場合には、UTF-8やUTF-16等に符号化を行ってから文字出力を行う必要があり、ファイルから開く場合は、逆符号化を行って文字入力を行う必要があります。プログラミング手法によっては、エンコード方式を指定するだけで良い場合もあります。

あと注意する点は、Unicode文字を扱うと、SHIFT-JISで使ったようなバイト数での半角か全角かの判別方法が使えません。文字比較をするって感じでしょうか。また、画面に表示する場合には、半角の横幅は全角の半分、というような処理も使えません。そもそも Windowsでは、文字1文字1文字の幅はそれぞれ異なる、という扱いをせねばなりません。日本語の文字以外の海外の文字も扱う事になりますから特にそうです。
ですので、日本国内製のCADで、文字横幅 半角:全角=1:2 として扱っているものは、Unicode対応をするのであれば、この手法を再度1から考え直しをして、実装せねばなりません。勿論、半角文字は半角、それ以外は全角、として従来手法で行くのもそれはそれで1つの手法です。

国内用途なのだからガラパゴス結構、とするか
時代はグローバル化、とするかは
開発者次第

N88BASIC・・・

「N88-BASIC」は、みなさん御存知
NEC から 1981年に発売された 8bit-PC「PC-8801」に
搭載された ROM内のシステムでありますw

その前作に名機「PC-8001」という8bit-PC があって
それに搭載されたのが「N-BASIC」でしたから
その PC-8801版BASIC だから「N88-BASIC」ですね。

PC-8801 の後に 5インチ 320KB-FDD が搭載された「PC-8801mk2」が登場し、その後、グラフィックとサウンドが強化された「PC-8801mk2SR」が登場します。フロッピーディスクを扱う為の命令セットが追加された「N88-DiskBASIC」(FD)が添付されています。そしてプログラミング中に日本語を扱えるようになった「N88-日本語DiskBASIC」は後続の「PC-8801mk2FR」「PC-8801mk2MR」から添付されています(FRは 320KB-FDD、MRは 1MB-FDD)。

で、PC-8801の兄貴分、というか、ビジネス用に使えるようなPC、という事で、16bit-PC「PC-9801」が1982年に登場します。ディスプレイとプリンタを一緒に買うと100万円位しました。これに搭載されたROM-BASICは「N88-BASIC(86)」となっています。N88-BASIC を 8086-CPU用に拡張されたもの、という感じでしょうか。その後、E/F/M という版が出て(F:320/640KB-FDD、M:1MB-FDD)、F/Mにはフロッピーディスクを扱う為の命令セットが追加された「N88-DiskBASIC(86)」(FD)が添付されます。その後、V30-CPUで高速化された VMシリーズ、80286-CPUで高速化された VX/UXシリーズ(UX:3.5インチFDD)辺りから実際にビジネスシーンでよく利用されるようになったと思います。

で、8bit-PC では、DiskBASICに代わるシステムとして、OS「CP/M」が登場します。この「CP/M」上で色々なプログラミング言語が使えるようになる、というもので、C言語、Fortran言語、COBOL言語、Pascal言語、等ありましたが、まぁ一部のマニアや大学のクラブ内での使用が主だったように思われます。16bit-PC では、8086用の「CP/M86」、680x0用の「CP/M68K」というものもあります。ただ、8086用として「MS-DOS」(「PC-DOS」)が登場し、これが流行する事になります。

で、PC-9801用の「MS-DOS」上で動作できる「N88-BASIC(86) (MS-DOS版)」(DOS版BASIC)が出ます。基本的にはインタープリタです。「コンパイラ」っていうのもありましたが、これはコンパイル=機械語化して高速化するものではなく、DOS版BASICのシステムに代わるランタイムライブラリを一緒に使用するもので、多少のコード化は行われますが、さほど速くはなりません。
その他、DOS上で動かせるBASICコンパイラシステムとして、Quick-BASIC や MS-BASIC、というものも出ました。コーズシステム設計から「BASIC/98」が登場しインタープリタ/コンパイラのシステムで中々良かったと思います。

で、Windows3.1が登場し、Windows95 が出ますが、NECは PC-9801/9821路線を撤退しPCソフト開発もしなくなりました。IBM PC/AT互換機的な PC-98NXシリーズを出して現在に至ります。WindowsでのBASIC環境としては、MS の Visual BASIC が席巻しています。コーズシステム設計が無くなり後を引き継いだ?電脳組が Windows用の「BASIC/98」(インタープリタのみ)を出しています。富士通の「F-BASIC」は既に開発終了となっているようです。


ちなみに私は DOS-BASIC+機械語を長らく使っていて、Windows3.1 が出て Visual BASIC V2を使っていたけれども、Delphi 1.0J を使うようになってそれにハマり、今に至りますw 前の前の仕事場で VBは 4,5,6 と使いましたけれども、Delphiで十分だっていう事で、終了しました。

ぶる〜〜〜とぅ〜す・・・

という訳で先日、Delphi 10.3.3 Cmt-Edt. にて
添付サンプルの BlueTooth のプログラム実行は出来たのですが
中を見ると Delphi の [System]内の TBluetooth コンポーネントを使っていませんでしたので、これだと使い難いし、正直何が何だか分からないのでw このコンポーネントを使って 訳分かんないヘルプとそのサンプルを見ながら 取りあえずテキトーに作っていたのですが、、、

いや〜〜 訳が分からないwww

相変わらずのクソヘルプ!(失礼〜)
Ctrl+C でコピーしろやマジで!!
概要だけかよ? 何の説明も無いやんけ!
等と叫びつつwww
サンプルを見比べつつ

何とか隣のPCと(Windows10同士)文字データのやり取りが出来ました。はぁ、しんどw まぁ、文字読み込みボタンを押さないと読み込まないので、逐次チェックをしないとチャットにはならないけれども、まぁ取りあえずいいや、という訳でw

・・・疲れたw

Delphi 10.3.3/Android で Imageにお絵描き

先日購入した ASUS Androidタブレットを
Delphi 10.3.3 Cmt-Edt. で使ってみようネタ

次に、画面にボタンとイメージコンポーネント(TImage) を貼り付けて、ボタンをクリックしたらイメージに絵を描くってケースです。

これまで Windowsでは

procedure TForm1.Button1Click(Sender: TObject);
begin
 Image1.Bitmap.Create(Round(Image1.Width),Round(Image1.Height));
 with Image1.Bitmap.Canvas do begin
  BeginScene;
  Clear($FF00FF00);
  EndScene;
 end;
end;

みたいな事を平然とやってて実際正常に動作するし、10.3.3 でも Windowsでは普通に正常動作するのですが、Android でビルド・配置・実行をすると、エラーします。IDE では「Segmentation fault (11) を送出しました」という実行時エラーが表示され、Android画面では、「アドレス〜でアクセス違反が発生しました」というエラーメッセージが多発します。ですのでこういうプログラミングをしてはいけません。これは

procedure TForm1.Button1Click(Sender: TObject);
var
 bm : TBitmap;
begin
 bm := TBitmap.Create(Round(Image1.Width),Round(Image1.Height));
 with bm.Canvas do begin
  BeginScene;
  Clear($FF00FF00);
  EndScene;
 end;
 Image1.Bitmap := bm;
 bm.Free;
end;

という風に書き換える必要があります。こうすれば Windowsでも Android でも正常動作させる事が出来ます。なお、ビットマップ生成時にサイズを指定しないと実行時エラーになります。Android(多分 iOSも)の場合は特に、画像はマルチレゾリューションなのが当たり前、という事でメモリ管理が厳しくなっているのではないかと想像します。
あと、
TImage の WrapMode にも要注意・・・ デフォルトの fit になっていると自動的に絵が拡大表示されてしまいますので・・・

いやぁ・・・これになかなか気づかず昨日はかなりの時間を消費してしまいましたww

Delphi 10.3.3/Android で 画面サイズ取得

先日購入した ASUS Androidタブレットを
Delphi 10.3.3 Cmt-Edt. で使ってみようネタ

取りあえず、画面サイズを見てみよう
という事で
スペック的には、1280×800 だそうなのだけど
フォームにパネル TPanel を Align=Client(全画面フィット)で貼って、Screen.Width、Screen.Height、Panel1.Width、Panel1.Height を表示させてみました。すると
縦置状態
Screen.Width   600
Screen.Height  913
Panel1.Width   601
Panel1.Height  889
横置状態
Screen.Width   961
Screen.Height  552
Panel1.Width   962
Panel1.Height  529
フォームの Qualityプロパティを HighQuality にしても同じ、ビューで Android 7インチ、Android 10インチ、等を追加しても同じ、という結果でした。はい、ダメですねw ビュー作ると、それ専用のフォームが出来てしまうので、意図的に全く異なる画面レイアウトをする場合はともかく、同じ画面レイアウトを PC でも スマホ/タブレットでも使おうという場合にはビューは無意味ですね。ビューを使う事によって本来の解像度でそのまま描画出来る、というのであれば、それはそれで利用価値があると思いましたが残念。

Delphi XE4 → 10.3.3

Delphi XE4 Pro-Edt. で作っていたプログラムを
Delphi 10.3.3 Cmt-Edt. へ持って行って多少の修正を
したあとビルド・実行するのは、Windowsでは非常に容易
なんだけれども(ユニットの問題や内部の問題は別として)
Android でビルド・配置・実行する際には要注意。
配置マネージャでファイル指定した場合、正常に
ファイル配置してくれない、とゆー事をやってくれて
それが中々分からずかなりの時間を食ってしまいました。

Delphi XE から Delphi 10 へプログラムを持っていく場合
Delphi 10 で空状態のプロジェクトを作って保存し、
各フォームのファイルをコピーして プロジェクトを作り直し
それからビルド・配置・実行をしないといけない様子です。

いやぁ・・・参りました・・・

10.4.2 や 11.0 については実行してませんので不明です。

あ、11.0 のパッチ1 は一応当てておきました。
使ってないけど。

Delphiで Android 7.0 アプリ開発…

という訳で、Android 7.0タブレットをお借りして
取りあえず以前 4.0.4 でちゃんと動いていた
当方の「AF_M7JW_VU」というビューワーを
この Android 7.0 タブレットでそのまま動作させようと
しましたが、、、いやぁ、、、ひどい、、、
画面はちゃんと表示されないし タッチ操作も出来ないし
何だこれは?って感じでした。

という訳で取りあえず
Delphi 10.3.3 Cmt-Edt. にて
フォーム上にパネルを設置し、それのマウスイベントハンドラでの反応を見てみようという単純なテストプログラムを作って、Android 7.0 タブレットで実行してみたのですが、、、、いやぁ、、、
・ホイールイベント
  ウンともスンとも動きません
  指2本での拡大縮小操作とか全く反応無し
   Touchプロパティを指定しても無意味
   Gestureマネージャ入れても無意味
  フォームのイベントハンドラでも同じく無反応
  タブレットの設定の、詳細設定の、ユーザー補助の、拡大操作をオンにしても無意味
・マウスエンターイベント
  Windowsでのマウスの場合はホバーでパネルに入った時に反応しますが、Androidタブレットはタッチにホバーとかありませんから、タッチした時にイベント発生します。
・マウスリーブイベント
  同上で、タブレットに押した指を離した時にイベント発生します。

・マウスダウンイベント
・マウスアップイベント
  タッチした時、離した時にイベント発生します。
  Button値は、左ボタン、Shift値は、左ボタン+タッチ
  座標は取っています。
・マウスムーブイベント
  タッチしながら指を動かした時にイベント発生します。
  Shift値は、左ボタン+タッチ
  座標は取っています。
  右ボタンってのはありません。
  Windowsタブレットの場合は、長押しで右クリックって事になりますが、そういうのは無いみたいです。勿論、中ボタンってのもありません。

という感じで、う〜ん、Windowsタブレットとは全然違うなぁと改めて認識しちゃうんですが、まぁ基本、タッチ操作なデバイスでは、タッチするか、してないか、だけなのだろうから、これはこれで当然なんだろうなぁという感じです。

如何に、ボタンを押しやすくするか
如何に、入力を減らすか
如何に、シンプルで分かり易い構成にするか
ってアタリなんでしょうかね?

突然終了w

Delphi 10.3.3 Cmt-Edt を使って
簡単なプログラムを作ってて
「TRectF」でエラーするから uses節で追加しないとー
これ、どこに入っていたっけ? と [F1] するも
効かない。何だこれ? と思ってヘルプのキーワードで
「TRectF」と入力しようとしたら、そこで
Delphi が しゅっと 終了したwww
何のエラーもメッセージもなく しゅっと 消えたwww

何じゃこりゃw

再度 Delphi を起動しても相変わらずヘルプで検索できないけど
今度は、キーワード検索は出来た。けれどもヒットしない。
仕方がないのでネットで検索したw
なんだ、System.Types か。
uses節に入力して、今度は、[F1] ヘルプがちゃんと動いた。
お〜い・・・

いやぁ単に FMX で StringGrid のセルに色を付けようと
DrawColumnCellイベントを書こうとしてただけなんですけど。
しかし、列が Integerではなく TColumn である所がなんか面倒臭い
(どんだけ面倒臭がりやねん・・・)

FMX にカラーダイアログが・・・

Delphi FMX でちょっと触っていて、ふと
気付いた事。

・・・ TColorDialog (色設定画面)が無いww

前にも思ったかもしれないけど
今日、再び、あれ?あれ?ない?ない?
みたいな状態w

まぁGetIt とかで入手出来るとは思うし
この程度は自作してしまえばおしまいだけど
微妙に 不便だw

Delphi 10.3.3 Cmt-Edt にて

作ったテストプログラムを
Android 用にコンパイルしてみよう〜と
コンパイルは出来るんだけれども、どうも
Android タブレット(借り物)で動作しない。
配置の際に、SDK が古い云々等のメッセージが出る。
SDK 等の問題なのだろうか? とヘルプ(Web)を見てたら
・・・
Android の対応バージョンは、5.1 以降らしい・・・
・・・
このAndroid タブレットは確か 4.1 だったと思うんだけど・・・
いや、4.0.4 だっけ?忘れた
借り物だからいじくる訳にも行かないし・・・

残念

RAD Studio、C++Builder、DelphiがサポートしているAndroidのバージョン
RAD Studio、C++Builder、Delphiがサポートしている iOSのバージョン

面積計算・・・

三角形の面積は
 昔 http://afsoft.jp/cad/p10_09.htmlで書いた一番単純な奴の
 底辺×高さ÷2、ヘロン
円の面積は 言わずと知れた
 πr2
扇形の面積は まぁ円を何等分するかって考えるだけだから
 πr2・(A/2π)  (A:中心角[rad])
弓型の面積(円弧と弦の直線で囲まれた部分)は
 中心角 180°未満は
 扇形から三角形面積を引けばいいだけ
 中心角180°以上は
 残りの円弧部分の三角形面積を足さないといけない訳か
楕円の面積は
 πab
 これは 円の面積を(b/a)倍しただけ
楕円弧の扇形の面積は
 楕円の面積と同じと考えれば
 πab・(A/2π)  (A:中心角[rad])
 で良い訳かー
多角形の面積は、多角形が自己交差していなければ
 |Σ((XnYn+1-Xn+1Yn)|/2
 (座標(Xn,Yn) n=1,2,3,…)
あと、よく分からん曲線に囲まれた範囲の面積は、積分して云々、ってのはプログラミングではしんどいから結局、近似値計算

長さとなると
2点間の長さは
 L=√((x2-x1)2+(y2-y1)2)
円の周長は
 2πr
円弧の長さは
 Ar (A:中心角[rad])
だけども、楕円の周長となると簡単には出せなくて結局近似値計算になる、と。短い線分の集まりとして計算すると 例えば 0.1°分割、0.01°分割、等としてもやっぱり粗い訳で、、、Jw_cad 等はどういう計算をしてるのかな?等と思ったり。楕円と線の交点計算等も含めて。

楕円・楕円弧の作図は、まぁ、WindowsGDIや、Direct2D等にそういう描画命令はあるんですが、なんだかんだ、それが使えないケースもあったりで線分近似(線分/ポリライン描画)をする場合もあると思いますけれど。

CADで面積計算となると、どうしても、島図形(部分抜き)ってのは入ってきて、まぁその分を引けばお終いなんだけど、外形線と島の線が重なったりしてないか、島と島が重なっていないか、等を考えないといけないと思いますので、それはそれで面倒臭そうw

未入力、無指定、未指定

CADに限らず、色々なソフトウェア・プログラムで
色々な指定値・入力値を指示する事があるけれど
「未入力」(無指定、未指定)の場合の扱い
というのが、種々様々にあるんだけれど
どうするのが「正解」(により近い)なんだろうか?
と思う事はありますね。

よくあるパターンとしては
1)0「ゼロ」
2)初期値(既定値=デフォルト値)
3)前回値
4)キャンセル(動作しない;再入力待ち)
5)未入力である場合の特別な処理
だろうけれども
そのソフトウェア・プログラムがどういう種類のものか?に依るかもしれないし、使う人の感覚(慣れ)によっても違ってくるかもしれない。
ソフトウェア・プログラムが、状況に応じて色々と異なってくるってのは、使う人も迷うかもしれないし、システムとして美しくないのでw、どれか1つに決め打ちしてプログラミングされるのが普通だと思われます。

「未入力」状態を作り出さない、というシステムにする場合もあります。何らかのコマンドに入ったら、取りあえず全入力項目に「0」や「初期値」や「前回値」を割り振ってしまう方法です。未入力の場合はこういう特別処理をしたい的な事をする場合は、そういうのは止めて、〜〜処理、〜〜処理、とモード指定をさせるのが、使う人にとっても分かり易いでしょう。しかし、その1操作が必要になります。操作数が多くなるのを嫌う人も居ますので、システムエンジニア・プログラマがどのように考え、どのように作り込んでいくのか?は結構、重要になってくるのかもしれません。

謎のデバイスw

先日から、Delphi で UDP通信だの TCP通信だの
モノを見ずに作ってみて・・・
こんなもん、モノと説明書が無ければ作れるかぁ!w
という事で
モノは送ってもらったんだけど、モノの説明書が送られてこない。

どーせー ちゅーねん!
みたいな感じで でもまぁ 実物とようやく対面し
1つずつコマンドの実行と確認。

うん、こんなもん、
実物が無ければ、絶対に、作れないわマジでw

コマンドのPDFマニュアルは最初に送ってもらったんだけど
そのマニュアルの不親切さ アバウトさ
もうね、勘弁しろしマジで!
みたいな感じだったんですけど
実際に動かしてみて、何とか癖みたいなのが分かってきて
取りあえず
動かすだけなら 何か 作れそうな気がしてきた
(YATかよ!w)
はぁ〜しんどww

TCP通信

という訳で、UDP通信のあとは、TCP通信です。

UDP通信で、自IP、相手IPを取れたので
相手を受け手として
自PCで IdTCPClientコンポーネントを貼り付け
ネットで公開されてるサンプルを利用させてもらい
あーでもない こーでもない等と考えながら
コーディング。
この段階では、動くかどうかなんて全く不明w

で、相手側用のダミーのプログラムを作る際
IdTCPClientコンポーネントでも、送信・受信、と
やってる訳だから、どうせ1対1だし、
受け手側も IdTCPClientコンポーネントで良いんじゃね?
とか思って コーディングしてたけれども
うん
ぜんぜん ダメだったwww

で、相手側=受け手側は、まぁ、サーバーになるんだから
IdTCPServerコンポーネントを貼り付けて
基本、受け身的なコーディングにして
メッセージ受信したら取りあえずそのまま
ACKコードを付けて送信するようにして
自PC側では、そのACKを受け付けて通信OK、
みたいな感じで まぁ 取りあえずこんなもんかな?

まぁ、相手側はPCではないデバイスだから
実際どうなるのかはさっぱり分からない
こんなもん、実機でテストしないと何も出来ないってばよ

例えば
昔の RS-232Cでプロッターつなげてプロッターで作図させる
って事を考えた場合に、ハンドシェークがうまく行くかどうか
思ったように作図するかどうか みたいな話
セントロでプリンターつなげてデータ垂れ流し、みたいな事が
出来る訳でもなく・・・

Delphi 10.3.3 CmtEd. で Indyで UDP通信・・・

Delphi 10.3.3 CmtEd. に最初から入っている Indy 10 の
UDPServerコンポーネントで UDP通信をしようと
しているんですが、う〜ん
もともと UDP通信って何?みたいな所もあるんだけどw
よく分かってない状態で使おうとしているのも悪いんだけど
取りあえず日本語マニュアルもヘルプも無いし
Indyサイトに行ってもドキュメントダウンロードできないし
で、どうすりゃいいんだ?状態で悶々としてますがw
(ネットで公開されてるサンプルも 古いバージョンの Indy で
 中身が全く違っていたりするから余計に混乱w)
取りあえず、ぶろーどきゃすと通信?でポート番号指定して
メッセージ送受信するのはいいとして、
相手方も同じポート番号で受信・送信するのはいいとして、
相手側が違うポート番号で送信してきた時に
どうすりゃいいんだ?
と。一旦、IdUDPServer1.Active := False; して回線切って
その別のポートにして再度回線接続してるつもりでも
全く反応してくれない・・・タイミングの問題なのか、
回線のオンオフが出来ていないのか、よく分からない。
結局
IdUDPServer1 ・・・ ポートX
IdUDPServer2 ・・・ ポートY
と2つ用意して同時に接続させるようにしてみました。
相手方(ダミー)も同じようにして
取りあえず動作はしたのですが、う〜ん、意味が分からない。
仕様なのかバグなのかも分からない。
そもそも、同じポートでないといけないって意味も分からない。
ではなぜ、「デフォルトポート」の指定があって
送信ポート番号の指定があるんだよ?
これは複数のポート番号を扱えるからという想定じゃないのかよ?
それに
昔の Delphi の古いUDPコンポーネントの場合、
ローカルポートとリモートポートがあって別々の番号を指定する、
みたいな話もあるから更に訳が分からない。

さて
それはおいといて、このUDPテストプログラムは、
別PCに入れてる相手方プログラム(ダミー)ではなくて
本当は全く別のデバイスが対象だったりするんだけど
そのデバイスで このテストプログラムが動作するかどうかは
やってみないと全く分かりませんw
手元にそのデバイスがあればいいんだけど
そのデバイス、150万円〜200万円くらいするらしいから
気軽に ちょっと買ってみるか〜 なんて事が出来ませんw

ちなみに
UDP接続をするのは取りあえず双方のIPアドレスのやり取りを
する必要があるらしいから、で、そのあとは TCP接続に移行
するっていう、いわば「御約束」らしい?事をするらしいけど
果たして!?w
Recent Comments