Saving PointF data in MSAccess

G

Guest

VS2003 using VB.Net

I want to be able to save drawing path data in a database.
If I store the Points array for each GraphicsPath I can then reproduce (in
this case) filled polygons at run time. The user will create the polygons
initially.
The number of points in the polygons will vary so I only want to save this
data in one field (rectangles would have been a lot easier).

The only way I can think of doing this is by saving the points as a string
in a Memo field; looping through all the points in the Array and using
GetValue to add the points to the string e.g.:
{x=369, y=89}{x=500, y=200}{x=700, y=300}

To retrieve the polygon at the next run time then seems a bit messy i.e. to
extract the points from the string and get them in the PointF format e.g.:
PointArray(intZoneCount).SetValue(New PointF(369, 89), 0) (would be the
first point)
I can see how this can be done and I'm sure it will work but can anyone
suggest a better way? or am I missing something blindingly obvious!

Thanks in advance.
 
G

Guest

How about using a binarywriter to write the values to a memorystream,
get the byte array from the stream and use the Convert.ToBase64String
method to turn it into a string?
 
G

Guest

Thanks Cor and Göran

I can see how the image data is converted into the Byte Array (and back)
from the code example. Which is very neat.
However, and this is the bit I'm struggling with, how do I save a
GraphicsPath to a MemoryStream?
Göran is suggesting using the BinaryWriter but how do I do that from a
PointF array?

The save and retrieve process to/from the database would therefore be:
SAVE
[GraphicsPath]->[BinaryWriter?]->[MemoryStream]->[Byte
Array]->[ToBase64String]
RETRIEVE
[FromBase64String]->[Byte
Array]->[MemoryStream]->[BinaryReader?]->[GraphicsPath]
 
G

Guest

The PointsF struct contains two float values; X and Y. Loop through the
array of PointFs and write each pair of values to the BinaryWriter.

To recreate the array you get two float values from the BinaryReader to
create each PointF struct.

As each float value is four bytes you can calculate the length of the
PointF array by taking the length of the byte array and divide by eight.


Keith said:
Thanks Cor and Göran

I can see how the image data is converted into the Byte Array (and back)
from the code example. Which is very neat.
However, and this is the bit I'm struggling with, how do I save a
GraphicsPath to a MemoryStream?
Göran is suggesting using the BinaryWriter but how do I do that from a
PointF array?

The save and retrieve process to/from the database would therefore be:
SAVE
[GraphicsPath]->[BinaryWriter?]->[MemoryStream]->[Byte
Array]->[ToBase64String]
RETRIEVE
[FromBase64String]->[Byte
Array]->[MemoryStream]->[BinaryReader?]->[GraphicsPath]





Cor Ligthert said:
 
G

Guest

I have now successfully saved and retrieved the PointF data using the
BinaryWriter and BinaryReader.

For anybody else that might be interested the read and write loops
respectively have ended up like this:
----------
For i = PointArray(intZoneCount).GetLowerBound(0) To
PointArray(intZoneCount).GetUpperBound(0)
pt = PointArray(intZoneCount).GetValue(i)
bt = pt.X
bw.Write(bt)
bt = pt.Y
bw.Write(bt)
Next

For i As Integer = 0 To intPts
intX = br.ReadSingle
intY = br.ReadSingle
PointArray(intZoneCount).SetValue(New PointF(intX, intY), i)
Next
---------------

Thanks to Göran and Cor for your help.

Regards..


Göran Andersson said:
The PointsF struct contains two float values; X and Y. Loop through the
array of PointFs and write each pair of values to the BinaryWriter.

To recreate the array you get two float values from the BinaryReader to
create each PointF struct.

As each float value is four bytes you can calculate the length of the
PointF array by taking the length of the byte array and divide by eight.


Keith said:
Thanks Cor and Göran

I can see how the image data is converted into the Byte Array (and back)
from the code example. Which is very neat.
However, and this is the bit I'm struggling with, how do I save a
GraphicsPath to a MemoryStream?
Göran is suggesting using the BinaryWriter but how do I do that from a
PointF array?

The save and retrieve process to/from the database would therefore be:
SAVE
[GraphicsPath]->[BinaryWriter?]->[MemoryStream]->[Byte
Array]->[ToBase64String]
RETRIEVE
[FromBase64String]->[Byte
Array]->[MemoryStream]->[BinaryReader?]->[GraphicsPath]





Cor Ligthert said:
Keith,

In addition to Goran.

http://www.vb-tips.com/default.aspx?ID=5ad37c7b-3732-4558-8dd7-e68d238952a5

I hope this helps,

Cor

"Keith G" <[email protected]> schreef in bericht
VS2003 using VB.Net

I want to be able to save drawing path data in a database.
If I store the Points array for each GraphicsPath I can then reproduce (in
this case) filled polygons at run time. The user will create the polygons
initially.
The number of points in the polygons will vary so I only want to save this
data in one field (rectangles would have been a lot easier).

The only way I can think of doing this is by saving the points as a string
in a Memo field; looping through all the points in the Array and using
GetValue to add the points to the string e.g.:
{x=369, y=89}{x=500, y=200}{x=700, y=300}

To retrieve the polygon at the next run time then seems a bit messy i.e.
to
extract the points from the string and get them in the PointF format e.g.:
PointArray(intZoneCount).SetValue(New PointF(369, 89), 0) (would be the
first point)
I can see how this can be done and I'm sure it will work but can anyone
suggest a better way? or am I missing something blindingly obvious!

Thanks in advance.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top