Sunday, October 20, 2019

Understanding and Using Record Data Types in Delphi

Understanding and Using Record Data Types in Delphi Sets are ok, arrays are great. Suppose we want to create three one-dimensional arrays for 50 members in our programming community. The first array is for names, the second for e-mails, and the third for number of uploads (components or applications) to our community. Each array (list) would have matching indexes and plenty of code to maintain all three lists in parallel. Of course, we could try with one three-dimensional array, but what about its type? We need string for names and e-mails, but an integer for the number of uploads. The way to work with such a data structure is to use Delphis record structure. TMember Record ... For example, the following declaration creates a record type called TMember, the one we could use in our case. Essentially, a record data structure can mix any of Delphis built-in types including any types you have created. Record types define fixed collections of items of different types. Each item, or field, is like a variable, consisting of a name and a type. TMember type contains three fields: a string value called Name (to hold the name of a member), a value of a string type called eMail (for one e-mail), and an integer (Cardinal) called Posts (to hold the number of submissions to our community). Once we have set up the record type, we can declare a variable to be of type TMember. TMember is now just as good variable type for variables as any of Delphis built-in types like String or Integer. Note: the TMember type declaration, does not allocate any memory for the Name, eMail, and Posts fields; To actually create an instance of TMember record we have to declare a variable of TMember type, as in the following code: Now, when we have a record, we use a dot to isolate the fields of DelphiGuide. Note: the above piece of code could be rewritten with the use of with keyword. We can now copy the values of DelphiGuide’s fields to AMember. Record Scope and Visibility Record type declared within the declaration of a form (implementation section), function, or procedure has a scope limited to the block in which it is declared. If the record is declared in the interface section of a unit it has a scope that includes any other units or programs that use the unit where the declaration occurs. An Array of Records Since TMember acts like any other Object Pascal type, we can declare an array of record variables: Note: Heres how to declare and initialize a constant array of records in Delphi. Records as Record Fields Since a record type is legitimate as any other Delphi type, we can have a field of a record be a record itself. For example, we could create ExpandedMember to keep track of what the member is submitting along with the member information. Filling out all the information needed for a single record is now somehow harder. More periods (dots) are required to access the fields of TExpandedMember. Record With Unknown Fields A record type can have a variant part (not to be confused with Variant type variable). Variant records are used, for example, when we want to create a record type that has fields for different kinds of data, but we know that we will never need to use all of the fields in a single record instance. To learn more about Variant parts in Records take a look at Delphis help files. The use of a variant record type is not type-safe and is not a recommended programming practice, particularly for beginners. However, variant records can be quite useful, if you ever find yourself in a situation to use them.

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.