Anonymní profil Irena – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Irena – Programujte.comAnonymní profil Irena – Programujte.com

 

Příspěvky odeslané z IP adresy 109.80.77.–

Irena
Delphi › Hlavní formulář Lazarus
9. 2. 2015   #199072

#12 Sniper

To bude oříšek, nebo spíš vlašák!!!

Irena
Delphi › Hlavní formulář Lazarus
9. 2. 2015   #199071

#12 Sniper
Přesné zadání je:

Vytvořte aplikaci, která bude splňovat tyto podmínky:

  • aplikace bude obsahovat minimálně dva formuláře
  • aplikace využije zápis do souboru nebo načtení ze souboru
  • v aplikaci budou použity parametry procedur (např. Sender) nebo tvorba vlastních objektů
  • v aplikaci bude použit objekt (objekty), se kterým jsme na cvičení nepracovali      //dělali jsme jen Button, Label, TEdit
  • v aplikaci bude použito menu nebo popupmenu

Příklady možných aplikací:

Zkoušení násobilky nebo sčítání a odčítání.

Toť vše, zbytek je na mně. Mám základy Pascalu. Tedy zhruba obsah knihy J. Pšenčíkové Programování v pascalu.

Máš představu jak jinak postavit program? Jako začít  formulářem, který bude jen spouštěčem druhého a v tom druhém by uživatel vybíral mezi násobením a dělením? Tím pádem by jednotlivé procedury mohly fungovat pro obojí...

Jako fakt nevím... a jak tam vpravit Sender už vůbec ne:-(

Ach jo.
 

Irena
Delphi › Hlavní formulář Lazarus
9. 2. 2015   #199066

#10 Sniper

Zadání je vytvořit aplikaci na násobení a dělení, která bude bude obsahovat minimálně dva formuláře, využije zápis do souboru, menu (na tom pracuju) a použit parametr Sender (zatím netuším, co to je a už podle názvu se mi to vůbec nelíbí...).

Takže myslíš totálně předělat? Právě zkouším zavírat program podle tvého návodu. Tak jestli to nedělám zbytečně...

Irena
Delphi › Hlavní formulář Lazarus
9. 2. 2015   #199064

#8 Sniper
JSI VÁŽNĚ GENIÁLNÍ !!!!!!!!!

Ono to funguje! Tři bezesné noci obětované jedné "dvojce" v pojmenování souboru... Neuvěřitelné:-)

Díky, díky moc za pomoc!!!

Ještě takový malý detail, ale nechci být otravná...

Po ukončení programu mi stále běží na pozadí. Tzn. nejde ho spustit znovu, dokud ho přes správce úloh neukončím. Pořád to hlásí ten stejný dialog

 Acces denied 

Press OK to ignore and risk data corruption.

Press Canal to kill the program.

Můžu ho nějak ukončit ve zdrojáku? Nebo je chyba někde jinde?

I.

Irena
Delphi › Hlavní formulář Lazarus
8. 2. 2015   #198958

#4 Sniper
No, je toho trochu víc, není to dodělaný a jsou v tom chyby o kterých vím...

Form1:

unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  i: integer;
  j: integer;             //pocitadlo spravne vypocitanych prikladu
  k: integer;             //pocitadlo celkove vypocitanych prikladu
  x, y, POKUS, VYSLEDEK: array[1..50] of integer;
implementation

{$R *.lfm}

{ TForm1 }


  var soubor1:TextFile;

procedure TForm1.FormCreate(Sender: TObject);


begin

  Image1.Visible:=false;
  Image2.Visible:=false;
  Button1.Enabled:=false;
  i:=1;
  j:=0;
  k:=0;

  randomize;
  x[i]:=random(10);
  y[i] :=random(10);
  VYSLEDEK[i]:= x[i]*y[i];

  Label1.Caption := inttostr(x[i])+ ' × ' + inttostr(y[i])+' = ';
  Label2.Caption := inttostr(i);
          AssignFile(soubor1,'casy.txt');
          Rewrite (soubor1);


end;

procedure TForm1.Button1Click(Sender: TObject);
begin

Edit1.Text:='';

i:=i+1;
randomize;
  x[i]:=random(10);
  y[i] :=random(10);
  VYSLEDEK[i]:= x[i]* y[i];


  Label1.Caption := inttostr(x[i])+ ' × ' + inttostr(y[i])+' = ';
  Label2.Caption := inttostr(i);
  Image1.Visible:=false;
  Image2.Visible:=false;
  Image3.Visible:=false;
  Button1.Enabled:=false;

  k:=i+1;


end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage ('Celkem jsi spočítal '+ inttostr(k-1) +' příkladů.'+ ' Z toho správně '+ inttostr(j) + '.');
  writeln (soubor1,'Celkem příkladů: '+ inttostr(k-1) +'.'+ ' Z toho správně: '+ inttostr(j)+ '.');

  Form1.Close;
  CloseFile (soubor1);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Image1.Visible:=true;
  Button1.Enabled:=true;
  POKUS [i]:= strtoint (Edit1.Text);

  if VYSLEDEK [i] = POKUS [i]
     then j:=j+1;
  if VYSLEDEK [i] <> POKUS [i]
     then
         begin
          Image1.Visible:=false;
          Image2.Visible:=true;
          Image3.Visible:=true;

  Image3.Canvas.Rectangle(-1,-1,Image3.Width+1,Image3.Height+1);
  Image3.Canvas.Font.Color:=clRed;
  Image3.Canvas.Font.Size:=15;
  Image3.Canvas.Font.Name:='Arial';
  Image3.Canvas.TextOut(0,0,'Ne, správný výsledek je: ');

  Image3.Canvas.TextOut(230,0,IntToStr (VYSLEDEK[i]));

         end

     else Image1.Visible:=true;

     writeln (soubor1,Label1.Caption + Edit1.Caption);

