Bun venit pe SkullBox!

Bine ai venit, Vizitator. Trebuie să te autentifici sau să îţi creezi un cont.
Ai pierdut sau nu ai primit emailul care conţine codul de activare al contului?

Autentifică-te cu numele de utilizator, parola şi precizează durata sesiunii.
  Pagini: [1]
  Imprimă  
[Delphi] Comunicare intre forme  (Vizualizari 737)
breakdown
*

Deconectat Deconectat

Mesaje: 17

WWW
[Delphi] Comunicare intre forme, Feb 28, 2007, 14:27

Un subiect foarte delicat despre care eu am gasit putina documentatie si care cred ca intereseaza pe cei care sunt mai mult sau mai putin axati pe Delphi: comunicarea intre forme. Mai exact, imaginati-va u nscenariu de genul: Avem oforma unde completam niste campuri in functie de care cautam ceva intr-o baza de date, de exemplu un elev (stim, sa zicem, numele dar nu stim exact ince clasa e sau prenumele...). Rezultatul returnat este o lista de elevi din care alegem elevul dorit. Cel mai frumos mod de a prezenta utilizatorului rezultatul ar fi, dupa parerea mea, deschiderea unei forme noi cu lista respectiva de unde utilizatorul selecteaza elevul dorit, apasa [OK] sau [Alege] dupa care se inchide forma a doua (cu lisat elevilor) iar informatiile depsre elevul selectat sunt tiparite in campurile de pe prima forma. Ca sa putem lansa din forma 1, forma 2, trebuie sa folosim unit-ul formei 2 in unit-ul formei 1. Ca sa putem returna valorile dorite din forma 2 in forma 1, ar trebui sa includem unit-ul formei 1 in cel al formei 2, ceea ce nu se poate pentru ca nu se accepta apelarea circulara de acest fel. Astfel, am ajuns la o chestie simpatica: o forma se poate afisa normal sau modal. Afisarea modala a uneo forme presupune ca aplicatia isi opreste executia pana cand aceasta forma e inchisa. pentru asta, forma are o functie ShowModal() care afiseaza forma in mod modal Smile. Cand forma este inchisa, aceasta functie returneaza valoarea proprietatii ModalResult. Mergand mai departe, aceeasi proprietate se gaseste si la butoane. Astfel, daca forma (forma2 in cazul nostru) contine butoane care au valoarea proprietatii ModalResult alta decat mrNone, forma se inchide automat cand utilizatorul da click pe unul din aceste butoane. Astfel, se pot transmite valori prin functii special create intre forme. Un exemplu cat se poate de simplu (cred ca e furat de pe http://delphi.about.com , adica l-am incercat sa fad cum functioneaza si l-am modificat o tzara Tongue) l-am scris mai jos. Am 2 forme, pe prima un buton (Button1 etichetat "Form 2")  si o eticheta (Label1)  si pe a doua o casuta text (Edit1) si un buton "OK" pe care cand se apasa, se inchide Form2 iar pe eticheta Label1 va scrie valoarea din casuta text Edit1. Codul mai jos:

Codul formei 1 (Unit1):
Cod:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var f2: Tform2;
begin
  f2 := TForm2.Create(nil);
  try
    if f2.ShowModal = mrOk then Label1.Caption := f2.Edit1.Text;
  finally
    f2.Release;
  end;
end;

end.


Sa nu uitam ca proprietatea ModalResult a butonului de pe forma 2 (Form2) e setata la valoarea mrOK. Codul formei 2:

Cod:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

end.


Dupa cum ati vazut, in forma 2 nu exista cod introdus manula. Puteam, de asemenea, sa cream o functie in forma 2 care returneaza niste valori (sau un set de valori) si sa o apelam in forma 1 la apasarea pe buton. Spor la treaba!
Memorat

"All we have to decide is what to do with the time that is given to us" (Gandalf)
Shocker
*

Deconectat Deconectat

Mesaje: 410

WWW
[Delphi] Comunicare intre forme, Mar 05, 2007, 19:39

Ti-am editat postul astfel incat sa parseze BBCode-ul sa arate mai frumos postul Smile

Cateva precizari:

Cod:

procedure TForm1.Button1Click(Sender: TObject);
var f2: Tform2;
begin
  f2 := TForm2.Create(nil);
  try
    if f2.ShowModal = mrOk then Label1.Caption := f2.Edit1.Text;
  finally
    f2.Release;
  end;
end;

Nu stiu de ce te-ai chinuit cu o variabila, poti pur si simplu sa dai:
Cod:

procedure TForm1.Button1Click(Sender: TObject);
begin
if Form2.ShowModal = mrOk then Label1.Caption := Form2.Edit1.Text;
end;


Si inca ceva: ar trebui sa verifici daca Form-ul pe care incerci sa il faci modal nu e vizibil in momentul respectiv, deoarece un form vizibil deja NU poate fi facut Modal [in caz contrar programul o sa 'ridice' o exceptie tip EInvalidOperation cu mesajul "Cannot make a visible window modal"]
Memorat


Just wake me up when everything's less overwhelming..., btw ShockingSoft is back !
Freakz only
Comics of the day
cthackers
*

Deconectat Deconectat

Mesaje: 13

[Delphi] Comunicare intre forme, Aug 18, 2007, 15:00

cu prima varianta merge doar daca Form2 nu este creat in project. daca e nu mai are nici un rost TForm2.Create(nil);

Cod:


begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  //  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

Memorat

Opriti pamantul vreau sa cobor!
SkullAds
Ecspert
ReclAmator
* * * * *
Google AdSense

Gen: Bărbat
Mesaje: Multe

Reclama AdSense,
 

 
   


Pagini: [1]
  Imprimă  
 
Schimbă forumul:  

Ethical hacking and programming community
Powered by SMF 1.1.7 | SMF © 2006-2008, Simple Machines LLC
Traducerea în limba română © 2006-2007 www.smf.ro