[ sanivr @ 06.07.2012. 01:12 ] @
Dinamicki kreiram neki element primer Button, kako na kraju taj element da ostane na formi i nakon ponovog startovanje programa. bcb2010. Hvala

Code:

TButton* Button2 = new TButton (Form1);
Button2->Parent = Form1;
[ sanivr @ 07.07.2012. 07:54 ] @
Zasto to meni niko ne odgovara na teme :) cudno :) Trazila sam po netu resenje ali ne znam pod koim kljucnim recima da trazim. Obaj glupi fakultet u mkd je s.... odakle se izucava delphi i c++ a ne c# nije mi jasno :S. Ako moze neko ikako da mi pomogne oko ovoga pls.
[ X Files @ 07.07.2012. 09:45 ] @
Ovo može biti i jednostavno i komplikovano pitanje, koje zahteva poprilican broj koraka.

Pošto dinamički kreiraš objekat, potrebno je negde da zapamtiš to što si uradila, pa da na startovanju ponovis iste korake u nekom dogadjaju.

Jedan od načina je da napraviš neki INI fajl gde ćeš upisivati sve što si dinamički kreirala.

Treba osmisliti strukturu tog INI fajla, tako da može da primi više istih i različitih kontrola, kao i njihovih osobina.

Recimo, možeš ovako:

[Control]
TButton1=Button1
TButton2=Button2

[TButton Properties]
Button1=OVDE STRING KOJI OPISUJE OSOBINE KOJE SU POTREBNE ZA TACNU REGENERACIJU OBJEKTA KAKAV JE BIO RANIJE. NAJVAZNIJ SU: POZICIJA, VELICINA, NASLOV, DOGADJAJI
Button2= ...

(ovo naravno implicira da treba prouciti klasu TIniFile)


Postoje i funkcije WriteComponent ReadComponent koje mogu pomoci oko kreiranja stringa (tekstualnog, naravno) koji je kopija osobina objekta (binarnih, naravno), ali nisu svemoguce, jer C++ Builder malo drugacije radi streaming...

[ sanivr @ 07.07.2012. 18:37 ] @
Znaci trebam pri svako zatvaranje programa proveravati dali imam nesta plus napravljeno, ako ima onda osobine (one meni bitne) ispisem u ini, pri svako startovanje aplikacije treba citatu iz inija creirati te obkjekte i dodeljivati im vredost?
[ X Files @ 07.07.2012. 20:38 ] @
Otprilike bas tako.
Code:

void __fastcall TForm1::FormActivate(TObject *Sender)
 {
    static bool HasPassedOnceOnActivate = false;

    if ( !HasPassedOnceOnActivate )
    {
       HasPassedOnceOnActivate = true;
       // SAMO JEDNOM SE IZVRŠAVA
       // Ovde na primer čitaš INI datoteku, i nekom tehnikom i nekim redosledom ponovo kreiraš objekte i dodeljuješ im vrednosti.
    }
    
    // POTENCIJALNO, VIŠE PUTA SE IZVRŠAVA
 }


Koju ces strategiju upotrebiti, da bi se dinamicki kreirane kontrole ponovo pojavile na formi pri startovanju programa, zavisi od zahteva projekta.

[ sanivr @ 08.07.2012. 01:54 ] @
Hvala na odgovorima resila sam skoro sve probleme :). Samo me iteresuje nesta. Recimo imam PageCotrol sa jednim TabSheet i na njega nekoliko objekta, ima opcija dinamicki da se kreiraju tabsheet i neki drugi objekti, i recimo da su kreirani 40-50 drugi objekti, kada se po prvi put otvori forma/aplikacija jer nema to da potraje. Samo me zanima kako to funkcionise, postoje drugi tezi mogucnosti ili sve se svodi na to. Hvala jos jednom.
[ sanivr @ 14.07.2012. 19:44 ] @
Da ne otvaram novu temu jer je vezano za dinamicko kreiranje. Kad kreiram neki objekt kako posle snjim da upravljam?

Code:


for(int i = Form1->TTest->RecordCount; i>=1; i--)
    {
        Form1->TTest->RecNo = i;
        TPanel *Panel = new TPanel( this );
        Panel->Parent = Form1;
        Panel->Align = alTop;
        Panel->Height = 77;

        TLabel *LTest= new TLabel(Panel);
        LTest->Parent = Panel;
        LTest->Left = 24;
        LTest->Top = 14;
        LTest->Font->Color = clBlue;
        LTest->Font->Size = 11;
        LTest->Font->Style = LTest->Font->Style << fsBold;
        LTest->Caption = "test";
    }


