Jak dodać wiersz w stringgrid od pierwszego

0

Mam taki problem mam tabele pierwszy wiersz nagłówek i drugi pusty wiersz, nie wiem czemu nie idzie ustawić samego nagłówka. Jak zacząć dodawać wiersze od tego pustego bo w moim kodzie zostaje pusty i leci kolejny.

procedure TSecondForm.StartButtonClick(Sender: TObject);
var
  string1, string2: string;
  row: integer;
begin
  string1 := Edit1.Text;
  string2 := Edit2.Text;

  row := StringGrid1.RowCount;
  StringGrid1.RowCount := row + 1;
  StringGrid1.Cells[0, row] := string1;
  StringGrid1.Cells[1, row] := string2;
end;
3

Każesz kontrolce dodać nowy wiersz dla nowych danych, to to robi. Nigdzie nie sprawdzasz czy ostatni wiersz jest pusty, a zawsze tworzysz nowy, więc się nie dziw, że pusty wiersz zostaje. 😉

Dodaj kod sprawdzający, czy ostatni wiersz jest pusty i jeśli tak, nie dodawaj nowego — dane wpisz do ostatniego. Albo po prostu nie twórz kontrolki z pustym wierszem — zostaw domyślnie tyle ile wynosi StringGrid.FixedRows. Rozwiązań jest wiele, ale pasowałoby najpierw wiedzieć jakie są założenia co do tej kontrolki.

1

nie wiem czemu nie idzie ustawić samego nagłówka.

Idzie ustawić.
Jeśli masz stringrida wyklikanego w IDE to wystarczy w Object Inspector ustawić rowcount=1 oraz fixedrows=1.
Albo z poziomu kodu, np. w konstruktorze formy :

  StringGrid1.rowcount:=1;
  StringGrid1.fixedrows:=1;

A potem możesz swoim kodem dodawać kolejne wiersze

0

No właśnie tak miałem i zwracał mi błąd

Jaki błąd ?
Coś robiłeś źle. Pokaż kod

0

Gdyby ten kod powodował błąd, to by oznaczało, że VCL jest totalnie schrzaniony, a taki nie jest.

No to jeszcze raz. Jeśli masz formularz wyklikany w designerze, to ustaw mu tylko tyle wierszy, ile wynosi FixedRows i wtedy będzie mógł spokojnie używać swojego zdarzenia kliknięcia w przycisk, bo to zawsze będzie dodawać wiersz na koniec kontrolki i do niego wpisywać dane z pól edycyjnych. Jeśli pojawi ci się błąd, to po pierwsze wklej do posta kawałek kodu, który go powoduje, a po drugie, wklej też treść błędu (albo zrzut okienka błędu), żebyśmy wiedzieli której linijki dotyczy i o co ogólnie chodzi.

0

Jutro wkleje błąd. Jak mam ustawione rowcount na 1 to nie działa jak zmienię na 2 to działa, fixedrows mam na 1. ogólnie inaczej to rozwiązałem wszystko działa ok tylko co dodam wiersz na końcu tworzy się pusty który potem jest nadpisywany.

var
  string1, string2: string;
  row: integer;
begin
  string1 := Edit1.Text;
  string2 := Edit2.Text;

  row := StringGrid1.RowCount-1;
  StringGrid1.RowCount := StringGrid1.RowCount + 1;
  StringGrid1.Cells[0, row] := string1;
  StringGrid1.Cells[1, row] := string2;
end;
1

Masz błąd w kodzie, powodujący że na końcu będziesz miał pusty wiersz .
Wyliczasz indeks ostatniego wiersza przed dodaniem nowego.

var
  string1, string2: string;
  row: integer;
begin
  string1 := Edit1.Text;
  string2 := Edit2.Text;

  /// row := StringGrid1.RowCount-1; /// < !!!! źle
 
  StringGrid1.RowCount := StringGrid1.RowCount + 1;

  row := StringGrid1.RowCount-1;    /// < !!!! dobrze 

  StringGrid1.Cells[0, row] := string1;
  StringGrid1.Cells[1, row] := string2;
