データベースに座標を保存するには?

解決


mutsu  2015-06-23 19:08:05  No: 47414

初めまして。
最近Delphiを始めた者です。

環境は
Delphi6
Windows7 です。

線を引いてデータベースに保存、データベースに保存したものを表示
というプログラムを作成中です。

データベースはAccessを使用しています(MBD)
Canvasプロパティを使用してImageコンポーネントに線を描いています。

当初は、Imageコンポーネントに線を描いて、画像(ビットマップイメージ)で保存し、保存した画像をDBImageコンポーネントに表示してデータベースにOLEオブジェクト型で保存していました。

他の方法も勉強してみようと思い、座標(始点と終点)をデータベースに保存して、Imageコンポーネントに線を描くということは可能なのかと考えるようになりました。

色々と調べてみたのですが、さっぱりわからず・・・。

そもそもデータベースに座標((X,Y)という形で)を保存できるのでしょうか?
もしできるのであれば、教えていただきたいです。

初心者で独学なので、言い回しが間違っているかもしれませんが、
ご教授の方、よろしくお願い致します。


take  2015-06-23 19:26:21  No: 47415

単純に考えると数値のフィールドを用意しておけば良いかと思います

| x1 | y1 | x2 | y2 | color |

線以外を扱う場合は
| style | x1 | y1 | x2 | y2 | color |

などで区別を

円とか円弧描こうとすると要素が増えるので
文字列フィールドにして

style=0,x1=100,y1=100,x2=200,y2=200,color=clBlack

こんな風にDXFみたいな書式構文を作るのも良いかもしれません


mutsu  2015-06-23 19:44:29  No: 47416

take様
早速の回答ありがとうございます。

X座標、Y座標(始点終点)ごとに数値フィールドを作って保存ということですかね・・・。
すいません、理解が乏しくて。
でもこれだと、一本の線の座標しか保存できない気がします。
複数の線を保存する際に文字列フィールドにして、ということでしょうか?

あと、すいません。
DXFの書式構文とはどういったものなんでしょうか・・・?

よろしければ引き続きご教授お願い致します。


おかぽん  2015-06-23 20:10:28  No: 47417

> でもこれだと、一本の線の座標しか保存できない気がします。
例えば、以下のようにして、複数行にしましょう。
| 図形No | 連番 | x1 | y1 | x2 | y2 | color |Width|

個人的には文字列で保存するのは、文字列解析がめんどくさいので
扱う図形の種類が少なければ、図形の図形毎にテーブルを分けてしまいたいです。


mutsu  2015-06-23 20:45:17  No: 47418

おかぽん様
回答の方、ありがとうございます。

自分で以下のように作ってみたのですがこういうことでしょうか?
|No.|Data_Name|startX|startY|endX|endY|

試しに値をいれてみました。(以下)
| 1 | sample  | 164  |  87  | 0  |  1 |

こうしても、一本分の始点と終点になる気が・・・。
あ、startX等の文字列フィールドに(X,Y)として保存すればいいのですか・・・?
今はX座標、Y座標とフィールドを分けてしまっているのですが・・・。

図形毎にテーブルを分けることができるのですか。
自分は今、始点,終点の値をDBEditに入れてデータベースに保存しているのですが、それが間違いでしょうか・・・?

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

※認証キーを忘れてしまったので新しくなってしまいました。


take  2015-06-23 23:11:50  No: 47419

|No.|Data_Name|startX|startY|endX|endY|
| 1 | Line1   | 164  |  87  |   0|   1|
| 1 | Line2   |   0  |   1  | 100| 100|

データベースですのでフィールド(横方向)を定義した後
レコード(縦方向)を追加していけば何本でも描けるかと思います
テーブルは1つです。

文字列の方はややこしくなりますので別の機会に


mutsu  2015-06-24 01:31:05  No: 47420

take様
データベースの例、ありがとうございます。

これで座標を保存した場合、№を元に呼び出す、ということでいいのでしょうか?

自分はデータベースに保存してあるデータを表示する際、DBLookupListBoxコンポーネントに、保存してあるData_Nameを表示し、
それをダブルクリックをしたらImageコンポーネントに線を描くという方法をとっています。

take様に例にあげていただいたデータベースを作成し、No.をDBLookupListBoxコンポーネントに表示しました。
一番上でダブルクリックをしたらLine1、上から二番目でダブルクリックをしたらLine2と、
一つずつImageコンポーネントに表示されてしまいます。
DBLookupListBoxコンポーネントに表示される№が一つで、それをダブルクリックしたら二本の線が引かれてほしいのですが・・・。

根本的に保存の仕方、表示の仕方が間違っているのでしょうか?
初心者で本当に申し訳ありません。
よろしくお願い致します。


take  2015-06-24 01:43:47  No: 47421

データベースがAccess形式と言うことは
ODBCかADOかなにかで操作しているのですかね?

基本の部分が多いので、ここで説明は控えますが

リストには、Noの「種類」分表示しておく
ダブルクリック?されたら、選択された行のNoは何なのかを取得

Noの値が一致するレコードを検索

選択位置を、検索結果の先頭へ

検索結果数分ループ

  レコードのデータに従い描画
  
  選択位置を次のレコードへ

ループの終わり

この処理をプログラムで書くことが出来れば
思い通りの動作になるかと思います。


mutsu  2015-06-24 02:00:19  No: 47422

take様
はい。ADOで操作しております。

初心者の自分でもやっと理解することができました。
ご丁寧にありがとうございます。

まだプログラムを書いてテストをしていませんが、とりあえず解決にさせていただきます。

ご教授頂きました おかぽん様、take様ありがとうございました。
やるべきことがやっと分かり、突破口が開けました。

また機会がありましたら、よろしくお願い致します。


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

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






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