U bazi ako ima 5 zapisa on kreira pet labele, kako posle svakoj labeli da premonim "caption" recimo?
[ ik0 @ 14.07.2012. 20:36 ] @
Jedan nacin je da kreiras nizu od objekta, naprimer kod tebe kreiras oniliko objekta koliko imas zapisa u bazi (bar po primeru). Onda samo gde ti treba LTest[1]->Caption"test"; ... ja tako radim sigurno ima drugi nacin ima mnogo iskusniih od mene ce da ti kazu :)

Code:

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
    //...
    public:
        TLabel *TestLabela[10];
    //...
};
//---------------------------------------------------------------------------
for(int i = Form1->TTest->RecordCount; i>=1; i--)
    {
        Form1->TTest->RecNo = i;
        TPanel *Panel = new TPanel( this );
        Panel->Parent = Form1;
        Panel->Align = alTop;
        Panel->Height = 77;

        TestLabela[i] = new TLabel(Panel);
        TestLabela[i]->Parent = Panel;
        TestLabela[i]->Left = 24;
        TestLabela[i]->Top = 14;
        TestLabela[i]->Font->Color = clBlue;
        TestLabela[i]->Font->Size = 11;
        TestLabela[i]->Font->Style = TestLabela[i]->Font->Style << fsBold;
        TestLabela[i]->Caption = "test";
    }
[ sanivr @ 14.07.2012. 21:08 ] @
Problem je u tome sto ne znam koliko zapisa moze da ima, a i kako iskoristiti neki njegov event OnClick ili bilo koi? Hvala na pmoci.
[ ik0 @ 14.07.2012. 22:09 ] @
Ako bas za OnClik hoces onda moze ovako

Code:

*.h
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
    //...
    public:
        TLabel *TestLabela[10];
        void __fastcall OnClickTestLabela(TObject *Sender);
    //...
};
//---------------------------------------------------------------------------

*.cpp
void __fastcall TForm1::OnClickTestLabela(TObject *Sender)
{
         ShowMessage("OnClickTestLabela");
}

//...
TestLabela[i]->OnClick = OnClickTestLabela;


E sada za MauseMove i te slicne iskreno nisu mi trebale i ne znam :)
[ sanivr @ 15.07.2012. 08:51 ] @
Ne znam tacan broj battone ili labele nebitno, sto ako imam 1000 treba mi 1000 funkcija...Valjda postoi neki nacin da se koriste sve evente od taj objekt?
[ sanivr @ 15.07.2012. 15:36 ] @
Znaci obrbula sam net da nadjem kako da kreiram dinamicki event, ni jedan primer za c++ :S Jer moze neko da mi objasni kako da kreiram KeyPress event i kako ga upotrebiti t.e dati nekom objektu. Molim vas :)
[ itf @ 15.07.2012. 20:05 ] @
Vidi da li ti ovo odgovara:

Code:

TButton** Buttons;
bool allocated = false; 
//---------------------------------------------------------------------------
void __fastcall TForm1::OnButtonsClik(TObject *Sender)
{
    TButton* pGumb = dynamic_cast<TButton*>(Sender);
    ShowMessage("Ja sam " + pGumb->Caption);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(allocated) return;
    // creating TButton pointers
    Buttons = new TButton*[8*8];
    for(int i = 0; i < 8; i++)
        for(int j = 0; j < 8; j++)
        {
            Buttons[i*8 + j] = new TButton(this);
            Buttons[i*8 + j]->Parent = this;
            Buttons[i*8 + j]->Caption = UnicodeString(char(i+65)) + IntToStr(j + 1);
            Buttons[i*8 + j]->Left = 10 + i*50;
            Buttons[i*8 + j]->Top = 30 + j*25;
            Buttons[i*8 + j]->Width = 50;
            Buttons[i*8 + j]->Height = 25;
            Buttons[i*8 + j]->OnClick = OnButtonsClik; // OnClick event...
        }
    allocated = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    if(!allocated) return;
    for(int i = 0; i < 64; i++)
        delete Buttons[i];
    delete[] Buttons;
}
[ sanivr @ 15.07.2012. 21:10 ] @
Zar nije ovo isto kao i ik0 sto je reko :) Nego vec kad si napiso morala sam te nesto pitati (procitala da si nastavnik ili asistent). Mozda sam preskocila taj cas ili to nije bilo, sto znaci TButton** Buttons sto dva pokazivaca? i Buttons = new TButton*[8*8]; (Tako malo su predavali na fakultetu da je to strasno pa zato pitam ako nije slozeno odgovori i hvalati za odgovor.)
[ itf @ 15.07.2012. 22:25 ] @
VCL komponente se moraju kreirati preko pokazivača operatorom new (dinamički). Ako je riječ o jednom objektu onda je riječ o jednom pokazivaču:

TButton* objekt;

ali ako je riječ o više objekata (polju objekata) tipa TButton onda je riječ o pokazivaču na to polje objekata (pokazivaču na pokazivač) tj.

TButton** Buttons;

Sada zapravo kažeš koliko objekata (TButton pokazivača) želiš;

Buttons = new TButton*[8*8]; // 64 TButtona

I naravno, u FormClose se ti pokazivači moraju deinicijalizirati.

[ sanivr @ 16.07.2012. 01:20 ] @
Evo ja dok sam cekala odgovore probala sam nesto sama da odradim pa kazi mi gde sam gresila. Hvalati mnooooogo mi je pomoglo ovo.

Code:

LoginForma *Operatori[100];  //treba mi (Form1->ADOTable1->RecordCount) ali ovde nisam migla nikako da ogranicim

for(int i = Form1->ADOTable1->RecordCount; i>=1; i--)
        {
            Operatori[i] = new LoginForma;

            Form1->TOperatori->RecNo = i;

            Operatori[i]->PPanel = new TPanel( this );
            Operatori[i]->PPanel->Parent = ScrollBox1;
            Operatori[i]->PPanel->Align = alTop;
            Operatori[i]->PPanel->Height = 77;
            Operatori[i]->PPanel->BevelOuter = bvLowered;

            Operatori[i]->LOperatorIme = new TLabel( this );
            Operatori[i]->LOperatorIme->Parent = Operatori[i]->PPanel;
                        //...


            Operatori[i]->LPrivilegija = new TLabel( this );
            Operatori[i]->LPrivilegija->Parent = Operatori[i]->PPanel;
            Operatori[i]->LPrivilegija->Left = 16;
            Operatori[i]->LPrivilegija->Top = 38;
                        //...

            Operatori[i]->LSifra = new TLabel( this );
            Operatori[i]->LSifra->Parent = Operatori[i]->PPanel;
            Operatori[i]->LSifra->Left = 296;
            Operatori[i]->LSifra->Top = 15;
                        //...

            Operatori[i]->LLozinka = new TLabel( this );
            Operatori[i]->LLozinka->Parent = Operatori[i]->PPanel;
            Operatori[i]->LLozinka->Left = 290;
            Operatori[i]->LLozinka->Top = 40;
                        //...

            Operatori[i]->LSifraSifra = new TLabel( this );
            Operatori[i]->LSifraSifra->Parent = Operatori[i]->PPanel;
            Operatori[i]->LSifraSifra->Top = 13;
                        //...

            Operatori[i]->ELozinka = new TEdit( this );
            Operatori[i]->ELozinka->Parent = Operatori[i]->PPanel;
            Operatori[i]->ELozinka->Left = 342;
            Operatori[i]->ELozinka->Top = 13;
            Operatori[i]->ELozinka->OnKeyPress = Operatori[i]->EditKeyPress1;
                        //...

            Operatori[i]->BPrijavi = new TButton( this );
            Operatori[i]->BPrijavi->Parent = Operatori[i]->PPanel;
            Operatori[i]->BPrijavi->Top = 18;
            Operatori[i]->BPrijavi->Left = 624;
            Operatori[i]->BPrijavi->OnClick = Operatori[i]->ButtonKlik;
                        //...

        }

H
//---------------------------------------------------------------------------
class TForm1: public TForm
{
__published:    // IDE-managed Components

private:    // User declarations
public:        // User declarations
      TButton *Button1;
      void __fastcall Button152Click(TObject *Sender);


        __fastcall TForm1(TComponent* Owner);
};

class LoginForma
{
    
    public:
        TButton *BPrijavi;
        TEdit *ELozinka;
        TPanel *PPanel;
        TLabel *LOperatorIme;
        TLabel *LPrivilegija;
        TLabel *LSifra;
        TLabel *LLozinka;
        TLabel *LSifraSifra;


        int ID_Operator;
        int IDPrivilegija;
        AnsiString Ime;
        AnsiString Prezime;
        AnsiString Sifra;
        AnsiString Lozinka;

        void __fastcall ButtonKlik(TObject *Sender)
        {
            if(ELozinka->Text==Lozinka)
            {
             TForm1 *a;
             a->Button1( BPrijavi );
            }
            else
             ShowMessage("Greska pass");
        }

        void __fastcall EditKeyPress1(TObject *Sender, wchar_t &Key)
        {
            if(Key == 13)
            ButtonKlik( BPrijavi );
        }
};

//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif