Wprowadzenie danych z pliku tekstowego do kolumny tabeli

0

Witam,

na początku przedstawię cel aplikacji: po wciśnięciu przycisku, dane z pliku tekstowego (które są w słupku) mają zostać wklejone w poszczególne komórki wyłącznie pierwszej kolumny tabeli (po za pierwszą komórką, gdyż tam znajduje się tytuł kolumny).

Ilość danych (linijek) w pliku .txt nie jest znana, zatem liczba wierszy tabeli na pewno będzie musiała być zmodyfikowana. Na formie umieściłam jeden Button oraz tabelę TStringGrid (5 kolumn, 5 wierszy):

procedure TForm1.Button1Click(Sender: TObject);
var plik : textfile;
     i : integer;
     j : integer;
     s : string;
     k : string;
     liczba : integer;

begin

  assignfile(plik, 'C:\Users\Magda\Desktop\megi.txt');
  reset(plik);

    liczba:=1;

  repeat
     begin
     Readln(plik, k);
     liczba:=liczba+1;
     end;
  until eof(plik);

  Form1.StringGrid1.RowCount := liczba;


  Form1.StringGrid1.Cells[0,0]:= 'Area';
  Form1.StringGrid1.Cells[1,0]:= 'Place';
  Form1.StringGrid1.Cells[2,0]:= 'District';
  Form1.StringGrid1.Cells[3,0]:= 'Street';
  Form1.StringGrid1.Cells[4,0]:= 'Price';

  repeat
     begin
     for j:=1 to liczba-1 do
         begin
         Readln(plik, s);
         Form1.StringGrid1.Cells[0,j]:= s;
         end;
     end;
  until eof(plik);

  closefile(plik);

end;

end.

Program kompiluje się, a po wciśnięciu przycisku, tabela się powiększa o ilość wierszy odpowiadającej ilościowi linijek z pliku tekstowego, ale niestety dane nie wczytują się do komórek. Jak wyrzucam pierwszą pętlę repeat, a wdrugiej modyfikuję linijkę

for j:=1 to liczba-1 do

na for j:=1 to Form1.StringGrid1.RowCount-1 do

 to dane się wczytują, ale wtedy musiałabym znać ilość wierszy, aby ich ilość nie była mniejsza niż liczba danych do wklejenia.

Czy jest jakaś metoda w stylu AddRow czy InsertRow aby można było jakoś to rozwiązać? Co w kodzie jest nie tak, że dane się nie wczytują?

Pozdrawiam i dziękuję z góry za pomoc:)
M.
1

cos takiego mozna uzyc do wczytania pliku tekstowego

var
  plik: TStringList;
begin
  plik := TStringList.Create;
  try
    plik.LoadFromFile('C:\Users\Magda\Desktop\megi.txt');
    // kod tutaj
    // plik.Count - ilosc wierszy
    // plik.Strings[5] - zawartosc szostego wiersza (string)
  finally
    plik.Free;
  end;
end;
2

Wystarczy tyle kodu:

procedure TForm1.Button1Click(Sender: TObject);
var
  slInput: TStrings;
begin
  slInput := TStringList.Create();
  try
    slInput.LoadFromFile('C:\Users\Magda\Desktop\megi.txt');
    StringGrid1.Cols[0].Assign(slInput);
  finally
    slInput.Free();
  end;
end;

W ten sposób wstawisz zawartość pliku do pierwszej kolumny, razem z komórką tytułową; Aby wstawić od drugiej komórki kolumny, możesz wykonać mały trik i do slInput[0] wstawić tytuł kolumny, przed przepisaniem zawartości listy do komponentu:

procedure TForm1.Button1Click(Sender: TObject);
var
  slInput: TStrings;
begin
  slInput := TStringList.Create();
  try
    slInput.LoadFromFile('C:\Users\Magda\Desktop\megi.txt');
    slInput.Insert(0, 'column title');
    StringGrid1.Cols[0].Assign(slInput);
  finally
    slInput.Free();
  end;
end;

A jeśli tak nie chcesz robić, bo trik Ci się nie spodobał, to przepisz zawartość listy do komponentu w pętli:

procedure TForm1.Button1Click(Sender: TObject);
var
  slInput: TStrings;
  intItemIdx: Integer;
begin
  slInput := TStringList.Create();
  try
    slInput.LoadFromFile('C:\Users\Magda\Desktop\megi.txt');

    for intItemIdx := 0 to slInput.Count - 1 do
      StringGrid1.Cells[0, intItemIdx + 1] := slInput[intItemIdx];
  finally
    slInput.Free();
  end;
end;

I też będzie gitara.

0

Baaardzo ładnie dziękuję :)

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