Tabliczka mnozenia w stringgrid

0

Napisalem prosta procedure do wyswietlania tabliczki mnozenia:

procedure TForm1.Button1Click(Sender: TObject);
var
wartosc,i,j:integer;
begin
tabliczka.RowCount:=strtoint(kolumny.Text)+1;
tabliczka.ColCount:=strtoint(wiersze.Text)+1;
tabliczka.FixedCols:=1;
tabliczka.FixedRows:=1;
for i:=1 to tabliczka.RowCount-1 do tabliczka.Cells[i,0]:=inttostr(i);
for j:=1 to tabliczka.RowCount-1 do tabliczka.Cells[0,j]:=inttostr(j);
for i:=1 to tabliczka.RowCount-1 do
for j:=1 to tabliczka.ColCount-1 do begin
wartosc:=i*j;
tabliczka.Cells[i,j]:=inttostr(wartosc);
//tabliczka.Cols[j].SaveToFile('test.txt');
application.ProcessMessages;
end;
statusbar1.SimpleText:='Program obliczyl wszystko!!'
end;

Moj problem polega na przeciazeniu. Jak daje wartosci 5000x5000 to wyskakuje mi out of memory i komp sie wiesza. Komputer posiada 358 mb ramu i 1100 Mhz procesor. W jaki inny sposob mozna przyspieszyc dzialanie aplikacji ?? Glownie chodzi mi o petle obliczajaca ta tabliczke oraz ja wyswietlajaca do stringgrida.
Z gory serdecznie dziekuje :)

0

Zastanawiam się czy wiesz co robisz...
Policz sobie czy i wyrzuć to application.ProcessMessages; bo to moze spowalnaic dodatkowo:
jęsli dajesz 10 to masz 100 pól(dokladnie 11x11=121 ale pomine ten fragment przyjmujac 10*10=100)
jak dasz 1000 masz 1000000 do wczytania do pamieci u mnei to 2 sekundy
jak dasz 1500 masz ...
jak ....
jak 4000 to masz 16000000 pol - pomijajac juz nakład na trzymanie tego graficznei w stringgridzie to bardzo bardzo duzo zbednych danych. u mnie 112 s
Przy 5000 masz dokladnie 25010001 pol.
Czy pomyślałeś po co ci tyle pól graficznych w stringrid, kto to przejrzy przewinie itd? Czy jest to potzrebne, zamiast narzekać na komputer można zastanowić sieco robię. Można kupić w promocji w supermarkecie 100000 opakowań płatków do mleka, bo wyliczysz ze do konca zycia twoich wnuków powinniscie je zjeść ... można, tyle czy to ma sens?
jak chcesz pokombinować usiałbyć TStringGrida ładować całymi wierszami, korzystając z właściwiści TStrings i unikając uakualneinai i poakzywania po kazdym zaladowanym rekordzie, ale to tylko przyspieszy.
Policz sobei potzreby pamięci - 25010001 wartości przechowywanej jako string (sprawdz dlugosc i pomnoz) dodaj pamiec na zapamietanie polozenia, wyswietlenai aligmentu itd itp - po prostu oblęd
Andrzej Dąbrowski

0

jeśli jusz Ci potrzebne takie coś, to nierób całego sg na raz tylko czytasz górną kolumnę i wiersz i odnich wykonujesz mnożenie np:

var x,y:integer;
begin
for x:=Grid.leftcol to 100 do
  begin
    for y:=Grid.TopRow to 100 do
      grid.Cells[x,y]:=inttostr(x*y);
  end;
end;

www.edytor.net.qup.pl

0

A nie można zrobic prostego kalkulatora?
W dobie komputerów, nie ma potrzeby tworzenia tablic matematycznych.
Czy zapytanie o x1 i x2 nie wystarczy? Wzór matematyczny na to będzie dość prosty, szybki...
wynik := x1*x2; Myślałeś o tym? To bardziej ubiwersalne. Jedyne co Cię ogranicza to pojemność typu zmiennoprzecinkowego.

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