FireMonkey の立体をコードで書けますか?

解決


Patlice2011  2012-10-10 19:26:36  No: 43147

FireMonkey HD で新規作成します。
Form1 の下に Viewport3D1 を配置する。//<--①
Viewport3D1 の下に Dummy1 を配置する。//<--②
Dummy1 の下に Roundcube1 を配置する。//<--③
Roundcube1 については、
Position  //<--④
RotationAngle  //<--⑤
Scale  //<--⑥
も指定する。

通常ならマウスで、ツールパレット、オブジェクトインスペクタ から
コードを書かないでできますが、①から⑥までをコードを書いて
実現することはできますか。

詳しい方がいらっしゃいましたらご指導の程よろしくお願い致します。

使用環境
WIN7 Pro 64bit SP1
Delphi XE3


DEKO  2012-10-10 20:21:17  No: 43148

普通に Create するだけだと思います。
親子関係は Parent で。


patlice2011  2012-10-10 20:48:43  No: 43149

申し訳ありませんがコードを教えて頂けないでしょうか。
(コードが書かれているURLでも構いません)
お手数かけますがご指導の程よろしくお願い致します。


DEKO  2012-10-10 21:11:42  No: 43150

> 申し訳ありませんがコードを教えて頂けないでしょうか。
...少しは自分で調べましょうよ。これは質問じゃなくて "丸投げ" ですよ。

[旧Delphi FAQ - VCL(2)] 
http://support.embarcadero.com/article/37435

[旧Delphi FAQ - VCL(3)]
http://support.embarcadero.com/article/37436

[160_コンポーネントの実行時生成 - Mr.XRAY]
http://mrxray.on.coocan.jp/Delphi/plSamples/160_CreateComponent.htm

[コンポーネントを動的に生成する - Delphi Tips & Tricks (Asuyu Homepage)]
http://www.geocities.jp/asumaroyuumaro/program/tips/createcompo.html

[フォームにコンポーネントを配置するのに、設計時ではなく実行時に動的に 配置する事は出来るのでしょうか? - FDelphi FAQ (DelFusa Floor)]
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/faq/00117.htm


patlice2011  2012-10-12 07:30:59  No: 43151

下記の Delphi XE3 のサンプルコードに近いものがありました。
C:\Users\Public\Documents\RAD Studio\10.0\Samples\FireMonkey\Cubes
まずは、アニメーション等余計なものは削除して、
Cube だけを描画させます。
FireMonkey HD で新規作成し、Form に Viewpot3D を配置します。
Viewpot3D の下に、Dummy、Light、LightMaterialSourceを配置しました。
Viewpot3D をダブルクリックすると
procedure TForm1.Viewport3D1Click(Sender: TObject);
になってしまうので仕方なく Form をダブルクリックして以下のようにしました。

procedure TForm1.FormCreate(Sender: TObject);
const
  W = 10;
  H = 5;
  Z = 10;
  S = 1.2;
var
  I, J, K: Integer;
  Img: TControl3D;
begin
  BeginUpdate;
    for I := 1 to W do
      for J := 1 to H do
        for K := 1 to Z do
        begin
          Img := TCube.Create(nil);
          Img.Parent := Dummy1;
          TCube(Img).MaterialSource := Material1
          Img.SetSize(0.95, 0.95, 0.95);
          Img.Position.Point := Point3D(-W/2*S + I * S, 1 + H/2*S - J * S, K * S);
        end;
  EndUpdate;
end;
(エラーが出ます)

Viewpot3D の下の Dummy に
C:\Users\Public\Documents\RAD Studio\10.0\Samples\FireMonkey\Cubes の
Cube を描画させたいのですが、上記のコードをどう修正すれば
いいでしょうか。
詳しい方がいらっしゃいましたらご指導の程よろしくお願い致します。

使用環境
WIN7 Pro 64bit SP1
Delphi XE3


DEKO  2012-10-12 10:29:15  No: 43152

> (エラーが出ます) 
"どこで" / "何という" エラーが出るのか提示して下さい。
またもやエスパーしなくてはならないのでしょうかね。

> Viewpot3D の下に、Dummy、Light、LightMaterialSourceを配置しました。
> (中略)
> TCube(Img).MaterialSource := Material1
1.LightMaterialSource の "名前" は Material1 ですか?
  LightMaterialSource1 ではありませんか?[オブジェクトインスペクタ] で確認して下さい。
2.TCube(Img).MaterialSource := Material1 の後にセミコロンがないようですが?


Patlice2011  2012-10-12 18:18:59  No: 43153

procedure TForm1.FormCreate(Sender: TObject);
const
  W = 10;
  H = 5;
  Z = 10;
  S = 1.2;
var
  I, J, K: Integer;
  Img: TControl3D;
begin
  BeginUpdate;
    for I := 1 to W do
      for J := 1 to H do
        for K := 1 to Z do
        begin
          Img := TCube.Create(nil);//<--①
          Img.Parent := Dummy1;
          TCube(Img).MaterialSource := Material1//<--②
          Img.SetSize(0.95, 0.95, 0.95);
          Img.Position.Point := Point3D(-W/2*S + I * S, 1 + H/2*S - J * S, K * S);
        end;
  EndUpdate;
end;

>1.LightMaterialSource の "名前" は Material1 ですか?
>  LightMaterialSource1 ではありませんか?[オブジェクトインスペクタ] >で確認して下さい。
回:LightMaterialSource1 です。

>2.TCube(Img).MaterialSource := Material1 の後にセミコロンがないよう
>ですが?
回:すいません、セミコロンが抜けてました。
②の右辺をLightMaterialSource1; に修正しました。

