{
MARCO MILTENBURG

> Currently I'm writing a Program which must be able to handle multitask
> evironments. But as I'm trying to Write a Record which is open in another
> Window (of DesqView for instance) than a runtime error 5 appears. Seems
> logical. But how do I 'lock' the Record, what are the attibutes, and what
> must the Program do if it can't open a Record???

      Locking isn't that difficult... First of all, do you have to keep the
File available For anybody else (in another task) or not. if not, use the
Filesharing bits when you're opening the File. They are :

bit 0-2   = 000 - read permission For your own appliction
            001 - Write permission For you own application
            010 - both read and Write permission For you own application

bit 3     = 0   - Always zero!

bit 4-6   = 000 - compatibilty mode. Share the File whenever possible.
            001 - reading and writing not allowed For other applications
            010 - writing not allowed For other applications (usefull when
                  you're gonna read the File, so others can not update it)
            011 - reading not allowed For other applications (usefull when
                  you're gonna update the File and others may not read it).
            100 - Full access For other applications (dangerous in my point of
                  view!).

bit 7     = 0   - Lower process owns File
            1   - File only For current process.

Set the bits to your needs and assign the value to FileMode before opening the
File. For example, I want to read a File which must be locked completly. Is
must use the value 00010000b which is $10. So use FileMode = $10 before opening
the File. Please note that FileMode only take affect on Files which are
declared as ': File' or ': File of ....'. It's not supported on ': Text' Files.
if you want to lock these Files, use the next method.

if you only want to lock a single Record of a File (or an entier File) you can
use the following Function :


Ooh BTW: This will only work With Dos 3.0+ (of course ;-) With SHARE loaded.
}

Function FileLocking(Action     : Byte;
                     Handle     : Word;
                     Start, end : LongInt) : Boolean;
Var
  Regs : Registers;
begin
  Regs.AH := $5C;
  Regs.AL := Action;
  Regs.BX := Handle;
  Regs.CX := Hi(Start);
  Regs.DX := Lo(Start);
  Regs.DI := Lo(end);
  Regs.SI := Hi(end);
  Intr($21, Regs);
  FileLocking := ((Regs.FLAGS and $01) = 0);
end;

{
Use For Action '0' to lock or '1' to unlock the File. The funtion returns True
when succesfull. The Handle Variable must contain the Filehandle, assigned by
Dos. For TextFiles you can obtain this handle With :

  TextRec(T).Handle

where T is the TextFile (declared With T : Text). I don't know how to obtain
the Filehandle of another FileType at the moment. I will have to look For it.
Start and end contain the starting and ending position (in Bytes) from what you
want to lock (for Typed Files, they can easaly be calculated using FilePos and
SizeOf(....Record) etc..). if you want to lock the entire File, use 0 For start
and $FFFFFFFF For end. Locking beyond the end of the File doesn't result in an
error!
}
