wczytywanie macierzy

0

Witajcie,
Problem jaki mnie bardzo frasuje dotyczy wczytywania macierzy z pola Edit do tablicy dwuwymiarowej i pokazywania na liscie StringGrid. W jaki sposob mozna to zrobic w petli, tzn.

  1. wczytuje do pola Edit1 rzad macierzy n
  2. kontrola przechodzi na okienko Edit2
  3. przez caly czas Editem wczytuje wartosc poszczegolnych komorek macierzy

W konsoli mozna to rozwiazac znakomicie, przy uzyciu funkcji Read, natomiast w trybie graficznym sprawia mi to problem.

Myslalem, ze mozna to zrobic w petli, niestety nie wyszlo:

  for i:=1 to n+1 do
    for j:=1 to n+1 do
      begin
          macierz[i][j]:=wartosc;
          
      end;

Ogolnie rzecz biorac moj program na razie wyglada tak:

var
  Form1: TForm1;
  n,i,j: integer;
  macierz: array of array of Extended;
  wartosc: extended;
implementation

{$R *.dfm}

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var wartosc: Extended;
    kod,c,b: integer;
begin

if Key=vk_return
then
 begin
 val(Edit1.Text,n,kod);
 if kod<>0
 then begin
  if Edit1.Text='' then ShowMessage('Costam')
  else ShowMessage('Blad duzo wieksz!');
  Edit1.SetFocus;
  Edit1.SelectAll;
  end
 else
  begin
   StaticText1.Caption:='rzad = ' + IntToStr(n);
   Edit1.Enabled:=False;
   SetLength(macierz,n+1,n+1); ShowMessage('tablica utworzna');
StringGrid1.ColCount:=n+1;
StringGrid1.RowCount:=n+1;

   for c:=1 to n+1 do
    for b:=1 to n+1 do
    StringGrid1.Cells[c,b]:='0';
   Edit2.Enabled:=True;
   Edit2.SetFocus;
  end;


 end;



end;

procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var  kod: integer;
begin
if Key = vk_return
 then
 val(Edit2.Text,wartosc,kod);
 if kod<>0
 then
  begin
  if Edit2.Text=''
  then ShowMessage('Pusciutko')
  else ShowMessage('Liczba nie jest liczba :)');
  Edit2.Clear;
  Edit2.SetFocus;
 end
 else
 begin

  for i:=1 to n+1 do
    for j:=1 to n+1 do
      begin
       macierz[i][j]:=wartosc;
       Edit2.SelectAll;
       Edit2.SetFocus;

      end;
 end;

end;

Gdyby ktos znal jakies lekartswo prosze o pomoc! Z gory dzieki!!! :)

0

Tam gdzie w Pascalu używasz Readln, w Delphi użyj InputBox. Zresztą czy nie łatwiej edytować StringGrida?

0

A czy mozna zrobic to w ten sposob, jaki opisalem? Tak byloby najlatwiej z mojego punktu widzenia. W jaki sposob edytowac StringGrida, czy nie bedzie to wymagalo napisania dodatkowych funkcji nawigacyjnych (chodzacych po stringgridzie).

Jezeli nie byloby to problemem prosilbym o jakas wskazowke, bo w komponentach naprawde raczkuje.

0

W jaki sposob edytowac StringGrida...

Ustawiasz w Object Inspectorze StringGrid.Options goEditing na true, i od tej chwili możesz edytować StringGrida, tzn wpisywać swoje wartości w komórki. Potem tylko jedziesz pętlą po StringGrid.Cells[x,y], funkcja ta zwraca ci zapis w danej komórce (w stringu, więc musisz użyć funkcji konwertującej stringa na liczbę, strtofloat lub strtoint, przed zapisaniem tego do jakiejś tablicy). W połączeniu z dwoma editami, w których wpisujesz rozmiary macierzy, i dopasowaniu wielkości StringGrida do wielkości macierzy (StringGrid.RowCount i StringGrid.ColCount) masz już gotowy program do wczytywania.

0

Lub jeśli chcesz to zrobić swoim sposobem: po prostu użyj sobie coś jak "pamięci" gdzie będzie zapisana aktualna pozycja edycji macierzy.

var Position: TPoint;

Teraz obsłuż zdarzenie onKeyDown Editu gdzie wpisujesz wartości. Jeśli ENTER - wpisuj zawartość do odpowiedniego miejsca w macierzy (DBGrida) no i steruj zmienną Position (tak jak robiłeś w pętli).

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