①と②で赤下波線が出ます。
お手数かけますがご指導の程よろしくお願い致します。


DEKO  2012-10-13 04:37:08  No: 43154

>> "どこで" / "何という" エラーが出るのか提示して下さい。
> ①と②で赤下波線が出ます。
コンパイルして、その "エラーメッセージ" を書いてください。
赤い波線が出ている行だけ示されても答えようがないでしょう?

またまたエスパーしますが  uses に FMX.Objects3D が含まれていないだけではありませんか?
オリジナルのサンプルの uses 句と比較してみて下さい。

[プログラムとユニット(Delphi)- DocWiki]
http://docwiki.embarcadero.com/RADStudio/XE3/ja/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A8%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88

[FMX.Objects3D.TCube - DocWiki]
http://docwiki.embarcadero.com/Libraries/XE3/ja/FMX.Objects3D.TCube


Patlice2011  2012-10-13 06:26:24  No: 43155

uses節 に FMX.Objects3D を追加したらエラーが無くなり
意図するものができました。
DEKO さん ご指導ありがとうございました。

初心者には uses節 に手書きで追加する場合があると難易度が上がります。
どういうときに、uses節 に手書きで追加する必要がありますか。
また、この記述をするときは、uses節 にこの記述をする必要があるなど
どのように覚えればいいのでしょうか。
詳しい方がいらっしゃいましたらご指導の程よろしくお願い致します。
(コンパイラーが 「uses節 に FMX.Objects3D が記述されていません」って
メッセージを出してくれたら一目瞭然なんだけどなぁ!)


DEKO  2012-10-13 11:25:13  No: 43156

> 初心者には uses節 に手書きで追加する場合があると難易度が上がります。
> どういうときに、uses節 に手書きで追加する必要がありますか。
"初心者や素人は免罪符ではない"...とお決まりのセリフを吐きたいトコロですが、
確かに初心者だとこの概念が解りにくいのも事実です。

uses は C 言語だと #include に相当するのですが、
要は「あなたが使いたい機能が存在するユニットを自分で追加してね」って事です。

A, B, C...Z って機能の単位があったとして、最初は uses A, B, C; になってるとします。
D に存在する機能、D で定義されている関数やクラスは uses 句に追加しないと使うことができません。

最初から uses A, B, C, D...Z; って書いてやれば、D の機能や E の機能も使えますが、
使いもしない X, Y, Z の機能も含まれてしまい、実行ファイルは巨大なものになってしまいます。

> また、この記述をするときは、uses節 にこの記述をする必要があるなど
> どのように覚えればいいのでしょうか。
コンポーネントをフォームに貼った時は、
そのコンポーネントが定義されているユニットが uses 句に自動的に追加されます。

動的に作る場合にはそのコンポーネントが定義されているユニットを自分で uses 句に追加しなくてはなりません。
例えば先の TCube  なら、

[FMX.Objects3D.TCube - DocWiki]
http://docwiki.embarcadero.com/Libraries/XE3/ja/FMX.Objects3D.TCube

ユニットのトコロに "FMX.Objects3D" とありますから、
uses 句に FMX.Objects3D を追加してやればいい事になります。

>(コンパイラーが 「uses節 に FMX.Objects3D が記述されていません」って
> メッセージを出してくれたら一目瞭然なんだけどなぁ!)
ライブラリパスにある数百、数千のユニットをイチイチ検索しないといけませんし、
例えば TMyClass というのが同じ名前で複数のユニットに定義されていた場合はどうします?

ソースを書いているのはアナタなのですから、コンパイラにエスパーしろというのは酷な話ですよ。
でも、少なくともコンパイルしてやれば "Txxxxx なんて俺シラネ" と言ってくれるじゃないですか。

今回のような場合には [検索 | クラスの検索] で 
"TCube" と入力すれば、ユニットを教えてくれたと思いますが、
ソースコードに深刻なエラーがある場合には、固まったようになったり、
候補に出てこない事がありますので、ヘルプで探す方法も覚えておいた方がいいですよ。


Patlice2011  2012-10-13 18:50:53  No: 43157

>> 初心者には uses節 に手書きで追加する場合があると難易度が上がります。
>> どういうときに、uses節 に手書きで追加する必要がありますか。
>"初心者や素人は免罪符ではない"...とお決まりのセリフを吐きたいトコロですが、
>確かに初心者だとこの概念が解りにくいのも事実です。

>uses は C 言語だと #include に相当するのですが、
>要は「あなたが使いたい機能が存在するユニットを自分で追加してね」って>事です。

>A, B, C...Z って機能の単位があったとして、最初は uses A, B, C; になってるとします。
>D に存在する機能、D で定義されている関数やクラスは uses 句に追加しな>いと使うことができません。

>最初から uses A, B, C, D...Z; って書いてやれば、D の機能や E の機能も使えますが、
>使いもしない X, Y, Z の機能も含まれてしまい、実行ファイルは巨大なものになってしまいます。

C言語ですと、反射的に printf を使用するときは、#include<stdio.h> を
「手書き追加する」となるのですが、Delphi ですと Form にペタペタ
貼り付けて作るのでそのイメージが殆ど無い所為かそこまで頭がまわり
ませんね。
特に今回のような Form にペタペタ貼り付けて作らない場合は特に注意が
必要なのですね。
[検索 | クラスの検索]やヘルプで探す方法」も身につけなければ
いけませんね。
その辺が私はまだ身についていないようです。

DEKOさんすごくよくわかりました。
ご指導ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加