Aplikacja okienkowa - operacje na macierzy.

0

Witam
Mam projekt w pascalu napisac aplikacje okienkowa ktora bedzie liczyla, srednia z macierzy, sume, transpozycje itp. Czesc podpunktow juz wykonalem w wersje dla macierzy kwadratowej ze stałą liczba kolumn i wierszy. I teraz pytanie chcac zrobic to w wersji okienkowej jakiego komponentu powieniem uzyc? JAk wysuplac z tego dane? Jak sie odwoływac do nich? Macierz oczywiscie dwuwymiarowa.

W wersji konsolowej jest to proste :

  for i:=1 to n do
     for j:=1 to n do
       //wypelnianie reczne
      a[i,j]:=random(10);

 suma:=0;
for i:=1 to n do  begin
for j:=1 to n do
            begin
     writeln('podaj elementy macierzy A[',i,',',j,']: ');  //wyp reczne
     readln(t[i,j]);
     suma:= suma + t[i,j];
 end;
end;   



 for i:=1 to n do  begin
 for j:=1 to n do

      g[j,i]:= t[i,j];

   end;
  writeln('suma to: = ' ,suma);
  writeln;

ale jak takie cos zrobic w wersji okienkowej?

Mysle o stworzeniu jakiegos TMemo ( a moze stringgrid) i tam sobie uzytkownik wpisze macierz, sprawdze czy nie zawiera liter, sprawdze dlugosc i bede znac dlugosc wiersza. Nigdy nie robilem aplikacji okienkowych tak wiec prosze o pomoc co z tym fantem zrobic.

3

Skorzystanie z TStringGrid do wypełnienia macierzy to według mnie dobry pomysł. Można sobie wielkość jak i ilość wierzy/kolumn tej macierzy "StringGridowe"j, bez problemów ustawiać. Aplikacje z użyciem VCL/LCL nie pisze się strasznie trudno. Przynajmniej takie proste. Tylko oczywiście nie używasz Writeln :)

Cięzko cokolwiek więcej doradzić. Musiał byś sprecyzować problem. Oczywiście polecam, zanim o cokolwiek zapytasz na forum. Wytrwale kombinować do bólu, googlować, stawać na rzęsach żeby coś samodzielnie napisać. Więcej się nauczysz i większa satysfakcja. A informacji pomocniczych w google nie brakuje.

1

W sumie jedynym sensownym komponentem w tym przypadku jest StringGrid; Żeby się odwołać do danej komórki, należy skorzystać z właściwości Cells, podając jej współrzędne;

Tyle tylko że StringGrid posiada komórki jako tekst, a nie liczby, więc każdą pobraną wartość z komórki najpierw musisz przekonwertować do liczby, np. za pomocą funkcji StrToInt, a dopiero potem możesz coś dalej działać (czyli liczyć);

Zapoznaj się najpierw z tym komponentem i spróbuj coś napisać sam, a jak będziesz miał jakieś trudności to dopiero wtedy zgłoś się w tym wątku, oczywiście podając swój kod.

0

JAk wysuplac z tego dane? Jak sie odwoływac do nich?

Poprzednicy dobrze piszą że StringGrid będzie najlepszy jednak chciałbym zauważyć, że StringGrid nie jest po to by przechowywać w nim dane tylko po to by je wyświetlać.

0

Prosilbym o sprawdzenie czy tak jest dobrze:

 
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls, Menus, Buttons, Spin, ExtCtrls;

