Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Form1 koja prikazuje Form2; Form2 menja Form1 real-time

[es] :: C/C++ programiranje :: Form1 koja prikazuje Form2; Form2 menja Form1 real-time

[ Pregleda: 2542 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

tokajac

Član broj: 93240
Poruke: 123
*.dynamic.sbb.co.yu.



+5 Profil

icon Form1 koja prikazuje Form2; Form2 menja Form1 real-time08.02.2008. u 22:52 - pre 197 meseci
Form1 ima EditA ButtonA;

Form2 ima EditB i ButtonB;


U kodu Form1 se pritiskom na ButtonA otvara Form2

Code:

 Form1::ButtonAClick()
 {
    Form2 *fr2 = new Form2(this); 
    fr2->ShowModal();
 }


Sad sledi problem:

Stoji mi otvorena Form2 a u pozadini je Form1;
Ispunim EditB polje Form2 i klikom na dugme ButtonB hocu da se EditB->Text (Form2) prepishe u EditA->Text(Form1), ALI MOMENTALNO .


Chesto je diskutovan slucaj da se vrednost prepishe nakon zatvaranja, ali ja hocu da mi Form2 ostane otvorena.
Dakle na svaki klik ButtonB-a treba da se prepishe text polje iz EditB u EditA i da se to odmah vidi 'u pozadini'.


Pozdrav!
 
Odgovor na temu

peka
Beograd

Član broj: 3947
Poruke: 124
*.dynamic.sbb.co.yu.



+2 Profil

icon Re: Form1 koja prikazuje Form2; Form2 menja Form1 real-time09.02.2008. u 02:27 - pre 197 meseci
U konstruktoru Form2 prosledi pokazivac na Form1 i zapamti to u neku promenljivu.

Code:

Form1 *roditelj;

Form2(Form1 * r)
{
    ...

    roditelj = r;
}


Onda upisi sta hoces u roditelj->EditB->Text.

IRC is just multiplayer notepad.
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Form1 koja prikazuje Form2; Form2 menja Form1 real-time09.02.2008. u 07:11 - pre 197 meseci
u unit2.cpp dodaj liniju

Code:
#include "unit1.h"  // zaglavlje prve forme


Prva forma ne bi trebala biti dinamički alocirana kako bi joj što jednostavnije pristupio. Nakon toga, u unit2.cpp prilikom klika na gumb dodaj:

Code:
Form1->EditA->Text = EditB->Text;


To bi trebalo biti to...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Form1 koja prikazuje Form2; Form2 menja Form1 real-time09.02.2008. u 07:35 - pre 197 meseci
Koliko je meni poznato, osvežavanje Edit-a (koji je u pozadini za vreme promene) radi bez problema, ali da vidimo.
Citat:

U kodu Form1 se pritiskom na ButtonA otvara Form2
Code:

Form1::ButtonAClick()
{
   Form2 *fr2 = new Form2(this); 
   fr2->ShowModal();
}


Ovde moram da primetim par stvari:

1) Form2 *fr2 = new Form2(this); treba da bude TForm2 *fr2 = new TForm2(this);, sem ako nisi preimenovao tip podataka, odnosno uklonio ono T. To u BCB moze da bude zbunjujuce, jer po defaultu BCB pravi formu po modusu: tip (klasa) je TForm1 a pointer na nju Form1.

2) BCB Meni > Project > Options > Forms
Da li ti je Form2 u sekciji Auto-create forms ili u sekciji Available forms?

* Ako je u Auto-create forms onda ti ne treba uopšte TForm2 *fr2 = new TForm2(this); jer je forma već kreirana, dovoljno je ShowModal()

* Ako je u Available forms onda ti treba i jedno delete na kraju (možda čak i sa NULL-ovanjem pointeran nakon toga):
Code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TForm2 *fr2 = new TForm2(this);
   fr2->ShowModal();
   delete fr2;
   fr2=NULL;
}

ili STL/auto_ptr varijantu:
Code:

// ...
#include <memory>
// ...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   std::auto_ptr<TForm2> fr2( new TForm2(this) );
   fr2->ShowModal();
}



Citat:

Ispunim EditB polje Form2 i klikom na dugme ButtonB hocu da se EditB->Text (Form2) prepishe u EditA->Text(Form1),

Code:

void __fastcall TForm2::Button1Click(TObject *Sender)
{
   Form1->Edit1->Text = Edit1->Text;
}


Citat:

ALI MOMENTALNO .

Ovo gore i treba da radi momentalno, ali ipak (ako kažeš da neće), možeš da dodaš i jedan Update().
Code:

void __fastcall TForm2::Button1Click(TObject *Sender)
{
   Form1->Edit1->Text = Edit1->Text;
   Form1->Edit1->Update();
}


Citat:

Chesto je diskutovan slucaj da se vrednost prepishe nakon zatvaranja, ali ja hocu da mi Form2 ostane otvorena.
Dakle na svaki klik ButtonB-a treba da se prepishe text polje iz EditB u EditA i da se to odmah vidi 'u pozadini'.

Postoje brojni Invalidate(), Repaint(), Update() koji rade sličnu stvar, ali ja ipak mislim da je u tvom slučaju neki problem sa 'gađanjem' prave forme.


Pozdrav.
 
Odgovor na temu

tokajac

Član broj: 93240
Poruke: 123
*.dynamic.sbb.co.yu.



+5 Profil

icon Re: Form1 koja prikazuje Form2; Form2 menja Form1 real-time09.02.2008. u 10:50 - pre 197 meseci
Hvala na odgovorima!

Pre svega napomena: Dinamicko je kreiranje (sve forme se nalaze u Available Forms, a ne u Auto-Create).
Na osnovu smernica sam dosao do sledeceg resenja (zasada radi):

u .h file Form2, nakon #include dela, ide:
Code:

class TForm1;                //!!!


u .cpp file Form2 ide:
Code:

#include "Form1.h"


default konstruktor sam promenio ( TComponent sam zamenio sa TForm1 ) i iznad konstruktora sam inicijalizovao:
Code:

TForm2 *Form2;
TForm1 *pozivac;

__fastcall TSutGol::TSutGol(TForm1* Owner)
        : TForm(Owner)
{
   pozivac = Owner;
}


Kreiranje i prikaz instance tipa TForm2:
Code:
  
   TForm2 *fr2 = new TForm2(this);
   fr2->ShowModal();
   delete fr2;
   fr2=NULL;


Klik na dugme:
Code:

void __fastcall TForm2::Button1Click(TObject *Sender)
{
   pozivac->EditA->Text = EditB->Text;
}




Jel ima kritika za ovaj princip? Curenje memorije, brzina itd.? Bitno mi je da kod bude sto chistiji. Zbog ostalog ponasanja ne mogu da postavim Form1 u AutoCreate.
Sta je ta STL/auto_ptr varijanta? Ako/kad nadjesh vremena, X Files, napishi sustinu ili bachi link. Dotle, odo' na google...


Pozdrav!


P.S.
Izvinjavam se za nepotpuno postavljanje problema.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Form1 koja prikazuje Form2; Form2 menja Form1 real-time09.02.2008. u 11:43 - pre 197 meseci
Ako kažeš da kod koji si postavio radi, onda radi ;) Ipak, mislim da imaš 'višak delova'.

Dakle, imaš dve forme:
1. Form1 (glavna), odnosno Unit1.cpp/Unit1.h
2. Form2 (modalni dijalog koji ćeš pozivati iz glavne forme), odnosno Unit2.cpp/Unit2.h

S obzirom da iz Form1 (glavne) pozivaš Form2 (dijalog), u Form1 (Unit1.cpp) moraš da staviš:
#include "Unit2.h"
... da bi Form1 znala prototip klase TForm2, odnosno kako njome da rukuje.

S obzirom da iz Form2 (dijalog) želiš da menjaš Form1 (glavnu), u Form2 (Unit2.cpp) moraš da staviš:
#include "Unit1.h"
... da bi Form2 znala prototip klase TForm1, odnosno, uglavnom je to zbog dela:
extern PACKAGE TForm1 *Form1;
... ali da ne detaljišem.

Na osnovu gore rečenog, mislim da je kod tebe sledeće višak:

1)
Citat:

u .h file Form2, nakon #include dela, ide:
class TForm1;

... jer ako si već dodao #include "Unit1.h", kompajler će znati da TForm1 klasa postoji, ne treba eksplicitno navoditi.

2)
Citat:

default konstruktor sam promenio ( TComponent sam zamenio sa TForm1 ) i iznad konstruktora sam inicijalizovao:

TForm2 *Form2;
TForm1 *pozivac;

__fastcall TSutGol::TSutGol(TForm1* Owner)
: TForm(Owner)
{
pozivac = Owner;
}

Opet nema potrebe, jer ako si već dodao #include "Unit1.h", kompajler će znati za:
extern PACKAGE TForm1 *Form1;
... odnosno 'znaće' za Form1 pointer preko koga direktno pristupaš glavnoj formi. Drugim rečima, nisu ti potrebni pomoćni pointeri (TForm1 *pozivac;). To znači da umesto:
Code:

void __fastcall TForm2::Button1Click(TObject *Sender)
{
   pozivac->EditA->Text = EditB->Text;
}

možeš da napišeš (kao što itf reče):
Code:

void __fastcall TForm2::Button1Click(TObject *Sender)
{
   Form1->EditA->Text = EditB->Text;
}

... a da pri tome:
* ne stavljš eksplicitni class TForm1;
* ne menjaš konstruktor
* ne definišeš pomoćne pointere


Pozdrav.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Form1 koja prikazuje Form2; Form2 menja Form1 real-time

[ Pregleda: 2542 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.