Operacje na stringgridach

0

Witam

Mam tak: 2 stringgridy w ktorych liczby sa generowane za pomoca buttona "generuj", a miedzy nimi Combobox ze znakami matematycznymi(dodawanie, odejmowanie, mnozenie), w jaki sposob teraz te liczby w striggridach np. dodac tak aby wynik proporcjonalnie zapisal sie w 3-cim stringgridzie i ta calosc obliczenia zeby wykonala sie za pomoca buttona "oblicz". Jak w stringgrid odwolywac sie do tych komorek?
Z gory dziekuje

0

Dodawanie wg ComboBoxa zrób tak aby w zależności od tego co wybierzesz po nacisnięciu przycisku Oblicz wykonywała Ci sie dana funkcja np.

if ComboBox1->Text = 'Dodaj' then Dodaj(a,b) // gdzie dodaj to funkcja dodająca dwa parametry i zwracająca wynik

dodawanie dwóch komórek z różnych stringgridów w zależności od typu danych:

suma:= StrToFloat(StringGrid1.Cells[0,0]) + StrToFloat(StringGrid2.Cells[0,0]);

pisze z głowy to mogą być jakieś literówki ale powinno działać.

0

Tak troche zmienilem i zadzialalo, ale doszlem ze w ten sposob oblicza jedna komorke, a potrzebuje zeby tez kazda obliczal, Czy da sie to jakos zapetlic? Zamieszczam screen zeby bylo widac jak to teraz wyglada: http://img146.imageshack.us/my.php?image=stringgridha7.jpg

Oto kod:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    StringGrid2: TStringGrid;
    StringGrid3: TStringGrid;
    ListBox1: TListBox;
    Button3: TButton;
    Button4: TButton;
    ComboBox2: TComboBox;
    StringGrid1: TStringGrid;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
 close;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
for i:=1 to 3 do
for j:=1 to 3 do
begin
stringgrid1.cells[i,j]:=inttostr(random(20));
stringgrid2.cells[i,j]:=inttostr(random(20));

end;
end;

procedure TForm1.StringGrid1Click(Sender: TObject);
var i:integer;
begin
 for i:=1 to 3 do
 begin
 stringgrid1.cells[0,i]:=inttostr(i);
 stringgrid1.cells[i,0]:=inttostr(i);
 stringgrid2.cells[0,i]:=inttostr(i);
 stringgrid2.cells[i,0]:=inttostr(i);
 stringgrid3.cells[i,0]:=inttostr(i);
 stringgrid3.cells[0,i]:=inttostr(i);
 end;
end;



procedure TForm1.Button3Click(Sender: TObject);

begin
if ComboBox2.Text = '+' then
stringgrid3.Cells[1,1]:= floattostr(StrToFloat(StringGrid1.Cells[1,1]) + StrToFloat(StringGrid2.Cells[1,1]));
if ComboBox2.Text = '-' then
stringgrid3.Cells[1,1]:= floattostr(StrToFloat(StringGrid1.Cells[1,1]) - StrToFloat(StringGrid2.Cells[1,1]));
if ComboBox2.Text = '*' then
stringgrid3.Cells[1,1]:= floattostr(StrToFloat(StringGrid1.Cells[1,1]) * StrToFloat(StringGrid2.Cells[1,1]));
end;
end.

</image></url>

0

Orientuje sie ktos co z tym fantem zrobic?

0
BladeS napisał(a)

Tak troche zmienilem i zadzialalo, ale doszlem ze w ten sposob oblicza jedna komorke, a potrzebuje zeby tez kazda obliczal, Czy da sie to jakos zapetlic?

</image></url>

masz na sztywno wpisane wspolrzedne celi [1,1] a musisz przeleciec sie po wszystkich komorkach

for i:=0 to stringGrid1.ColCount do
for j:=0 to stringGrid1.RowCount do
begin
//tu wstaw operacje na komórce [i,j] zamiast [1,1]
end;

0

Dodawanie jako tako dziala, ale w inny sposob :/ jesli robie ta kwestie wlasnie tak:

procedure TForm1.Button3Click(Sender: TObject);
 var i,j:integer;
begin
if ComboBox2.Text = '+' then
 for i:=1 to stringGrid1.ColCount do
  for j:=1 to stringGrid1.RowCount do
    begin
stringgrid3.Cells[i,j]:=StringGrid1.Cells[i,j] + StringGrid2.Cells[i,j];
end;
    end; 

To mi Liczy kazda komorke tak np. 9+5=95; 7+3=73 a powinno byc odpowiednio 14 i 10; :( a jak probuje pomnozyc (*) badz odjac (-) to w ogole nie idzie :(

0

No i nie ma sie co dziwic :)
musisz zamienic tekst na liczbe...
stringgrid3.cells[i,j]:=floattostr(strtofloat(stringgrid1.cells[i,j])+strtofloat(stringgrid2.cells[i,j]));

jak nigdzie nie zrobilem literowki to powinno działać :)

0

Czy my sie przypadkiem nie znamy ?? ;> Przed wczoraj na zajeciach z delphi mialem bardzo podobne zadanie dodawanie mnozenie i liczenie przekatnych macierzy wpisanych do stringgirda pokaze ci jak ja to zrobilem:

implementation
type
    Tablica=array of array of double;

function Iloczyn(a: Tablica; b: Tablica; w1kol2, kol1w2: integer): Tablica;
var
   ai, bi, i: integer;
   c: Tablica;
   wyn: double;
begin
    SetLength(c,w1kol2,w1kol2);
    SetLength(a,kol1w2,w1kol2);
    SetLength(b,w1kol2,kol1w2);
     for ai := 1 to w1kol2 do
         for bi := 1 to w1kol2 do
             begin
                  wyn := 0;
                  for i := 1 to kol1w2 do
                      begin
                           wyn := wyn  + (a[i-1,ai-1] * b[bi-1,i-1]);
                           c[bi-1,ai-1] := wyn;
                      end;
             end;
     Result:=c;
end;
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
   Tab1, Tab2, Tab3: Tablica;
   kol1w2,w1kol2, x, y: integer;
begin
     kol1w2 := StrToInt(Edit1.Text);
     w1kol2 := StrToInt(Edit2.Text);
     SetLength(Tab1,kol1w2,w1kol2);
     SetLength(Tab2,w1kol2,kol1w2);
     SetLength(Tab3,w1kol2,w1kol2);
     StringGrid1.RowCount := w1kol2 + 1;
     StringGrid2.RowCount := kol1w2 + 1;
     StringGrid3.RowCount := w1kol2 + 1;
     StringGrid1.ColCount := kol1w2 + 1;
     StringGrid2.ColCount := w1kol2 + 1;
     StringGrid3.ColCount := w1kol2 + 1;
     for y := 1 to w1kol2 do
         for x := 1 to kol1w2 do
             begin
                  Tab1[x-1,y-1] := int(Random(5));
                  Tab2[y-1,x-1] := int(Random(5)); 
                  StringGrid1.Cells[x,y] := FloatToStr(Tab1[x-1,y-1]);
                  StringGrid2.cells[y,x] := FloatToStr(Tab2[y-1,x-1]);
             end;
     Tab3 := Iloczyn(Tab1,Tab2,w1kol2,kol1w2);
     for y := 1 to w1kol2 do
         for x := 1 to w1kol2 do
             StringGrid3.Cells[x,y] := FloatToStr(Tab3[x-1,y-1]);
end;

Nie wiem czy dokladnie o to ci chodzilo ale mam nadzieje ze okaze sie to pomocne ;)

0

Zadzialalo te obliczanie w koncu:D serdecznie wszyskim dziekuje :)

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