Wczytywanie do Stringgrid

0

Witam:) mam mały problemik. Próbuje wczytać plik do tablicy, wszystko by by było super ale gubi mi pierwszą kolumnę gdy wczytuję plik i nie wiem czemu?? Czy ktoś by mógł mi pomóc znaleźć błąd.

procedure TForm1.Button2Click(Sender: TObject);
Const Dane:array[1..5] of String=('Reg No','Chassis No','Manufacturer','Model','Type');
var
Plik: TextFile;
Bufor: string;
PozS, PozE: integer;
i : integer;
Kolumna: integer;
Wiersz: integer;
begin
for i:=Low(Dane) to High(Dane) do
begin
sgTab.Cells[i,0]:=Dane[i]; // Wpisz do Nagłówkowego wiersz zawartość tablicy
end;
with sgtab do
begin
AssignFile(Plik,'dane.txt');
Reset(Plik);
Wiersz:=1;
while not Eof(Plik) do
begin
ReadLn(Plik,Bufor);
if Wiersz>1 then
begin
PozS:=1;
Kolumna:=1;
while (PozS>0) and (PozS<Length(Bufor)) do
begin
PozE:=PosEx(',',Bufor,PozS+1);
if PozE=0 then
PozE:=Length(Bufor);
sgTab.Cells[Kolumna,Wiersz-1]:=Trim(MidStr(Bufor,PozS+1,PozE-PozS-1));
PozS:=PozE;
Kolumna:=Kolumna+1;
end;
end;
Wiersz:=Wiersz+1;
RowCount:=RowCount+1;
end;
CloseFile(Plik);
end;
end;

Dane w pliku wyglądają tak np:
00 D 9807,WDB78435903,mERCEDES,2039,Tractor Unit,

I w tym wypadku zgubi pierwsze zero.

Z góry dzięki za pomoc :-P

0

Sugeruję plik tekstowy trzymać w formacie CSV dzięki czemu będziesz mógł uzywać również excela do edycji pliku. Pliki CSV mają kolumny oddzielone średnikami, czyli:

#;Reg No;Chassis No;Manufacturer;Model;Type
#01;00 D 9807;WDB78435903;Mercedes;2039;Tractor Unit
#02;01 D 9808;WDB78435903;Mercedes;2039;Tractor Unit

Ładowanie do SG to tylko użyć TStringList

procedure TForm1.Button1Click(Sender: TObject);
var
  sRow, sCol :TStringList;
  iCol, iRow :Integer;
begin
  // Wczytaj cały plik
  sRow := TStringList.Create();
  sRow.LoadFromFile('D:\Baza.csv');

  // Ustal separator
  sCol := TStringList.Create();
  sCol.Delimiter := ';';
  sCol.StrictDelimiter := true; // ignoruj spacje jako separator

  // Oblicz ilość kolumn
  sCol.Clear();
  sCol.DelimitedText := sRow.Strings[0];

  // Ustal rozmiar siatki
  SG.RowCount := sRow.Count;
  SG.ColCount := sCol.Count;

  // Podziel i przypisz
  for iRow := 0 to sRow.Count-1 do
  begin
    sCol.Clear();
    sCol.DelimitedText := sRow.Strings[iRow];
    for iCol := 0 to sCol.Count-1 do
    begin
      SG.Cells[iCol, iRow] := sCol.Strings[iCol];
    end;
  end;
 sRow.Free();
 sCol.Free();
end;
0

Od Delphi 07 nie ma czegos takiego jak StrictDelimiter, zgłasza mi bład sprawdziłem w necie i pisza ze niestety nie ma StrictDelimiter w nowszych wersjach Delphi.

0

Ciekawe bo ja w D7, D2005, 2006 i 2007 używałem

0

Beher, jeżeli jeszcze chcesz wczytywać "ręcznie" dane do SGTab to może w ten sposób. Tutaj nie ucina początkowego znaku.

procedure TForm1.Button1Click(Sender: TObject);
Const Dane:array[1..5] of String=('Reg No','Chassis No','Manufacturer','Model','Type');
var
  Plik: TextFile;
  Bufor: string;
//  PozS, PozE: integer;
  i : integer;
  Kolumna: integer;
  Wiersz: integer;
begin
for i:=Low(Dane) to High(Dane) do
  begin
    sgTab.Cells[i,0]:=Dane[i];    // Wpisz do Nagłówkowego wiersz zawartość tablicy
end;
  with sgtab do
     begin
      AssignFile(Plik,'dane.txt');
      Reset(Plik);
      Wiersz:=1; Kolumna:=1;
      ReadLn(Plik,Bufor);        // odczyt "nieużytecznego" wiersza (if Wiersz>1 then)
      while not Eof(Plik) do
      begin
        ReadLn(Plik,Bufor);
        While Pos(',',Bufor)>0 do
          Begin
            sgTab.Cells[Kolumna,Wiersz]:=Copy(Bufor, 1, Pos(',',Bufor)-1);
            Delete(Bufor,1,Pos(',',Bufor));
            Inc(Kolumna);
          End;
        Kolumna:=1;
        Inc(Wiersz);
        RowCount:=RowCount+1;
      end;
      CloseFile(Plik);
    end;
end;

Osobiście jestem za propozycją z CSV'em.

Pozdrawiam,
ME

1 użytkowników online, w tym zalogowanych: 0, gości: 1