AFsoft World

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

プログラミング

窓の位置・サイズ

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

IDEといえば

IDE(統合開発環境)といえば
思い出すのは、QuickBASIC かなぁ
これの初期版 1.0 は 1985年で この時には IDE は無かったらしいけど、2.0 からIDE が付いたらしい。私が初めて触ったのは、4.5 かな? 面白かったけど、NEC PC-98のハイレゾモードに対応していなかったからすぐに使わなくなりました。
QBといえば、QuickC というのもありましたね。私も少し使ったような記憶はありますがw ただ NEC PC-98でのC言語の勉強は、RUN/C→LatticeC→MS-C って移行してました。

EDLIN+SYMDEB+MASM は「IDE」とは言わないよな?w

MouCur

問い合わせがありましたので
過去記事から転載しておきます。

当方の「AFMouCur」「AFMouMenu」は
Windows7 以降、動作に異常が発生する場合が多いようです。

ですので申し訳ありませんが
この2ツールのダウンロード及びレジストは
お控え下さいますよう宜しくお願い致します。

「AFMouCur」の代わりとして
フリーウェア「MouCur」
http://afsoft.jp/test/moucur.zip
を用意しておりますので、そちらを御利用下さい。

よろしくお願い致します。

自動作図かぁ

建築フォーラムでのネタ〜
建築・建設・土木など私は全く分からないんで、躯体入力したら伏図自動作図とか全く分かんないですが、Jw_cad の外部変形だけで全部やるのはちょっと難しいかもしれないですね。というのも
Jw_cad の外部変形は
・曲線属性は線・ソリッドしか認識できない
・ブロック図形は取得出来ないし(直下にあるブロック図の名前と位置が分かるだけ)ブロック図形を作図する事も出来ない
という事で、なんか作図してて、それを範囲選択して図形認識させる際、曲線属性やブロックをその認識のキーワードとして使えない。だから、レイヤ・色・線種・線幅から同一図形である事を認識させるとか、丸や四角や多角形等で囲っておいてその中にあるかどうか等で認識させる、等になるのが普通かと思います。

どういう図を描いてたら、こういう図を自動で作図させる、
というエキスパートシステム(知識ベース)を組む事になると思いますが
それは、その知識なり経験なりが無いと作れないので
私にはそれが全く無いから私には無理ですけど
普段、そゆ仕事をしてる人だったら
作れるんじゃないかと思います。
まぁ、最初から完璧なものを1回で作り上げる、とかではなく、分かる事から1つずつ、作り上げていくっていう方が作りやすいとは思いますけれども。

「表」という文字で

建築フォーラムでのネタ〜
そのソフトがどういう処理をしてるのか知らんので、それについての詳細は分からんけれども・・・

フォルダ名の最後に「表」という文字を使って問題が出た、という件は、多分、フォルダ名の最後の文字が「¥」(実際は半角文字)かどうかを判定する際、単純に、ANSI文字列(ShiftJISコードの文字列)の一番最後の文字だけをピックアップして、それが「¥」(0x5C)かどうか、ってチェックをしてるんだろうと思います。
「表」という文字のShiftJISコードは 0x955C ですが、その漢字第2バイトが「¥」と同じ 0x5C なので、最後に「¥」があると御解釈してしまい、
フルパスファイル名=フォルダ名+「¥」+ファイル名
ですが、フォルダ名の最後に「¥」があるんだから「¥」を付けなくてもいい、と勘違いしてしまい、フルパスファイル名が「フォルダ名+ファイル名」(間に「¥」という文字は無い)となってしまって問題が発生しているのでしょう。

この問題は私もDOS時代に経験してて
・フォルダ名の最後には必ず「¥」を付ける、という事にする(フルパスファイル名=フォルダ名+ファイル名)
・フォルダ名の最後には必ず「¥」を付けない、という事にする(フルパスファイル名=フォルダ名+¥+ファイル名)
・文字列の最後の文字を検索する場合は、文字列の最初から文字の半角全角をチェックしていきつつ最後の文字を取得する、という関数を作って利用する
・Unicode文字列を使う
で対処する事が出来ると思われます。

というわけで「表」という文字はよく利用されるのでよく出てくる話ですけれども、当然、0xXX5C というコードの文字はそれ以外にも沢山あります。

意外に使えない? JavaScriptのFileAPI

HTML5+JavaScript を使って
Jw_cad の外部変形って 作れないかなぁ?
等と思って 少し 見てたんですが
外部変形は ファイル「JWC_TEMP.TXT」を開いて
どうこうする
ってプログラムになりますが
HTML5 の「FileAPI」ではファイルの読み書きが出来るらしい?
って事で少し見てたんですけど、どうも、
HTMLの画面でファイル選択画面を出してファイル選択、
又はファイルのドラッグ&ドロップをしないと
ファイルにはアクセスできない様子です。
直にファイル「JWC_TEMP.TXT」の中身を開けろ〜みたいな事は
無理みたいですね。
利用者が、ファイル選択画面を出して「JWC_TEMP.TXT」を選択して
という事をするんでしたら、出来ますけれども。
という事は
Jw_cad で外部変形を選択し実行
 → ブラウザ画面が出て、ファイル選択ボタンをクリック
  → ブラウザ画面でのファイル選択画面で
    「JWC_TEMP.TXT」を指定
   → ファイルを開いて 処理
みたいな感じで、2度手間3度手間が掛かってしまう様子です。
う〜ん
・・・
使えないなコレはw
・・・
もしすんなり出来たら面白いかなぁ?と思ったけれども
こりゃダメだな
残念

エイプリルフールネタ! jwwNren 後悔!

という訳で ざくっと
「jwwNren Ver.1.00」
(フリーウェア)
というツールを作って
当方サイトにアップロードしておきましたw


選択したファイルを Jw_cad 開き「/p」オプションで印刷させる、というだけの単純なツールです。バッチファイルと基本、変りありません。

印刷先は Windows設定の「通常のプリンター」となります。

Jw_cad でも基本機能として連続印刷の機能はありますが、まぁ、こういうのもアリかな?程度で気軽に作ったものですので(構想:数分 開発作業:3時間)興味のある方だけどうぞw

クレームは一切受け付けませんのでよろしくw
Recent Comments