Wypakowanie i konwersja wymiarów prostokątów podanych w TMemo

0

Witam
Dostałem takie zadanie do rozwiązania i nie mam zielonego pojęcia jak to zrobić.

Opracować aplikacje, która wykorzystuje komponent Memo do wprowadzania wymiarów prostokąta(długość i szerokość). Nie więcej niż 20 prostokątów. Każda linia Memo zawiera dwa wymiary jednego prostokąta rozdzielone znakiem dwukropka. Okienko główne powinno zawierać także pole edycji, dwa przyciski button do inicjowania obliczeń:
Pierwszy Button - Wyświetla liczbę prostokątów i przypisuje wymiary do tablic
Drugi Button - wyświetla okienko zawierające średnia długość boku prostokątów, których obwód jest mniejszy niż liczba wpisana w pole edycyjne.
Poprawność liczby w polu edycyjnym jak i w komponencie Memo powinna być sprawdzana.

 unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Button2: TButton;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
  tytul: String;
  N: integer;
  x, y: array[1..20] of integer;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 var
 i, B: Integer;
begin
N:=0;
B:=0;
with Memo1 do
if Memo1.Lines.Count >0 then
    try
    Memo1.Lines.NameValueSeparator:=(':');
       for i:= 0 to Memo1.Lines.Count -1 do
        begin
        N:= N+1;
        x[i]:=StrToInt(Trim(Memo1.Lines.Names[i]));
        y[i]:=StrToInt(Trim(Memo1.Lines.ValueFromIndex[i]));
        end;



        Label1.Caption:=IntToStr(N);

        Button2.Enabled:=true;
    except
     MessageDlg('Wpisz poprawne dane!', mtWarning, [mbOk], 0);
      Memo1.SetFocus;
    end;
   end;


procedure TForm1.Button2Click(Sender: TObject);
var
i, s, b :integer;
begin
s:=0;
b:=0;

b:= StrToInt(Edit1.Text);

for i := 1 to N do
  Begin
    if b < ((x[i-1]+y[i-1])*2) then
    s:=(x[i-1]+y[i-1])*2;
    End;
   label3.Caption := IntToStr(s);

end;

end.

Takie coś udało mi się wypocić ale nic z tego nie wychodzi. Liczy jakieś bzdury.

0

Każda linia Memo zawiera dwa wymiary jednego prostokąta rozdzielone znakiem dwukropka.

Każdą linię z komponentu pobierasz do zmiennej, za pomocą funkcji Pos szukasz znaku separatora i wypakowujesz podciągi wymiarów używając funkcji Copy - przyda się także Length aby wiedzieć ile znaków ma linia; Podciągi wypakowyjesz do i konwertujesz na liczby za pomocą np. StrToInt, uprzednio **Trim**ując je, aby usunąć niechciane białe znaki;

Spróbuj w ten sposób, skoro przestawianie wartości właściwości nie pożądanego rezultatu.

1
  1. Sformatuj kod porządnie to ktoś spojrzy.
  2. Nie sprawdzasz czy nie przekroczysz rozmiarów tablicy.
  3. Ponazywaj sensownie komponenty. A i zbędne jest to with Memo1 do
  4. Jeżeli założyłeś, że danymi wejściowymi są wszystkie linijki Memo1. To po co w tak głupi sposób obliczać ilośc podanych danych zamiast odwołać się po prostu do Count?
  5. Nie masz chyba pojęcia jak działają tablice. Z braku formatowania nie wnikałem dokładnie czy są jakieś jeszcze inne błędy, ale uruchom sobie następujący kod i zobacz co zwraca pokazujący się dialog.
var
  I : integer;
begin
  for I := 1 to 20 do
  begin
    ShowMessage(IntToStr(I - 1));
  end;
end;

A wątek przenoszę do Newbie, bo nie widzę tutaj nic co było by poza banalnymi zagadnieniami dotyczącymi podstaw.

@furious programming mnie ubiegł. Oczywiście sposób "parsowania" danych z TMemo też jest zrobiony jakoś dziwacznie, bo tutaj prosi się właśnie o skorzystanie z Pos i Copy jak wspomniał poprzednik.

Na pewno zapunktował byś oddając kod zadania, który sprawdzał by poprawność danych, reagował na zbyt dużą ilość wierszy, a także podczas sprawdzania wyświetlił, która linia zawiera błędne dane (dla prostoty pierwsze wystąpienie błędnej linijki). Ale pomijając to. I tak samo odczytywanie danych z tablicy jest zrobione błędnie. Nie należy się również oczywiście odwoływać pętlami na sztywno, poczytaj sobie jak odczytuje się rozmiar tablicy. Później wykładowca zmieni zdanie, że tablica ma mieć 50 elementów i co? Wyobraż sobie bardziej zaawansowany kod. To będziesz w 76585692838 miejscach zmieniał 20 na 50 albo później robił to kolejny raz?

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