Добрый день!
У меня есть тектстовый файл с табуляцией. Необходимо его считать и отобразить с нужного номера строки в StringGrid.
Делаю это следующим образом:
[syntax='Delphi']
unit ReadFileTab;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
OpenDialog: TOpenDialog;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i, LastRow, CommaPos,n, nomer,j: Integer;
FirstStr: string;
SList: TStringList;
j2, temp, max: integer;
Delimiter: String;
label A10;
begin
max := 0;
n:=0;
nomer:=0;
if not OpenDialog.Execute then Exit;
SList := TStringList.Create;
try
SList.LoadFromFile(OpenDialog.FileName); // открываем файл
StringGrid1.RowCount := SList.Count;
FirstStr := SList.Strings[75];
i := 0;
CommaPos := Pos(#9, FirstStr); // ищем табуляцию. Если находим, CommaPos>0
while CommaPos <> 0 do
begin
Delete(FirstStr, 1, CommaPos);
Inc(i);
CommaPos := Pos(#9, FirstStr); //рассчитываем количество колонок
end;
StringGrid1.ColCount := i + 1;
LastRow := StringGrid1.RowCount - 1;
for i := 0 to LastRow do
if (Pos('Сутки', SList.Strings)>0) or (n>0) then //ищем в файле номер строчки, с которой начнется запись в StringGrid
begin
n:=i;
if (n+i)>(2*LastRow) then GoTO A10; // если вышли за конец таблицы, заканчиваем цикл
With SList Do begin
Delimiter := #9; // оговариваем, что разделителем является табуляция
end ;
StringGrid1.Rows[nomer].DelimitedText:= SList.Strings; //представляем прочитанный файл в таблице StringGrid с учетом того, что разделителем являлась табуляция
nomer:=nomer+1;
A10:
end;
finally
SList.Free;
end;
StringGrid1.RowCount := nomer; // подгоняем количество строк в таблице под считанное количество, чтобы не было пустых строк в конце
// подгоняем ширину столбцов
for j2:=0 to (StringGrid1.RowCount-1) do
begin
temp := StringGrid1.canvas.textWidth(StringGrid1.cells[3, j2+1]);
if temp > max then
max := temp;
StringGrid1.colWidths[3] := max + StringGrid1.gridLineWidth + 1;
end;
end;
end.
[/syntax]
Все работает, только программа продолжает воспринимать разделитель как запятую, вместо табуляции. И поэтому название одной колонки формата "Вид, цвет" программа разбивает на две отдельных колонки. Отдельно "Вид" и отдельно "Цвет". Хотя табуляции между ними нет. Подскажите, пожалуйста, как указать, что разделителем в данном файле является исключительно знак табуляции и больше ничего.
Спасибо!
Delimiter и DelimitedText для текстовых файлов
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
может быть надо это не в переменную запихать, а в свойство?Delimiter := #9; // оговариваем, что разделителем является табуляция
см. TStrings.Delimiter

Да я вроде так и сделала...
With SList Do begin
Delimiter := #9; // оговариваем, что разделителем является табуляция
end ;
Или это не одно и то же?
With SList Do begin
Delimiter := #9; // оговариваем, что разделителем является табуляция
end ;
Или это не одно и то же?
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
а это что?
Проверьте сразу после присваивания, чему равно SList.Delimiter
И лучше переменную удалить, чтоб не путаться
И, кстати, в цикле это делать не надо. Один раз сначала присваиваете, потом уже строки добавляете
var
...
Delimiter: String;
Проверьте сразу после присваивания, чему равно SList.Delimiter
И лучше переменную удалить, чтоб не путаться

