Dynamicznie tworzone MainMenu

dział ogólny

Dynamicznie tworzone MainMenu

Nowy postprzez Frani0 » sobota, 9 maja 2009, 06:02

Witam czy wiecie jak dynamicznie tworzyć Menu górne? tak jak to się dzieje chociażby w firefox'ie(Zakładki)
Avatar użytkownika
Frani0
Bladawiec
Bladawiec
 
Posty: 48
Dołączył(a): poniedziałek, 25 sierpnia 2008, 18:23
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Dynamicznie tworzone MainMenu

Nowy postprzez wargo » sobota, 9 maja 2009, 20:14

Rozumiem że chodzi o tworzone pozycje w menu?
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Dynamicznie tworzone MainMenu

Nowy postprzez Frani0 » niedziela, 10 maja 2009, 03:51

zgadza się podobnie jak tu http://forum.ks-ekspert.pl/index.php?s= ... opic=90077 tyle że w C++ chyba wystarczy przeżucić to na C++"(sender as TMenuItem).tag" ale nie wiem jak to przeżucić
Avatar użytkownika
Frani0
Bladawiec
Bladawiec
 
Posty: 48
Dołączył(a): poniedziałek, 25 sierpnia 2008, 18:23
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Dynamicznie tworzone MainMenu

Nowy postprzez Cyfrowy Baron » niedziela, 10 maja 2009, 09:08

Można tak:

w pliku nagłówkowym np. unit1.h:
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp> // WAŻNE! - trzeba dodać
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
private:   // User declarations
            // zdarzenia OnClick dla różnych pozycji MainMenu
            void __fastcall OpenClick(TObject *Sender);
            void __fastcall SaveClick(TObject *Sender);
            void __fastcall CopyClick(TObject *Sender);
            void __fastcall SubClick(TObject *Sender);
            void __fastcall Sub2Click(TObject *Sender);
public:      // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


w pliku źródłowym:
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <memory> // WAŻNE! - tutaj ze względu na sposób tworzenia TMenuItem trzeba dodać
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
TMainMenu *MainMenu1 = new TMainMenu(this);

std::auto_ptr<TMenuItem> Item1(new TMenuItem(NULL));
Item1->Caption = "Plik";
MainMenu1->Items->Add(Item1.release());

std::auto_ptr<TMenuItem> Item2(new TMenuItem(NULL));
Item2->Caption = "Otwórz";
MainMenu1->Items->Items[0]->Add(Item2.release());
MainMenu1->Items->Items[0]->Items[0]->OnClick = OpenClick;

std::auto_ptr<TMenuItem> Item3(new TMenuItem(NULL));
Item3->Caption = "Zapisz";
MainMenu1->Items->Items[0]->Add(Item3.release());
MainMenu1->Items->Items[0]->Items[1]->OnClick = SaveClick;
/**/
std::auto_ptr<TMenuItem> Item1_1(new TMenuItem(NULL));
Item1_1->Caption = "Edycja";
MainMenu1->Items->Add(Item1_1.release());

std::auto_ptr<TMenuItem> Item2_1(new TMenuItem(NULL));
Item2_1->Caption = "Kopjuj";
MainMenu1->Items->Items[1]->Add(Item2_1.release());
MainMenu1->Items->Items[1]->Items[0]->OnClick = CopyClick;

std::auto_ptr<TMenuItem> Item2_2(new TMenuItem(NULL));
Item2_2->Caption = "Opcje";
MainMenu1->Items->Items[1]->Add(Item2_2.release());

std::auto_ptr<TMenuItem> Item2_2s(new TMenuItem(NULL));
Item2_2s->Caption = "Submenu 1";
MainMenu1->Items->Items[1]->Items[1]->Add(Item2_2s.release());
MainMenu1->Items->Items[1]->Items[1]->Items[0]->OnClick = SubClick;

std::auto_ptr<TMenuItem> Item2_2s2(new TMenuItem(NULL));
Item2_2s2->Caption = "Submenu 2";
MainMenu1->Items->Items[1]->Items[1]->Add(Item2_2s2.release());
MainMenu1->Items->Items[1]->Items[1]->Items[1]->OnClick = Sub2Click;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OpenClick(TObject *Sender)
{
ShowMessage("Wybrano polecenie 'Otwórz'");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveClick(TObject *Sender)
{
ShowMessage("Wybrano polecenie 'Zapisz'");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CopyClick(TObject *Sender)
{
ShowMessage("Wybrano polecenie 'Kopiuj'");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SubClick(TObject *Sender)
{
ShowMessage("Wybrano polecenie 'Submenu 1'");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Sub2Click(TObject *Sender)
{
ShowMessage("Wybrano polecenie 'Submenu 2'");
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Dynamicznie tworzone MainMenu

Nowy postprzez Frani0 » niedziela, 10 maja 2009, 11:16

Baronie wszystko się zgadza z jednym małym ale ;) powiedzmy że chce 100 pozycji to musze do każedego definiować oddzielną funkcję ;) i tu jest problem mi chodzi o takie rozwiązanie że wszystkie okienka wysyłają do jednej funkcji a ta funkcja poznaj np. po tag/caption co to jest i z tąd wie co ma z tym zrobić np.

tag==1;
otworz przedsięwzięcie o id 1

tag==2;
otworz przedsięwzięcie o id 2

tag==-1;
otworz bazę przedsięwzięć

teraz wiesz o co michodzi? i wiesz może jak przez sendera dowiedzieć się co go wywołało lub w jakiś sposób zobaczyć jaka opcja była ostatnio naciśnięta w MainMenu
Avatar użytkownika
Frani0
Bladawiec
Bladawiec
 
Posty: 48
Dołączył(a): poniedziałek, 25 sierpnia 2008, 18:23
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Dynamicznie tworzone MainMenu

Nowy postprzez Cyfrowy Baron » niedziela, 10 maja 2009, 13:55

mi chodzi o takie rozwiązanie że wszystkie okienka wysyłają do jednej funkcji


jakie okienka :shock: :? :roll: :?: :!: :?:

Prawdopodobnie chodzi to o rzutowanie lub przypisanie polimorficzne. ► patrz serwis: Cyfrowy Baron dział: teoria -> rzutowanie typów, przypisanie polimorficzne.
Tyle mogę na razie doradzić, gdyż nie do końca rozumiem o co Tobie chodzi.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Dynamicznie tworzone MainMenu

Nowy postprzez Frani0 » niedziela, 10 maja 2009, 20:48

już to przeszedłem ;]

oto kod ;)

Kod: Zaznacz cały
TMenuItem *n;
n=new TMenuItem(MainMenu1->Components[0]);

String napis="pozycja dynamiczna";
int k=random(100);
napis=napis+IntToStr(k);

n->OnClick=CClick;
n->Caption=napis;

MainMenu1->Items[13].Add(n);


to doda do pozycji o nr 13 sub pozycję ;) naciśnięcie na nią spowoduje przeniesienie do CClick();

Kod: Zaznacz cały
void __fastcall TForm2::CClick(TObject *Sender)
{
   ShowMessage((reinterpret_cast<TMenuItem *>(Sender))->Caption);

}


w ten sposób możemy stworzyć tak jak to jest w word listę otwartych dokumentów bardzo pomocne przy MDI
Avatar użytkownika
Frani0
Bladawiec
Bladawiec
 
Posty: 48
Dołączył(a): poniedziałek, 25 sierpnia 2008, 18:23
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 9 gości

cron