end;

procedure TForm1.Edit1Change(Sender: TObject);
begin


end;

end.

Form2:                                                

unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;

type

  { TForm2 }

  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form2: TForm2;
  i: integer;
  j: integer;             //pocitadlo spravne vypocitanych prikladu
  k: integer;             //pocitadlo celkove vypocitanych prikladu
  x, y, POKUS, VYSLEDEK: array[1..50] of integer;

implementation

{$R *.lfm}

{ TForm2 }

  var soubor2:TextFile;

  procedure TForm2.FormCreate(Sender: TObject);
  begin
    Image1.Visible:=false;
  Image2.Visible:=false;
  Button1.Enabled:=false;
  i:=1;
  j:=0;
  k:=0;

  randomize;
  x[i]:=random(10);
  y[i] :=random(10);
       if y[i]=0 then
           y[i]:=random(10);
  VYSLEDEK[i]:= x[i]*y[i];

  Label1.Caption := inttostr(VYSLEDEK[i])+ ' : ' + inttostr(y[i])+' = ';
  Label2.Caption := inttostr(i);
          AssignFile(soubor2,'casy.txt');
          Rewrite (soubor2);
  end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  Edit1.Text:='';

i:=i+1;
randomize;
  x[i]:=random(10);
  y[i] :=random(10);
       if y[i]=0 then
           y[i]:= random (10);
  VYSLEDEK[i]:= x[i]* y[i];


  Label1.Caption := inttostr(VYSLEDEK[i])+ ' : ' + inttostr(y[i])+' = ';
  Label2.Caption := inttostr(i);
  Image1.Visible:=false;
  Image2.Visible:=false;
  Image3.Visible:=false;
  Button1.Enabled:=false;

  k:=i+1;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  ShowMessage ('Celkem jsi spočítal '+ inttostr(k-1) +' příkladů.'+ ' Z toho správně '+ inttostr(j) + '.');
  writeln (soubor2,'Celkem příkladů: '+ inttostr(k-1) +'.'+ ' Z toho správně: '+ inttostr(j)+ '.');

  Form2.Close;
  CloseFile (soubor2);
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  Image1.Visible:=true;
  Button1.Enabled:=true;
  POKUS [i]:= strtoint (Edit1.Text);

  if x[i] = POKUS [i]
     then j:=j+1;

  if x [i] <> POKUS [i]
     then
         begin
          Image1.Visible:=false;
          Image2.Visible:=true;
          Image3.Visible:=true;

  Image3.Canvas.Rectangle(-1,-1,Image3.Width+1,Image3.Height+1);
  Image3.Canvas.Font.Color:=clRed;
  Image3.Canvas.Font.Size:=15;
  Image3.Canvas.Font.Name:='Arial';
  Image3.Canvas.TextOut(0,0,'Ne, správný výsledek je: ');

  Image3.Canvas.TextOut(230,0,IntToStr (x[i]));

         end

     else Image1.Visible:=true;

     writeln (soubor2,Label1.Caption + Edit1.Caption);
end;

end.
                                                                

Form3 (hlavní form, ze kterýho se má "přepínat" na Form1 a Form2

unit Unit3;

{$mode objfpc}{$H+}

interface

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

type

  { TForm3 }

  TForm3 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.lfm}
Uses
  Unit1, Unit2;

{ TForm3 }


procedure TForm3.Button1Click(Sender: TObject);
begin
 Form1.Show;
  Form3.Hide;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
  Form2.Show;
  Form3.Hide;
end;

end.
 Project1:                                                   

program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1, Unit2, Unit3
  { you can add units after this };

{$R *.res}

begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm3, Form3);


  Application.CreateForm(TForm2, Form2);                           //chyba???
  Application.CreateForm(TForm1, Form1);                          //chyba???

   Application.Run;


end.

A tady na konci je asi ta chyba, pokud přehodím pořadí, funguje ten Form1, ale ne Form2. Fakt nevím!!!

Díky moc.
                                                

Irena
Delphi › Hlavní formulář Lazarus
8. 2. 2015   #198954

#2 q
Díky, přesně takhle to mám.

Při spuštění programu se otevře dialog Access denied.

Press OK to ignore and risk data corruption.

Press Canal to kill the program.

Pokud stisknu OK, program se spustí, otevře se Form3. Když z něj přejdu na Form2, (deklarovaný jako 2. v pořadí),program normálně pokračuje. 

Pokud však chci přejít na Form1 (je deklarován Application.CreateForm(TForm1, Form1); jako poslední), hodí mi to 

File not open.

Press OK to ignore... stejně jako při spouštění.

Program v Form1 funguje, ale to okno mi furt vyskakuje když cokoli udělám. Ale pak to už nezapisuje do souboru (t. j. v tom prg).

Pokud přehodím pořadí Application.Create Form, funguje to obráceně. Tedy Form3 se otevře jako první, funguje Form1, ale nefunguje Form2.

Takže chyba asi bude zde:-( Co s tím?

Irena
Delphi › Hlavní formulář Lazarus
8. 2. 2015   #198949

Prosím, jak nastavit hlavní formulář Form3 tak, aby se z něj dalo přejít buď na Form1 nebo na Form2?

V Project1.lpr mám toto:

begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm3, Form3);

  Application.CreateForm(TForm2, Form2);

  Application.CreateForm(TForm1, Form1);

   Application.Run;

end.        

Už se s tím mořím 3 dny, stále to hlásí chybu  a já na to prostě nemůžu přijít.

Díky moc!!!                      

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý