Delphi 7 od wiersza poleceń do programu

Napisałem program do liczenia liczb doskonałych od 0 do a

http://www.sendspace.pl/file/cf796b0f5466f3d646fade1

ale chciałbym żeby działał nie tylko w konsoli, chodzi mi o bardziej graficzny układ np. chociaż taki prosty

program.th.jpg

ale jak zacząłem to robić to mi tam cuda nie widy wyszły.

Nie wiem jak połączyć jedno z drugim.

Mógłby ktoś obeznany w tych sprawach podrzucić tak wyglądający plik żebym mógł zobaczyć jak to powinno wyglądać, żeby działało?

W zdarzeniu ButtonClick(), ustawiasz Button.Enabled:=false; wczytujesz liczbę podaną w polu, i zaczynasz obliczać co jakiś czas wywołując Applikation.ProcessMessages; po wywołaniu sprawdzasz czy ZMIENNA ma ustawioną wartość “zakończ natychmiast”. W zdarzeniu FormCloseQuery ustawiasz tą ZMIENNA na wartość “zakończ natychmiast”. ZMIENNA to może być typu Boolean lub np Button.Tag.

Lub też zrób obliczenia w osobnym wątku.

unit Unit1;


interface


uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;


type

  TForm1 = class(TForm)

    Label1: TLabel;

    Edit1: TEdit;

    Button1: TButton;

    Memo1: TMemo;

    procedure Edit1Change(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Memo1Change(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;


var

  Form1: TForm1;


implementation


{$R *.dfm}


procedure TForm1.Edit1Change(Sender: TObject);


var

a : integer;


begin

  write('Podaj liczbe calkowita a: ');

end;


procedure TForm1.Button1Click(Sender: TObject);

var

Suma,Liczba,Mozliwosci:LongInt;


begin

Suma:=0;{Poczatkowa wartosc sumy=0}

Mozliwosci:=0; {ustala wstepna wartosc mozliwosci.. dzielenie przez wszystkie liczby od 1

do 1 mniej niz podana liczba}

While Mozliwosci< Liczba-1 do

Begin

Inc(Mozliwosci); {zwiekszenie zmiennej mozliwosci o 1}

if Liczba mod Mozliwosci=0 then

Suma:=Suma+Mozliwosci;{dodajemy dzielniki}

end;

If Suma=Liczba then write(Liczba,',');

End;



procedure TForm1.Memo1Change(Sender: TObject);

begin

  If Suma=Liczba then write(Liczba,',');

End;

end;


end.

Zrobiłem mniej więcej coś takiego i kurde nie wiem gdzie i ile tych błędów jeszcze jest. Może ktoś pomóc?

W programie okienkowym nie ma wyjścia standardowego, więc nie możesz użyć procedury write().

Absolutnie nie dostosowałeś się do mojej poprzedniej podpowiedzi.

OK. Zacznijmy od początku.

Program okienkowy jest oparty na zdarzeniach: w momencie, gdy użytkownik naciska przycisk (Button1), zmienia tekst w polu edycji (Edit1), zaznacza lub odznacza pole wyboru (Checkbox1) itp, wywoływane są odpowiednie procedury obsługi zdarzeń.

Dlaczego więc wyniki obliczeń w Twoim programie nie chcą się pojawić w kontrolce Memo1, mimo iż wpisałeś

procedure TForm1.Memo1Change(Sender: TObject);

begin

  If Suma=Liczba then write(Liczba,',');

End;

Aby się przekonać, kiedy będzie wywołana ta procedura obsługi zdarzenia zapisz ją tak:

procedure TForm1.Memo1Change(Sender: TObject);

const i: Integer = 0;

begin

  Label1.Caption:= IntToStr(i);

  Inc(i);

end;

i następnie wpisuj, kasuj, wklejaj cokolwiek w kontrolce Memo1. Z każdą zmianą tekstu w Memo1 zmienia się napis kontrolki Label1 W przypadku Twojego programu nie potrzeba nic wpisywać w procedurach obsługi zdarzeń. Oczywiście w bardziej skomplikowanych programach można je wykorzystywać i to się robi.

procedure TForm1.Memo1Change(Sender: TObject);

begin


end;


procedure TForm1.Edit1Change(Sender: TObject);

begin


end;

Zostaw je w takiej postaci jak napisałem i dokonaj kompilacji kodu, a Delphi je usunie z kodu źródłowego Całą procedurę obliczania liczb doskonałych wystarczy zawrzeć w procedurze Button1Click (tak jak to zresztą zrobiłeś). W tej procedurze można również zapisywać wyniki bezpośrednio w kontrolce Memo1. Poniżej przykład, który wypisuje liczby parzyste od 0 do liczby w polu edycji Edit1. Liczby doskonałe pozostawiam dla Ciebie, ja nie jestem doskonały :slight_smile:

procedure TForm1.Button1Click(Sender: TObject);

var i, maks: Integer;

begin

  maks:= StrToInt(Edit1.Text); // Edit1 musi zawierać poprawną liczbę!

  Memo1.Text:= 'Liczby parzyste do ' + Edit1.Text;

  for i:= 0 to maks do begin

    if i mod 2 = 0 then Memo1.Lines.Add(IntToStr(i));

  end;

end;

Reasumując: jeżeli chcesz wypisać gdzieś wyniki działania programu okienkowego, to używasz do tego właściwości takich obiektów jak:

Label1.Caption, Edit1.Text, Memo1.Text, Memo1.Lines i wiele innych. Polecam zapoznanie się z opisem w Pomocy Delphi

Jeżeli masz jeszcze jakieś pytania, to pisz. Postaram się pomóc