type

  { TMacierz }

  TMacierz = class(TForm)
    Button1: TButton;
    Button3: TButton;
    Kwadrat: TButton;
    Label1: TLabel;
    Label2: TLabel;
    nowe: TMainMenu;
    Item1: TMenuItem;
    Podswietl: TButton;
    SpinEdit1: TSpinEdit;
    Transpozycja: TButton;
    Suma: TButton;
    Generuj: TButton;
    StringGrid1: TStringGrid;
    procedure Button3Click(Sender: TObject);
    procedure Item1Click(Sender: TObject);
    procedure Label2Click(Sender: TObject);
    procedure PodswietlClick(Sender: TObject);
    procedure TranspozycjaClick(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure SumaClick(Sender: TObject);
    procedure GenerujClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
     macierza: array [1..10,1..10] of Integer;
    { public declarations }
  end;

var
  Macierz: TMacierz;
  losowa:integer;
   i,j,k,l,komorka,sum,numeruj:integer;
   stworzono,czytransponowana:boolean;


implementation

{$R *.lfm}

{ TMacierz }        

procedure TMacierz.TranspozycjaClick(Sender: TObject);
    var   tran
end;
   czytransponowana:=TRUE;
   end;       

Nie usune zmiennych globalnych gdyz niewiedzialbym co z nimi zrobic (generuj z nich korzysta i moglbym je tam wsadzic o ile dobrze mysle), postaram sie ogarnac formatowanie ale to moze jutro poczytam jak formatowac kod, zostawilem formatowanie Lazarusa i moje wieczne proby zmian. Problem transponowania rozwiazany, prosilbym tylko o sprawdzenie czy ma to sens. Jeszcze niewiem czym sa prywatne pola formularza, ogarne to pozniej chociaz mysle ze sie nie przyda.

2 sprawa.

Furious to jest twoj kod z innego watku na podswietlanie kolumny:

procedure TForm1.Button1Click(Sender: TObject);
const
  COLUMN_ID = 2;
begin
  with StringGrid1 do
    Selection := TGridRect(Rect(COLUMN_ID, FixedRows, COLUMN_ID, RowCount)); 

Czy dobrze rozumiem ze w miejsce 2 ma wyladowac zmienna okreslajaca kolumne? (chce ta kolumne podswietlic bez wiersza naglowkowego headinga )

Dzieki za pomoc:)

0

Przede wszystkim usuń zmienne globalne na rzecz zmiennych lokalnych oraz prywatnych pól klasy formularza; To pozwoli Ci na lepsze zarządzanie kodem i łatwiej będzie go ogarnąć; No i sformatuj kod, bo nadal jest nieczytelny (randomowe wcięcia i kupa zbędnych pustych linii);

Czy dobrze rozumiem ze w miejsce 2 ma wyladowac zmienna okreslajaca kolumne? (chce ta kolumne podswietlic bez wiersza naglowkowego headinga )

Stała COLUMN_ID zawiera w tym przypadku indeks kolumny, która ma być podświetlona; Jest ona użyta w funkcji Rect dwa razy - do określenia kolumny początkowej i końcowej dla zaznaczenia; Jeżeli chcesz zaznaczyć więcej kolumn niż jedną, to w miejscach użycia tej stałej podaj inne, różne wartości;

PS: Odpisuj w nowych postach, bo robi się zamieszanie z tymi edycjami i ciężko na nie odpowiadać...

0

Teraz takie małe pytanie. Jak w pacalu tworzy sie dynamiczne tablice? Chce by dynamiczna tablica miala tyle rekordów, ile jest kolumn. Niestety probowalem to robic normalnie przypisujac do

 tabdyn:array[1..n] of real;

czyli tablicy dynamicznej gdzie n oznacza liczbe kolumn, ale w lazarusie wyskakuje blad ze n musi byc stałą. Pozniej postaram sie wrzucic ten blad oraz kod.

Znalazlem w internecie takie coś, dodaje to zaraz przy generowaniu macierzy do stringgrida :

 SetLength(tabdyn, n);

Niestety błąd jest nadal. *http:*haker.com.pl/threads/21462-Kurs-Pascal-V-Tablice-dynamiczne-i-statyczne

Wlasnie chcialem zeby bylo czytelniej, a nie mam pojecia czy na tym forum wątek sie odswieza po edycjii czy po wrzuceniu nowego posta.

0

Jak w pacalu tworzy sie dynamiczne tablice?

Tak jak to zostało opisane w tutorialu - tworzysz typ:

type
  TDynamicArray = array of {np.} Integer

Następnie aby nadać/zmienić rozmiar macierzy, używa się procedury SetLength;

czyli tablicy dynamicznej gdzie n oznacza liczbe kolumn, ale w lazarusie wyskakuje blad ze n musi byc stałą.

Nie masz zadeklarowanego tego n, więc występuje błąd kompilacji; I to nie tylko w Lazarusie, ale też w Delphi czy starym TP7; Poza tym Ty deklarujesz zmienną tabdyn, a nie typ; Poprawny zapis poniżej:

type
  TTabDyn = array of Real;

Poza tym korzystaj z typu Double - Real to pozostałość ze starego Pascala.

0

Mozna zamknąc, dziekuje za pomoc.

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