Thank you, however I'm aware I can use dynamic arrays but they do not work 
well under the applicatiln this dll will be loaded under (I tried before). 
Well, as I thought I'll need to write/read each element. Thanks.

----- Original Message ----- 
From: "Stephen Posey" <[EMAIL PROTECTED]>
To: "Delphi-Talk Discussion List" <[email protected]>
Sent: Monday, October 10, 2005 10:02 AM
Subject: Re: writing binary to file


> Richard R wrote:
>
>> Hello, I want to write a complex structure to a file. I am
>> wondering how I should go about it. I am new to this sort of
>> thing, and have found out just writing the pointer doesnt
>> work. Do i need to write out each element in the structure to
>> file or is there some way I can write the pointer so I can
>> also load it into the structure.
>
> In general you can't expect the value of a pointer written to a
> file to have any validity as a pointer if read back. If you're
> using linked or dynamic structures you need to recreate the
> pointers upon reading the associated values back.
>
>>   TObjArray = array[0..1] of Pointer;
>>   PObjArray = ^TObjArray;
>>
>>   TSelType =  (
>>     stNone,
>>     stVerts,
>>     stFaces,
>>     stEdges
>>   );
>>
>>   TIntegerArray = array[0..1] of Integer;
>>   PIntegerArray = ^TIntegerArray;
>>
>>   TSelData = record
>>     seltype: TSelType;
>>     case TSelType of
>>       stVerts: (vxsIdxArray: PIntegerArray;
>>                 nbrSelVxs: integer);
>>       stFaces: (faceIdxArray: PIntegerArray;
>>                 nbrSelFaces: integer);
>>       stEdges: (  edgeArray: PIntegerArray;
>>                        nbrSelEdges: integer );
>>   end;
>>
>>   TSelDataArray = array[0..1] of TSelData;
>>   PSelDataArray = ^TSelDataArray;
>>
>>   TSPEObjs = record
>>     nbrPEObjs: integer;
>>     peObjs: PObjArray;
>>     SelData: PSelDataArray;
>>   end;
>>   PEObjs = ^TSPEObjs;
>>
>
> Looking over all this, I'm guessing you're using the "array
> [0..1]" notation to allocate arbitrary numbers of these types?
>
> 32-bit Delphi has a somewhat more elegant syntax for working with
> dynamic arrays that may suit you better; they manintain the size
> of the array for you.
>
> Using these, you'd declare your types like this:
>
> -------------------->8 cut here 8<--------------------
>
>    TSelType =  (
>      stNone,
>      stVerts,
>      stFaces,
>      stEdges
>    );
>
>    TIntegerArray = array of Integer;
>
>    TSelData = record
>      seltype: TSelType;
>      case TSelType of
>        stVerts: (vxsIdxArray: TIntegerArray);
>        stFaces: (faceIdxArray: TIntegerArray);
>        stEdges: (edgeArray: TIntegerArray);
>    end;
>
>    TSelDataArray = array of TSelData;
>
>    TObjArray = array of Pointer;
>
>    TSPEObjs = record
>      nbrPEObjs: integer;
>      peObjs: TObjArray;
>      SelData: TSelDataArray;
>    end;
> -------------------->8 cut here 8<--------------------
>
> Now, when you start filling these arrays, you allocate space in
> them using the SetLength() routine, e.g.:
>
> var
>   MySelData : TSelData;
>
> begin
>   MySelData.selType := stEdges;
>   SetLength(MySelData.edgeArray, 100);
> ...
>
> You can grow or shrink the array using SetLength, previously
> stored values in the elements are preserved. You index the array
> using standard "[]" notation, and you don't have to disable range
> checking for it to work.
>
> Writing array values to a file is simply a matter of iterating
> the array, and you have access to the Low() and High() routines
> to determine the array's size:
>
> for i:=Low(MySelData.edgeArray) to High(MySelData.edgeArray) do
> begin
>   Write(MyFile, MySelData.edgeArray[i]);
> ...
>
>> You can see how complex this is. I'm thinking I need to write
>> a custom file type using writeinteger and so forth, or perhaps
>> there is a quicker way? BTW I just want to write the PEObjs to
>> file, which is what i'm working with. It works very well in my
>> program to control user selections on geometry.
>
> I think you're making it more complicated than it needs to be
> actually.
>
> Now, given what I've shown you, you'll still have to deal with
> writing whatever the Pointers in your instances of PObjArray
> point to.
>
> How do you know that?
>
> Stephen Posey
> [EMAIL PROTECTED]
> __________________________________________________
> Delphi-Talk mailing list -> [email protected]
> http://www.elists.org/mailman/listinfo/delphi-talk
> 
__________________________________________________
Delphi-Talk mailing list -> [email protected]
http://www.elists.org/mailman/listinfo/delphi-talk

Reply via email to