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

Dijalog ne deluje na kontrole forme

[es] :: C/C++ programiranje :: Dijalog ne deluje na kontrole forme

[ Pregleda: 3522 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
*.dynamic.sbb.co.yu.



+4 Profil

icon Dijalog ne deluje na kontrole forme20.10.2006. u 10:18 - pre 212 meseci
Da li neko zna zasto u nekim slicajevima nije moguce delovati iz dijaloga na kontrole u formi,npr ovo:
Code:

#include "Proizvodi.h"
...
void __fastcall TOKBottomDlg::CancelBtnClick(TObject *Sender)
{
 FormaProizvoda->ComboBox5->Text = "";//<<--ovde zakucava
 OKBottomDlg->Hide();
}

daje Access violation i debugger pokazuje ovu liniju u kodu.
"Proizvodi.h" je ukljucen u "OKCANCL1.cpp" (i obrnuto,OKCANCL1.h u Proizvodi.cpp).
Ag + Na -> Xe
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.iplannetworks.net.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Dijalog ne deluje na kontrole forme20.10.2006. u 13:28 - pre 212 meseci
Acces violation se desava kad se pristupi pointeru koji nije validan. Najverovatnije nisi kreirao tu formu ili nisi dodelio ispravnu vrednost tom pointeru. Da bi video tacno sta se desava u tvoj cpp dodaj seledeci kod:
Code:
#include "Proizvodi.h"
#include <cassert>
...
void __fastcall TOKBottomDlg::CancelBtnClick(TObject *Sender)
{
 assert(FormaProizvoda);
 assert(FormaProizvoda->ComboBox5);
 FormaProizvoda->ComboBox5->Text = "";//<<--ovde zakucava
 OKBottomDlg->Hide();
}

Ako je forma NULL ili ako combobox nije kreiran dobices tacnu poruku o tome. Inace dobra je praksa stavljati assert upravo zbog ovakvih slucajeva.


Tko leti vrijedi
 
Odgovor na temu

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
*.dynamic.sbb.co.yu.



+4 Profil

icon Re: Dijalog ne deluje na kontrole forme23.10.2006. u 09:30 - pre 212 meseci
Kada se stavi assert, pokaze se greska: Assertion failed, OKCANCL1.cpp, line 21,
sto bas i nije od neke pomoci
Ag + Na -> Xe
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.iplannetworks.net.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Dijalog ne deluje na kontrole forme23.10.2006. u 14:43 - pre 212 meseci
I sta sad? Ja treba da ti debagujem aplikaciju?
Lepo sam ti rekao: Ili promenjiva FormaProizvoda nije inicijalizovana ili combo nije kreiran.


Tko leti vrijedi
 
Odgovor na temu

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
212.200.220.*



+4 Profil

icon Re: Dijalog ne deluje na kontrole forme23.10.2006. u 18:40 - pre 212 meseci
Citat:
kiklop74: I sta sad? Ja treba da ti debagujem aplikaciju?
Lepo sam ti rekao: Ili promenjiva FormaProizvoda nije inicijalizovana ili combo nije kreiran.

Ma ne trebas da mi debagujes aplikaciju frajeru,samo konstatujem kakav efekat ima assert (posto to do
sad nisam koristio)..editor pokazuje onu liniju koju je pokazivao i bez assert. Inace i forma i kontrola su zive
i zdrave (dijalog se poziva iz te forme: "FormaProizvoda").
Hvala ti u svakom slucaju, smislicu vec nesto...
Ag + Na -> Xe
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
89.216.236.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Dijalog ne deluje na kontrole forme23.10.2006. u 20:37 - pre 212 meseci
Moraš da pokažeš malo veći fragment koda, jer ovaj koji si pokazao mislim da je OK.
Proveri da li slučajno imaš *dva* FormaProizvoda pointera, što se u BCB vrlo lako
događa.
Citat:

Da li neko zna zasto u nekim slicajevima nije moguce delovati iz dijaloga na kontrole u formi

Ovo naravno nije tačno. Uvek se može delovati, samo ako je pointer za pristup validan.

Takođe proveri OnChange() od tog Combo-a, da ne proizvede neku glupost.
 
Odgovor na temu

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
*.adsl.sezampro.yu.



+4 Profil

icon Re: Dijalog ne deluje na kontrole forme24.10.2006. u 18:18 - pre 212 meseci
Citat:
X FilesTakođe proveri OnChange() od tog Combo-a, da ne proizvede neku glupost.

Combo i sadrži kod u OnChange() koji poziva onu Locate f-ju koja prikazuje podatke iz dataset-a
u drugim kontrolama dok korisnik menja podatke u tom Combu.Možda mu to smeta.
Ag + Na -> Xe
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
89.216.236.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Dijalog ne deluje na kontrole forme24.10.2006. u 19:40 - pre 212 meseci
Pokušaj da maskiraš deo po de koda sa:

// ...

ili sa:

/*
...
*/

... zavisno od situacije, sve dok ne vidiš šta mu smeta.
 
Odgovor na temu

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
212.200.223.*



+4 Profil

icon Re: Dijalog ne deluje na kontrole forme25.10.2006. u 14:45 - pre 212 meseci
Citat:
X Files: Pokušaj da maskiraš deo po de koda sa:

// ...

ili sa:

/*
...
*/

... zavisno od situacije, sve dok ne vidiš šta mu smeta.


Smeta mu baš ovaj deo: FormaProizvoda->ComboBox5->Text = "";
Kada se komentuje,ništa se ne događa (tj. ne javlja se nikakva greška).
Znači, taj Combo sadrži OnChange() handler,možda je u tome problem,mada
ne znam šta da uradim po tom pitanju-da sklonim taj kod ne mogu jer od toga
zavisi upotrebljivost te forme...ne može da bude ni u vezi sa sakrivanjem dijaloga
pošto se dijalog time ne uništava, nego ostaje u memoriji.
Ag + Na -> Xe
 
Odgovor na temu

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
212.200.221.*



+4 Profil

icon Re: Dijalog ne deluje na kontrole forme29.10.2006. u 10:48 - pre 212 meseci
Pošto sam dao šture informacije u vezi problema koji sam imao,a problem se ponovo javio,sad dajem više
koda koji se odnosi na to (ove metode se nalaze u različitim formama,zato ima include delove između).Ovo
je u osnovi ista stvar kao ono sa dijalogom što sam opisao gore:
Code:


#include "Unit3.h"      //ovo je zaglavlje forme iz koje se poziva forma klase TNovaFaktura

...

void __fastcall TForm3::SpeedButton21Click(TObject *Sender)
{
TNovaFaktura *NovaFaktura = new TNovaFaktura(Application);
}

...

#include "Proizvodi.h"  //ovde je deklarisana forma FormaP:
            //__fastcall TFormaP::TFormaP(TComponent* Owner)
            //        : TForm(Owner)
            //{
            //}

//iz forme NovaFaktura se poziva forma proizvoda:
void __fastcall TNovaFaktura::SpeedButton6Click(TObject *Sender)
{
 TFormaP *formap  = new TFormaP(Application);
}

...

#include "Unit18.h"     //ovde je deklarisana forma NovaFaktura: 
            //__fastcall TNovaFaktura::TNovaFaktura(TComponent* Owner)
            //        : TForm(Owner)
            //{
            //}

//ovde se dodaju stavke iz forme proizvoda (FormaP) u listview forme NovaFaktura:
void __fastcall TFormaP::SpeedButton4Click(TObject *Sender)
{
        //unose se stavke u listview na formi novaFaktura (klase TNovaFaktura)
                TListItem *pItem;
                pItem = NovaFaktura->ListView1->Items->Add(); //ovde mora da bude samo NovaFaktura,jer se tako
                                  //zove i klasa(?) <-- Access violation
                pItem->Caption = ComboBox5->Text;
                pItem->SubItems->Add(Edit2->Text);
                pItem->SubItems->Add(Edit3->Text);
                pItem->SubItems->Add(Edit6->Text);
                pItem->SubItems->Add(ComboBox2->Text);
                pItem->SubItems->Add(Edit8->Text);
                this->Close();
}

Access violation se javlja na mestu unosa stavke u listu na formi NovaFaktura.
Znaci, objekat forme mora da se zove kao klasa da bi se uopste kopajlirao,a u toku izvrsavanja se
zakucava jer se ne može iz neke metode prisupiti objektu koji je ovako instanciran...nadam se da
neko prepoznaje problem...formiraju se objekti formi koje onda "ne prepoznaju" drugi delovi aplikacije (tj. metode),
npr. metoda void __fastcall TFormaP::SpeedButton4Click "ne zna" da postoji objekat "NovaFaktura".


Ag + Na -> Xe
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
89.216.236.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Dijalog ne deluje na kontrole forme29.10.2006. u 17:04 - pre 211 meseci
Onako odokativno:

Code:

void __fastcall TForm3::SpeedButton21Click(TObject *Sender)
{
TNovaFaktura *NovaFaktura = new TNovaFaktura(Application);
}

Ovo ne valja.

Code:

void __fastcall TNovaFaktura::SpeedButton6Click(TObject *Sender)
{
 TFormaP *formap  = new TFormaP(Application);
}

Ni ovo.

Mislim da bi trebalo:

Code:

void __fastcall TForm3::SpeedButton21Click(TObject *Sender)
{
   NovaFaktura = new TNovaFaktura(Application);
}

Ovo ne valja.

Code:

void __fastcall TNovaFaktura::SpeedButton6Click(TObject *Sender)
{
   formap  = new TFormaP(Application);
}


Pri čemu TNovaFaktura i formap treba da budu ili globalni ili u okviru headera klase.
BCB po defaultu ih pravi globalne (pogledaj malo bolje, sigurno su ti vec globalni, inace
ne bi mogvao ni da kompajliras program).

Ti zapravo u svom kodu pristupas NEINICIJALIYOVANIM objektima TNovaFaktura i formap,
a ne onim za koje mislis da im pristupas... otuda i AV.
 
Odgovor na temu

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
*.adsl.sezampro.yu.



+4 Profil

icon Re: Dijalog ne deluje na kontrole forme29.10.2006. u 22:23 - pre 211 meseci
Citat:

Mislim da bi trebalo:

Code:

void __fastcall TForm3::SpeedButton21Click(TObject *Sender)
{
   NovaFaktura = new TNovaFaktura(Application);
}


Code:

void __fastcall TNovaFaktura::SpeedButton6Click(TObject *Sender)
{
   formap  = new TFormaP(Application); <<-- ovde je FormaP umesto formap
}


To je to,sve radi...
Ovo ujedno rešava gorepomenuti problem sa dijalogom.

Veliki pozdrav.
Ag + Na -> Xe
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.3dnet.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Dijalog ne deluje na kontrole forme30.10.2006. u 08:09 - pre 211 meseci
Znao sam odmah o čemu se radi, to sam ti već i rekao:
http://www.elitesecurity.org/t223268-0#1330661

Moraš bolje da paziš (ovako, na prostijem primeru sve je očigledno), dakle:

Code:

int a=0;

void NekaKlasa::NekaMetoda1()
{
   int a=10; // <-- ovo "a" važi samo dok si u bloku, kasnije se uništava i nema veze sa "a" ispred funkcije
}

void NekaKlasa::NekaMetoda2()
{
   NekaMetoda1(); // <-- Uzaludno, nema efekta na globalno "a" koje tebi zapravo treba
   cout << a; // <-- globalno "a"
}


Međutim, u tvom konkretnom primeru, moraćeš još malo da doradiš kod, jer nemaš proveru da
li je neka forma već kreirana, već svaki pritisak na Button kreita novu instancu:

--- Unit1.cpp / Form1 ---
(prethodno Form2 prebaci u Available sekciju - Project / Options / Forms,
tj da naznacimo da cemo mi sami kreirati instance, a ne IDE po defaultu )

Code:

// ...
#include "Unit2.h"
// ...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   if ( ! Form2 ) // <--- ako F2 nije kreirana, prvo kreiraj pa prikazi
   {
      Form2 = new TForm2( Application );
      Form2->Show();

   }
   else
   {
      Form2->Show(); // <--- ako je F2 vec kreirana, nema potrebe za novom intalcom, samo je prikazi.
                             // ... Na primer [X] Close ns F2, ne unistava instancu, samo "sakrije" formu
   }
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
   if ( Form2 ) <--- ovo je unitavanje F2.
      delete Form2;
   Form2 = NULL; <--- dodelili smo NULL, da bi sledeci put bili sigurni sta ispitujemo u Button1
}


 
Odgovor na temu

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
*.dynamic.sbb.co.yu.



+4 Profil

icon Re: Dijalog ne deluje na kontrole forme30.10.2006. u 10:43 - pre 211 meseci
Hvala ti na dodatnim informacijama...
Forme o kojima je rec su vec bile u Available sekciji.

Citat:

Međutim, u tvom konkretnom primeru, moraćeš još malo da doradiš kod, jer nemaš proveru da
li je neka forma već kreirana, već svaki pritisak na Button kreita novu instancu:


Znas kako, to sam vec resio time sto se dugme koje instancira formu onesposobljava posle toga
(dugme->Enabled=false),a u metod OnClose() forme stavim ponovno osposobljavanje dugmeta.
Ag + Na -> Xe
 
Odgovor na temu

[es] :: C/C++ programiranje :: Dijalog ne deluje na kontrole forme

[ Pregleda: 3522 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

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