Ага, в RTL от FPC на открытие текстовых файлов в Windows переменная FileMode всё таки влияет. 
Смотрим в rtl/win/sysfile.inc: 
- Код: Выделить всё
- procedure do_open(var f; p: pchar; flags: longint);
 {
 filerec and textrec have both handle and mode as the first items so
 they could use the same routine for opening/creating.
 when (flags and $100)   the file will be append
 when (flags and $1000)  the file will be truncate/rewritten
 when (flags and $10000) there is no check for close (needed for textfiles)
 }
 Const
 file_Share_Read   = $00000001;
 file_Share_Write  = $00000002;
 file_Share_Delete = $00000004;
 Var
 shflags, oflags, cd: longint;
 security: TSecurityAttributes;
 begin
 ...
 { convert filesharing }
 shflags:=0;
 if ((filemode and fmshareExclusive) = fmshareExclusive) then
 { no sharing }
 else
 if (filemode = fmShareCompat) or ((filemode and fmshareDenyWrite) = fmshareDenyWrite) then
 shflags := file_Share_Read
 else
 if ((filemode and fmshareDenyRead) = fmshareDenyRead) then
 shflags := file_Share_Write
 else
 if ((filemode and fmshareDenyNone) = fmshareDenyNone) then
 shflags :=
 {$ifdef WINCE}
 { WinCE does not know file_share_delete }
 file_Share_Read or file_Share_Write;
 {$else WINCE}
 fmShareDenyNoneFlags;
 {$endif WINCE}
 ...
 filerec(f).handle:=CreateFile(p,oflags,shflags,@security,cd,FILE_ATTRIBUTE_NORMAL,0);
 ...
 end;
 
Если посмотреть на *nix-овую реализацию do_open() (rtl/unix/sysfile.inc), то там зависимости от переменной FileMode не увидим.
И для полноты картины режимы открытия и битовые маски разделения доступа:
- Код: Выделить всё
- const
 fmOpenRead       = $0000;
 fmOpenWrite      = $0001;
 fmOpenReadWrite  = $0002;
 
 fmShareCompat    = $0000;
 fmShareExclusive = $0010;
 fmShareDenyWrite = $0020;
 fmShareDenyRead  = $0030;
 fmShareDenyNone  = $0040;
 
Варианты fmShareDeny* пришли из MS-DOS, подробнее: 
http://blogs.msdn.com/b/larryosterman/a ... 31263.aspx (en) или перевод: 
http://www.transl-gunsmoker.ru/2009/04/ ... write.html (ru). Ещё подробнее -- в руководстве по MS-DOS.
Добавлено спустя 12 минут 30 секунд:С учётом того, что атрибуты fmShareDeny* занимают старший полубайт, вот эта строчка:
- Код: Выделить всё
- if (filemode = fmShareCompat) or ((filemode and fmshareDenyWrite) = fmshareDenyWrite) then
 shflags := file_Share_Read
 
должна была бы выглядеть так:
- Код: Выделить всё
- if ((filemode and $f0) = fmShareCompat) or ((filemode and fmshareDenyWrite) = fmshareDenyWrite) then
 shflags := file_Share_Read
 
В этом случае при FileMode равном 2 файл будет открываться с разделением доступа на чтение (при этом собственно режим 2 -- fmOpenReadWrite в младшем полубайте при открытии текстового файла не используется, как и задумано).
А в существующем варианте нельзя задать fmShareCompat для открытия не в режиме чтения (не fmOpenRead).