home *** CD-ROM | disk | FTP | other *** search
- {
- HELGE HELGESEN
-
- -> Currently I am writing the USERS File to a Temp File While im
- -> reading it (or atleast I try to), but pascal does not allow
- -> me to Write a full Record to a File.
-
- I suppose you're running a on a network, and that you have
- problems accessing the USERS File directly?
-
- First of all, do you open the File in shared mode, which is
- necessary if multiple Programs to access the File simultaneous.
-
- -> So could you tell me an easier way Write back the
- -> modifications that I have done. A little example would be
- -> Really cool..
-
- Sure... Here's a little example. Tested With PCBoard configured
- for use on network, With DESQview.
-
- if you'd relly try this you should reWrite the proc "ModifyRecord" first ;)
- }
-
- Program AccessUsersFile;
-
- Uses
- Dos;
-
- Type
- bdReal = Array [0..7] of Byte; { I'm not sure of this one... }
- bsReal = Array [0..3] of Byte; { have conversion routines For this one if you need }
-
- TUser = Record { declare user Record }
- Name : Array[ 1..25] of Char;
- City : Array [1..24] of Char;
- PassWord : Array [1..12] of Char;
- Phone : Array [1..2] of Array [1..13] of Char;
- LastDateOn : Array [1..6] of Char;
- LastTimeOn : Array [1..5] of Char;
- Expert : Char;
- Protocol : Char;
- SomeBitFlags : Byte;
- DateOfLastDirScan : Array [1..6] of Char;
- Level : Byte;
- TimesOn : Word;
- PageLen : Byte;
- FilesUploaded,
- FilesDownloaded : Word;
- DownloadToday : bdReal;
- Comment : Array [1..2] of Array [1..30] of Char;
- ElapsedOn : Word;
- RegExpDate : Array [1..6] of Char;
- ExpLevel : Byte;
- OldLastConfIn : Byte;
- ConfRegBitFlags,
- ExpRegBitFlags,
- UserSelBitFlags : Array [0..4] of Byte;
- TotBytesDown,
- TotBytesUp : bdReal;
- DeleteFlag : Char;
- LRP : Array [0..39] of bsReal; { last read Pointers }
- RecNoInUsersInf : LongInt;
- MoreBitFlags : Byte;
- RFU : Array [1..8] of Char;
- LastConfIn : Word;
- end;
-
- TIndex = Record { PCBNDX Files }
- RecNo : Word;
- Name : Array [1..25] of Char;
- end;
-
- Var
- UsersFile : File of TUser;
- PathToIndexes : String; { path to index Files, With 'PCBNDX.' added }
- Users : TUser; { global Record - users Record }
-
- Procedure OpenUsersFile;
- Var
- t : Text;
- s : String;
- x : Byte;
- begin
- s := GetEnv('PCBDAT');
- if length(s) = 0 then
- halt; { if I can't find PCBOARD.DAT I can't find USERS File either }
- assign(t, s); {$I+}
- reset(t); { open File, will terminate if any error }
- For x := 1 to 28 do
- readln(t, s);
- PathToIndexes := s + 'PCBNDX.';
- FileMode := 66;
- readln(t, s);
- assign(UsersFile, s);
- reset(UsersFile);
- close(t);
- end;
-
- Function FindUserRec: Word;
- { Searches thru index File For name. if not found, $FFFF is returned. }
- Var
- name : String;
- IndexFile : File of TIndex;
- x : Byte;
- Found : Boolean;
- Index : TIndex;
- begin
- Write('Enter name of user to modify: ');
- readln(name);
- FindUserRec := $ffff;
- x := length(name);
- name[0] := #25; { make 25 Char name }
- For x := x + 1 to 25 do
- name[x] := #32;
- For x := 1 to 25 do
- name[x] := UpCase(name[x]); { make upper Case }
- { since PCBoard v15.0 supports national Chars, you should do it too. If
- you need, I have something on this too... ;) }
- assign(IndexFile, PathToIndexes + name[1]);
- reset(IndexFile);
- Repeat
- read(IndexFile, Index); { read name }
- x := 1;
- While (x <= 25) and (name[x] = Index.Name[x]) do
- inc(x);
- Found := x = 26;
- Until eof(IndexFile) or Found;
- if Found then
- FindUserRec := Index.RecNo - 1;
- { Please note that I subtract 1 here. This is becase PCBoard was written in
- Basic (when the File format was made) and that Basic threats Record 1 as
- the first Record. In Pascal, Record 0 is the first Record! This may confuse
- a bit since some Files Within PCBoard are 1-based, and some are 0-based. }
- close(IndexFile);
- end;
-
- Procedure ModifyRecord;
- { Let's modify the Record... }
- Var
- x : Byte;
- begin
- Write('Users name: ');
- For x := 1 to 25 do
- Write(Users.Name[x]);
- Writeln; { For verification only... }
- Users.Protocol:='Z'; { let's make him use Zmodem }
- inc(Users.PassWord[1]); { and give him some headache }
- Users.PageLen := 0; { and make the screen go non-stop, when he gets on again... }
- end;
-
- Var
- x : Word;
- begin
- OpenUsersFile;
- x := FindUserRec;
- if x = $ffff then
- begin
- Writeln('Can''t locate user, sorry...');
- close(UsersFile);
- halt; { can't find user... }
- end;
- seek(UsersFile, x); { seek to the Record }
- read(UsersFile, Users); { and read the Record }
- seek(UsersFile, x); { seek back to the Record }
- ModifyRecord; { make some modificatios... }
- Write(UsersFile, Users); Writeln('Modifiations written back...');
- close(UsersFile);
- end.
-
-
-
- Var
- Cnames : File;
- PCBConf : PCBConfType; { your declaration }
-
- begin
- { And now we need to open it }
- assign(Cnames, 'CNAMES.@@@'); { I assume is't local }
- FileMode := 66; { open in shared mode }
- reset(Cnames, 1); { NB! Make RecSize = 1! }
-
- { Now, let's read the Record length. I assume X is an Word! }
- blockread(Cnames, x, sizeof(x));
-
- { And now it's time to seek to conference Y(also a Word). }
- seek(Cnames, 2 + y * x);
-
- { And read the Record. }
- blockread(Cnames, PCBConf, sizeof(PCBConf));
-
- { There. if you want to Write back some modifications, }
- seek(Cnames, 2 + x * y); { seek back to Record }
- blockWrite(Cnames, PCBConf, sizeof(PCBConf));
-