Hlavní formulář Lazarus – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hlavní formulář Lazarus – Delphi – Fórum – Programujte.comHlavní formulář Lazarus – Delphi – Fórum – Programujte.com

 

Irena
~ Anonymní uživatel
8 příspěvků
8. 2. 2015   #1
-
0
-

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!!!                      

Nahlásit jako SPAM
IP: 109.80.77.–
q
~ Anonymní uživatel
219 příspěvků
8. 2. 2015   #2
-
0
-

A jakou chybu?

Pravděpodobně máš ty formy v samostatných unitách. Do unity, kde chceš pracovat s jiným formem přidej jeho unitu do uses, pak s ním budeš moct pracovat.

unit Unit3;
...
uses ..., Unit1;

procedure TForm3.Neco;
begin
  Form1.Show;
end;
Nahlásit jako SPAM
IP: 213.211.51.–
Irena
~ Anonymní uživatel
8 příspěvků
8. 2. 2015   #3
-
0
-

#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?

Nahlásit jako SPAM
IP: 109.80.77.–
Sniper
~ Anonymní uživatel
215 příspěvků
8. 2. 2015   #4
-
0
-

Prosím dej sem celý kód (všech tří formů a celé lpr), nějak se v tom neorientuji. Pracuješ tam se soubory ale to jsi na začátku ani nezmínila...

Mimochodem by neškodilo ty formy pojmenovat nějak lidsky; form1, form2 atd, to je humus.

Nahlásit jako SPAM
IP: 90.179.201.–
Irena
~ Anonymní uživatel
8 příspěvků
8. 2. 2015   #5
-
0
-

#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.
                                                

Nahlásit jako SPAM
IP: 109.80.77.–
Sniper
~ Anonymní uživatel
215 příspěvků
9. 2. 2015   #6
-
0
-

To je zase zmatená šílenost. Proč ten kód aspoň nedáš do <code> aby se v tom dalo vyznat?

Přístup ti to odmítá protože se pokoušíš otevřít soubor který už otevřený jednou je (nelze použít AssignFile dvakrát na jednom souboru). Nejjednodušší bude asi použít v každém formu jiný soubor.

Mimochodem používat v dnešní době AssignFile mi přijde jako anachronismus, notabene v okenní aplikaci. Proč nepoužiješ streamy?

Nahlásit jako SPAM
IP: 90.179.201.–
Irena
~ Anonymní uživatel
8 příspěvků
9. 2. 2015   #7
-
0
-

#6 Sniper
Děkuju moc!

Vím, že to je šílený, ale je to na zápočet, programovat se učím, jsem samouk, hledám na netu, překládám z Aj atd....

Takže mám změnit příkaz  AssignFile(soubor2,'casy.txt')?

Co mám na něm změnit? Já vím, blbá otázka, ale fakt se to učím a taky vůbec nevím, co jsou to streamy. Až k tomu jednou dojdu, určitě použiju.

Dík. I.

Nahlásit jako SPAM
IP: 90.178.241.–
Sniper
~ Anonymní uživatel
215 příspěvků
9. 2. 2015   #8
-
0
-

Prostě zapisuj do jiného souboru, takže změň název (třeba na casy2.txt).

http://wiki.freepascal.org/File_Handling_In_Pascal#Object_style

Nahlásit jako SPAM
IP: 90.179.201.–
Irena
~ Anonymní uživatel
8 příspěvků
9. 2. 2015   #9
-
0
-

#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.

Nahlásit jako SPAM
IP: 109.80.77.–
Sniper
~ Anonymní uživatel
215 příspěvků
9. 2. 2015   #10
-
0
-

Visí ti to protože při otevření sekundárního okna skryješ hlavní okno ale už ho nezobrazíš. Dokud nezavřeš hlavní okno nebo neukončíš objekt application tak program pořád běží, jenom holt není vidět. Být tebou tak zapřemýšlím nad tím, jak máš ten program celkově koncipovaný, protože v takovém zmatku se budou pořád objevovat chyby. Jaké je vlastně zadání?

Nahlásit jako SPAM
IP: 90.179.201.–
Irena
~ Anonymní uživatel
8 příspěvků
9. 2. 2015   #11
-
0
-

#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ě...

Nahlásit jako SPAM
IP: 109.80.77.–
Sniper
~ Anonymní uživatel
215 příspěvků
9. 2. 2015   #12
-
0
-

"na násobení a dělení" - to je trochu moc obecný, specifikuj, nebo ideálně sem napiš zadání slovo od slova. Já být tebou tak to komplet předělám, protože to směřuje špatným směrem.
Sender je parametr událostí objektů (resp. se předává do obsluh daných událostí), většinou obsahuje referenci na objekt který danou událost vyvolal (ale není dobré na to spoléhat, fakticky je to pointer, takže může ukazovat na cokoliv nebo taky na nic).
Mimochodem následující tři dny se nedostanu na net tak ti tu neporadím, ale snad se najde jiná dobrá duše.
 

Nahlásit jako SPAM
IP: 90.179.201.–
Irena
~ Anonymní uživatel
8 příspěvků
9. 2. 2015   #13
-
0
-

#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.
 

Nahlásit jako SPAM
IP: 109.80.77.–
Irena
~ Anonymní uživatel
8 příspěvků
9. 2. 2015   #14
-
0
-

#12 Sniper

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

Nahlásit jako SPAM
IP: 109.80.77.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

Hlavní metoda — založil ViliX64

Hlavní panel v delphix — založil maherik

 

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