end;
0

Zrobiłem to tak nie wiem czy poprawnie ale wszystko działa :) sprawdzam czy komórka z numerowaniem jest pusta jak tak to ją edytuję jak nie to dodaje następny wiersz.

var
row: Integer;
begin
row :=Form1.StringGrid1.RowCount;

if Form1.StringGrid1.Cells[0,1]='' then
row := row -1
else
Form1.StringGrid1.RowCount := row +1;

Form1.StringGrid1.Cells[0,row] := inttostr(row);
Form1.StringGrid1.Cells[1,row] := Edit2.Text;
Form1.StringGrid1.Cells[2,row] := Edit3.Text;
Form1.StringGrid1.Cells[3,row] := ComboBox2.Text;
Form1.StringGrid1.Cells[4,row] := ComboBox3.Text;
Form1.StringGrid1.Cells[5,row] := ComboBox1.Text;
Form1.StringGrid1.Cells[6,row] := Memo1.Text;
Form1.StringGrid1.Cells[7,row] := Edit4.Text;
Form1.StringGrid1.Cells[8,row] := Edit5.Text;

end;
0

@stygienkom
Napisz jasno co chcesz osiągnąć.
Czy chcesz wypełniać stringrida treścią od zerowego wiersza, czy chcesz mieć w zerowym wierszu nagłówek a treść w kolejnych wierszach?

0

Tak jak teraz kod napisałem to mi wszystko działa w zerowym wierszu mam nagłówek a potem dodaje kolejne wiersze nie wiem tylko czemu nie mogłem ustawić:

StringGrid1.RowCount := 1;
StringGrid1.FixedRows :=1;

Muszę mieć:

StringGrid1.RowCount := 2;
StringGrid1.FixedRows :=1;

zwracał błąd

fixed row count must be less than row count
0

@stygienkom
Jeśli ustawisz StringGrid1.RowCount := 1 to Twój kod nie działa poprawnie ponieważ Form1.StringGrid1.Cells[0,1]='' ZAWSZE będzie true i tym samym nie dopisze się kolejny wiersz.
W sumie to powinien być wyjątek, ponieważ odwołujesz się do nieistniejącego wiersza o indeksie równym 1.
Ale tak działa ta kontrolka

ustaw

stringgrid1.rowcount := 1

a następnie użyj takiego kodu

var
  row: integer;
begin
  
  if not ((StringGrid1.RowCount = 1) and (StringGrid1.Cells[0, 0] = '')) then
    StringGrid1.RowCount := StringGrid1.RowCount + 1;
  row := StringGrid1.RowCount - 1;
  StringGrid1.Cells[0, row] := inttostr(row);
  ///......
  ///......

end;

albo takiego ...
robi to samo ale jest bardziej czytelny

var
  row: integer;
begin

  if (StringGrid1.RowCount = 1) and (StringGrid1.Cells[0, 0] = '') then
  begin
    StringGrid1.Cells[0, 0] := '0';
    exit
  end;

  StringGrid1.RowCount := StringGrid1.RowCount + 1;
  row := StringGrid1.RowCount - 1;
  StringGrid1.Cells[0, row] := inttostr(row);
  ///......
  ///......

end;
0

To ja wiem że mój kod nie będzie działał bo teraz zrobiłem kod pod StringGrid1.RowCount := 2. Chodziło mi o to że nie robiąc żadnej operacji na kontrolce nam ustawione w zdarzeniu oncreate formularza :

StringGrid1.RowCount := 1;
StringGrid1.FixedRows :=1;

I podczas uruchamiania wywala mi ten błąd
Fixed row count must be less than rów count

Jak zmienię na:
StringGrid1.RowCount := 2;
Wszystko jest ok

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