Если все, что вы пытаетесь сделать, это перейти в самый конец своей таблицы и добавить одну строку со значениями из элементов управления 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;
Дайте мне знать, если я неправильно понимаю.
Это зависит от того, как другой процесс открыл файл ... Если он открыл файл исключительно, у вас ничего не получится.
И TextFile - это старая шляпа, я думаю, она откроется в эксклюзивном режиме, чтобы быть совместимой с DOS старого стиля. Вы должны использовать TFileStream или аналогичный.
TStringList также может работать, опять же, в зависимости от того, что делает другой процесс. Но если файл записывается (например, файл .log), fmShareDenyWrite не будет работать.
Если я правильно помню, есть также переменная Textfilemode, которая применяется только к текстовым файлам.
Это решит вашу проблему мгновенно. Загрузите файл, используя TStringList. Просто позвоните:
...
var sl: TStringList;
begin
sl := TStringList.create();
try
sl.loadFromFile(Filename);
...do your stuff here...
finally
freeAndNil(sl);
end;
end;
Я обнаружил, что при работе с текстовыми файлами лучше всего использовать TStringList. В противном случае я бы пошел на TFileStream, и там вы можете указать свой режим открытия.
Может быть так:
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;
Используйте метод 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
. Если вы хотите читать только отрывки, вы можете это сделать. Просто читай из потока.