alanjbrown
asked on
How to Access fields by number in a record
I need to be access the fields in a record sequentialy and to find the field type.
type
STran = record
TranType :array[0..1] of char;
AccountRef :array[0..7] of char;
NomCode :array[0..7] of char;
DeptNo :integer;
TransDate :array[0..9] of char;
Net :currency;
:
:
end;
example in Psudo Code
for x:= 0 to STran.FIELDCOUNT -1 do
begin
case stTran.FIELDBYNUMBER[x].FI ELDTYPE of
String : // process the value of thid field as a string;
Currency ://
Integer : //
end; // end case
Any suggestion on how to achiev this.
Thanks in advance
Alan
type
STran = record
TranType :array[0..1] of char;
AccountRef :array[0..7] of char;
NomCode :array[0..7] of char;
DeptNo :integer;
TransDate :array[0..9] of char;
Net :currency;
:
:
end;
example in Psudo Code
for x:= 0 to STran.FIELDCOUNT -1 do
begin
case stTran.FIELDBYNUMBER[x].FI
String : // process the value of thid field as a string;
Currency ://
Integer : //
end; // end case
Any suggestion on how to achiev this.
Thanks in advance
Alan
ASKER
Are you able to give me a more specific example of how RTTI can be applied to my question?
are you willing to use a class instead of a record? I dont' want to waste my time if you do not ;)
you could access them with a function or 2 you define
but for every new type of record ... you would have to create new functions
or use variant
but for every new type of record ... you would have to create new functions
or use variant
type
STranFieldCount = 10;
function STranField(Rec: STran; Index: Integer): Variant;
begin
case Index of
0: Result := Rec.TranType;
1: Result := Rec.AccountRef;
2: Result := Rec.NomCode;
3: Result := Rec.DeptNo;
4: Result := Rec.TransDate;
5: Result := Rec.Net;
else
Result := Null;
end;
end;
for x := 0 to STranFieldCount-1 do
case VarType(STranField(STran, x)) of
varString: Memo1.Lines.Add(VarToStr(STranField(STran, x)));
varInt: Memo1.Lines.Add(VarToStr(STranField(STran, x)));
...
end;
ASKER
Ciuly, I would like to try using a class instead of a record but I don't know anything about classes at the moment so I am not sure if it will create other problems for me.
Geert, I don't want to have to change my functions when ever the record structure is changed.
Geert, I don't want to have to change my functions when ever the record structure is changed.
well, try to give us examples of how you are using the record. if you are using a file of type record, then class won't do since you cannot have file of type class. there are other such scnearios, but better to see whatever you are using it for ;)
ASKER
I am using files of type record. The purpose of the program is to read the file and convert the output, the conversion being based on the field types in the record. So it looks as if I won't be able to use classes. I have potentially a lot of different structures to work with, that is why I need a generic process rather than to create different functions for each record structure.
the let's go the other way around: what kind of processing do you need to do which is so generic that a function like geert suggests is too much? what are you trying to accomplish?
ASKER
Output as CSV the first record to have the field names from the record, then when each field is output it will converted into a formatted string depending upon the actual field type. For example a currency field would be output as '99,999.00' etc.
so you want to convert a binary file (with records) into a csv file?
ASKER
yes but I want to add some proccessing / formatting to certain field types.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Ciuly, thanks for the demo, it looks good although I won't be able to test it until this evening. I will get back to you later to award points etc.
I have an additional question regarding binary files which I will post as a new question.
I have an additional question regarding binary files which I will post as a new question.
ok
but you could, if you would use a class instead of a record and make those record member to be published properties in the class. you will use RTTI for this (start from here: http://delphi.about.com/od/oopindelphi/a/delphirtti.htm )