Delphi - Ошибка совместного доступа, открывающая текстовый файл

Если все, что вы пытаетесь сделать, это перейти в самый конец своей таблицы и добавить одну строку со значениями из элементов управления Form, вам вообще не нужен цикл for. Нечто подобное должно сделать это:

//Cells only contains references to cells with actual data
int rowCount = worksheet.Dimension.End.Row;
int colCount = worksheet.Dimension.End.Column;
var cells = worksheet.Cells;

var maxRow = cells
    .Select(c => c.Start.Row)
    .Max();

//Go to the next row after the max
maxRow++;
worksheet.Cells[maxRow, 1].Value = comboBox1.Text;
worksheet.Cells[maxRow, 2].Value = textBox1.Text;
worksheet.Cells[maxRow, 3].Value = textBox2.Text;
worksheet.Cells[maxRow, 4].Value = textBox3.Text;
worksheet.Cells[maxRow, 5].Value = textBox4.Text;
worksheet.Cells[maxRow, 6].Value = richTextBox1.Text;

Дайте мне знать, если я неправильно понимаю.

6
задан mghie 26 April 2009 в 11:52
поделиться

5 ответов

Это зависит от того, как другой процесс открыл файл ... Если он открыл файл исключительно, у вас ничего не получится.

И TextFile - это старая шляпа, я думаю, она откроется в эксклюзивном режиме, чтобы быть совместимой с DOS старого стиля. Вы должны использовать TFileStream или аналогичный.

TStringList также может работать, опять же, в зависимости от того, что делает другой процесс. Но если файл записывается (например, файл .log), fmShareDenyWrite не будет работать.

3
ответ дан 8 December 2019 в 13:02
поделиться

Если я правильно помню, есть также переменная Textfilemode, которая применяется только к текстовым файлам.

1
ответ дан 8 December 2019 в 13:02
поделиться

Это решит вашу проблему мгновенно. Загрузите файл, используя TStringList. Просто позвоните:

...
var sl: TStringList;
begin
  sl := TStringList.create();
  try
    sl.loadFromFile(Filename);
    ...do your stuff here...
  finally
    freeAndNil(sl);
  end;
end;

Я обнаружил, что при работе с текстовыми файлами лучше всего использовать TStringList. В противном случае я бы пошел на TFileStream, и там вы можете указать свой режим открытия.

1
ответ дан 8 December 2019 в 13:02
поделиться

Может быть так:

  vFileList := TStringList.Create;
  try
    vFileStream := TFileStream.Create('myfile.txt', fmOpenRead or fmShareDenyNone);
    try
      vFileList.LoadFromStream(vFileStream);
    finally
      vFileStream.Free;
    end;
    // Use vFileList
  finally
    vFileList.Free;
  end;
1
ответ дан 8 December 2019 в 13:02
поделиться

Используйте метод LoadFromStream для TStringList, а не LoadFromFile . Таким образом вы можете управлять блокировкой:

var
    slFile: TStrings;
    stream: TStream;
begin
   slFile := TStringList.Create;
   try
      stream := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);
      try 
         slFile.LoadFromStream(stream);
      finally
         stream.Free;
      end;

      //Use the stringlist
   finally
      slFile.Free;
   end;
end;

В этом примере поток используется для загрузки в TStringList . Если вы хотите читать только отрывки, вы можете это сделать. Просто читай из потока.

12
ответ дан 8 December 2019 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: