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

Pomoc oko dinamickog kreiranja klasa

[es] :: C/C++ programiranje :: Pomoc oko dinamickog kreiranja klasa

[ Pregleda: 3998 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

DART_VEJDER
crna gora

Član broj: 58050
Poruke: 84
*.crnagora.net.



Profil

icon Pomoc oko dinamickog kreiranja klasa02.08.2006. u 23:42 - pre 214 meseci
Imam jedan problem:

na Form1 imam ListBox1 u koji ucitam neke Items.
Dvoklikom na taj ListBox dinamicki kreiram klasu TOdabir koja je ustvari Form-a sa Label-om na njoj i na tom Labelu se prikazuje sta sam odabrao iz ListBox-a:


Odabir = new TOdabir(Form1);
Odabir->Label1->Caption=Form1->ListBox1->Items->Strings[Form1->ListBox1->ItemIndex];
Odabir->Show(); //treba mi da mogu raditi u Form1 i kada se otvori Odabir...

E meni treba sljedece:

Kada uradim dvoklik na ListBox da se Odabir kreira samo ako vec nije kreiran Odabir koji odgovara tom Item-u u ListBox-u, a ako je vec kreiran taj Odabir onda samo da se postavi u fokus...(da bude ta forma aktivna)

kako da to uradim?
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Pomoc oko dinamickog kreiranja klasa03.08.2006. u 07:15 - pre 214 meseci
// netestirano

--- Unit1.h (glavna forma) ---

Code:

// ... public:
__fastcall ~TForm1();
// ...


--- Unit1.cpp (glavna forma) ---

Code:

// ...
#include "Unit2.h"
// ...
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   Form2 = NULL;
}
__fastcall TForm1::~TForm1()
{
   if ( Form2 )
      delete Form2;
}
void __fastcall TForm1::ListBox1DblClick(TObject *Sender)
{
   if ( ! Form2 )
      Form2 = new TForm2( this );
   // ovde bi prethodno mozda trebala provera da li je IntemIndex u granicama,
   // iako DblClick reaguje samo kada je na Itemu...
   Form2->Label1->Caption = Form1->ListBox1->Items->Strings[ Form1->ListBox1->ItemIndex ];
   SetWindowPos( Form2->Handle, HWND_TOPMOST, Form2->Left, Form2->Top, Form2->Width, Form2->Height, SWP_NOSIZE );
   Form2->Show();
}


--- Unit2.cpp (Form2) ---

Project / Options / Forms / Form2 (prabaciti prethodno u Available sekciju)

Code:

void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
   Action = caFree; //  mislim da je ovo dovoljno, tj. da ne treba: delete Form2;
   Form2 = NULL;
}



Mada, kad bolje razmislim, u principu ti i ne treba dinamicko kreiranje. Dovoljno je da
manipulises sa Visible==true/false, a da forma bude uvek kreirana.



[Ovu poruku je menjao X Files dana 03.08.2006. u 09:46 GMT+1]
 
Odgovor na temu

DART_VEJDER
crna gora

Član broj: 58050
Poruke: 84
*.crnagora.net.



Profil

icon Re: Pomoc oko dinamickog kreiranja klasa03.08.2006. u 12:54 - pre 214 meseci
Hvala na odgovoru, ali bojim se da nisi najbolje shvatio moju problematiku:

Ako u ListBoxu imam 10 redova, onda dvoklikom na neki Item hocu da dinamicki kreiram Form2 sa panelom i to zelim da Form2 mogu kreirati za svaki Item, dakle u ovom slucaju 10 Form-i 2...a ne da imam jedan Form2 za sve pa da mu se mjenja caption samo...

E, ali hocu da sprijecim da za neki Item vise puta otvaram odgovarajucu Form2 vec ako je za taj Item otvorena Form2 (kreirana) onda da se samo ta fokusira...

nadam se da sam sad malo ljepse objasnio...??
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.55.*



+9 Profil

icon Re: Pomoc oko dinamickog kreiranja klasa03.08.2006. u 13:38 - pre 214 meseci
Pokušaj nešto ovako:

Code:
// globalna deklaracija:
int* otvoreno;
TForm2* Prozor;

// U FormCreate...
otvoreno = new int[ListBox1->Items->Count];
for(int i = 0; i < ListBox1->Items->Count; i++)
     otvoreno[i] = 0;  

// kada se napravi dvoklik na neku stavku u listboxu...
if(otvoreno[ListBox1->ItemIndex]){
    Prozor = new TForm2(this);
    otvoreno[ListBox1->ItemIndex] = 1;
    // ... dodaj što već želiš...
    Prozor->Show();
}
else
    ShowMessage("Prozor je već otvoren");


Ovo sad pišem potpuno napamet, pa bi to trebalo malo doraditi. Jedini je problem gdje izvršiti dealokaciju prozora jer tebi treba funkcija Show, a ne ShowModal. Prilikom dealokacije prozora treba i vrijednost elementa otvoreno[ListBox1->ItemIndex] vratiti u vrijednost 0. Ako hoćeš izvršiti fokusiranje, onda bih ti preporučio korištenje dvostrukih pokazivača na TForm2. Tada preko indeksa u ListBoxu odmah znaš i koji prozor trebaš fokusirati ako je taj isti već otvoren.

[Ovu poruku je menjao itf dana 03.08.2006. u 14:48 GMT+1]
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Pomoc oko dinamickog kreiranja klasa03.08.2006. u 14:09 - pre 214 meseci
Da li je taj ListBox fiksan sto se tice elemenata?
Da li su moguci duplikati u ListBox-u?
Sta bi trebalo da se dogadja kada na primer dodas ili uklonis neku stavku iz ListBox-a,
tj. sta bi trebalo tada da se dogodi sa prozorom ciji je element uklonjen?

 
Odgovor na temu

DART_VEJDER
crna gora

Član broj: 58050
Poruke: 84
*.crnagora.net.



Profil

icon Re: Pomoc oko dinamickog kreiranja klasa03.08.2006. u 23:06 - pre 214 meseci
Citat:
Da li je taj ListBox fiksan sto se tice elemenata?


Ne! Elementi se u toku rada mjenjaju....tj. ne po jedan ili dva elementa nego citav set Item-a...U tom slucaju se Form2 moraju dealocirati...


Citat:
Da li su moguci duplikati u ListBox-u?


Ne. Nema duplikata...


Citat:
Sta bi trebalo da se dogadja kada na primer dodas ili uklonis neku stavku iz ListBox-a,
tj. sta bi trebalo tada da se dogodi sa prozorom ciji je element uklonjen?


Stavke iz ListBox-a se ne mogu obrisati. Moze se samo ucitati novi set vrijednosti...
u tom slucaju se svi Form2 moraju dealocirati...

Evo da bude lakse (Radi OnChange event-a) upotrebite TListView umjesto ListBox-a,...
njega ustvari i koristim...Ista je znaci stvar. Ja u toku rada ubacim Iteme u listView, i potrebno mi je na dvoklik isto ono sto sam rekao:

////-----------------ListView Double Click----------------------------
if(ListView1->Selected!=NULL)
{
Form2 = new TForm2(this);
Form2->Panel1->Caption=ListView1->Selected->Caption;
Form2->Show();
}
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.55.*



+9 Profil

icon Re: Pomoc oko dinamickog kreiranja klasa04.08.2006. u 08:28 - pre 214 meseci
Je li ovdje riječ o podacima iz baze podataka?
 
Odgovor na temu

DART_VEJDER
crna gora

Član broj: 58050
Poruke: 84
*.crnagora.net.



Profil

icon Re: Pomoc oko dinamickog kreiranja klasa04.08.2006. u 11:54 - pre 214 meseci
pa da...

u stvari i jeste...

imena tabela se prikazuju u ListView-u i dvoklikom zelim da mi se otvori Form2 na kojoj imam ADOTable i DBGrid i naravno, naslucujete:

Code:

Form2=new TForm2(this);
Form2->ADOTable1->TableName=ListView1->Selected->Caption; // ili ako bude trebalo: ...= "[" + ListView1->Selected->Caption + "]"
ADOTable->Active=true;
.
..//podesim jos po nesto...
Form2->Show();




i zelim da vidim sadrzaj te tabele....

Ma u sustini meni je samo vazno ono da mi se ne otvara vec otvorena tabela, zato sam i rekao da ne bih komplikovao da mi na Form2 ima neki Panel...Da bi bilo lakse za objasiti...I naravno vazno je da kod ucitavanja neke druge baze (imena njenih tabela u ListView) da se svi otvoreni Form2 od prosle baze dealociraju...

Ali eto sad znate citavu sustinu.... kako bih mogao to uraditi...

(Napomena: itf: jos nisam stigao, ako mi vjerujes, probati onaj tvoj zadnji post sa kodom, evo tek cu sada...nisam najbolje gledao, mozda si ti i dao vec odgovor?? izvinjavam se ako je tako...)


malko oftopic:

eh kako bi fino bilo kada bi mogao mjenjati u toku rada imena klasa

npr kao:

ListView1->Selected->Caption = new TForm2(this); //dakle kreiramo klasu tipa TForm2 kojoj damo ime u Run Time-u...

i kasnije samo dealociramo klasu koja se zove "ListView1->Selected->Caption" i provjeravamo (if("ListView1->Selected->Caption")) da vidimo da li je vec kreirana...

steta sto ovaj koncept ne postoji...
ili ako postoji, ja ga ne znam primjeniti...




[Ovu poruku je menjao DART_VEJDER dana 04.08.2006. u 13:05 GMT+1]
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
 
Odgovor na temu

DART_VEJDER
crna gora

Član broj: 58050
Poruke: 84
*.crnagora.net.



Profil

icon Re: Pomoc oko dinamickog kreiranja klasa04.08.2006. u 12:38 - pre 214 meseci
hmmm...

ovo rijesenje koje je itf dao je fino...

naravno sa par izmjena:
Code:

//------------ heder od Form1---------

public:
int* otvoreno;  // da mu mogu pristupiti i iz Form2

--------------------------------------    

//-------------heder of Form2------
public:
int indeks;  // pokazuje kojem elementu niza otvoreno (tj ListBox-a odgovara konkretna form2

-------------------------

void __fastcall TForm1::ListBox1DblClick(TObject *Sender)
{
if(!otvoreno[ListBox1->ItemIndex])
{
Prozor = new TForm2(this);
otvoreno[ListBox1->ItemIndex] = 1;
Prozor->indeks=ListBox1->ItemIndex; // govorim kojem Item-u novokreirani Form2 pripada...
.
.
.
}
-------------------------------

void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
Form1->otvoreno[indeks]=0; // stavljam na nulu onaj element niza za koji je Form2 vezan kako bih Form2 za taj element mogao ponovo otvoriti
Action = caFree; //  Da li je ovo dovoljna dealokacija?? Milsim: da li je to to??i treba li Form2=NULL u ovom slucaju?
   Form2 = NULL;//   
}

---------------------------------------

a u itf-ovom kodu se jedino treba izmjeniti:

nije
Code:

if(otvoreno[ListBox1->ItemIndex])
vec
if(!otvoreno[ListBox1->ItemIndex])

i inicijalizaciju elemenata niza "otvoreno" sam stavio u OnShow event... Nesto sam tako sigurniji??Ili da stavim u konstruktor??(i koji: FormCreate ili onaj generisani od strane Borlanda??)


Da li je sve ovo rijesenje problema ili mogu ocekivati neko pucanje memorije ili slicno i ima li neki elegantniji nacin da se uradi sve ovo??
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
 
Odgovor na temu

[es] :: C/C++ programiranje :: Pomoc oko dinamickog kreiranja klasa

[ Pregleda: 3998 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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