Avatar billede hurra Novice
10. august 2005 - 10:42 Der er 2 kommentarer og
1 løsning

Dynamisk oprettelse af mainmenu

Først skal nok siges jeg bruger bcb6

Jeg har lavet en objekt i et program som dynamisk opretter den standart kontrol ting (en groupbox med nogle checkboxe og comboboxe).

Hver gang denne samling kontrol ting skal bruges, skal der også altid bruges en bestemt mainmenu, så det ville være smart hvis denne menu selv blev oprettet hver gang kontrol boxen blev oprettet.

Men sådan som jeg nu har gjort det lige nu (eller rettere begyndt på) kan ikke være det bedste. Jeg opretter hvert punkt selvstændigt, og sætter der ind i hoved menuen.

I stedet har jeg set i menudesigneren af man kan "save as templete", kan man måske være heldig at man dynamisk kan "load from templete" ?

Eller hvad med hvis man ser formen som text, så er der noget der ser sådan her ud:
  object MainMenu1: TMainMenu
    Left = 8
    Top = 408
    object File1: TMenuItem
      Caption = 'File'
      object Savetestrestul1: TMenuItem
        Caption = 'Save test restul'
        object Fix11: TMenuItem
          Caption = 'Fix1'
        end
        object Fix21: TMenuItem
          Caption = 'Fix2'
        end
...
Kan jeg bruge det i mit kontrol objekt ?
Avatar billede hurra Novice
10. august 2005 - 10:50 #1
Jeg skal jo forresten aligevel ha oprette alle menuitems, så der er ingen forskel om jeg skriver de i c++ eller den delphi lignenden måde som når man ser formen som text.

Jeg tager stadig gerne mod forbedrings forslag :)
Avatar billede hurra Novice
10. august 2005 - 13:27 #2
Ok, nu er det færdigt, og det virker. Måske er det ikke så smart som det kunne være, men det er heller ikke så slemt som jeg frygtede.

I min header til classen:
      TMainMenu *MainMenu;
        TMenuItem *FileMenuItem;
            TMenuItem *SaveTestRestulMenuItem;
              TMenuItem *SaveTestResult[MAX_NUMBER_OF_FIXSITES];
        TMenuItem *N1;
            TMenuItem *ExitMenuItem;
        TMenuItem *SetupMenuItem;
            TMenuItem *UserIniMenuItem;
            TMenuItem *InstrumentsIniMenuItem;
...
Og i constructoren:
      MainMenu = new TMainMenu(Parent);
        FileMenuItem = new TMenuItem(MainMenu);
        FileMenuItem->Caption = "File";
        FileMenuItem->OnClick = MenuItemClick;
            SaveTestRestulMenuItem = new TMenuItem(FileMenuItem);
            SaveTestRestulMenuItem->Caption = "Save test result";
            SaveTestRestulMenuItem->OnClick = MenuItemClick;
            for(unsigned char i=0; i<noFixSites; i++)
            {
              SaveTestResult[i] = new TMenuItem(SaveTestRestulMenuItem);
              SaveTestResult[i]->Caption = "Fix"+IntToStr(i+1);
              SaveTestRestul[i]->OnClick = MenuItemClick;
            }
            N1 = new TMenuItem(FileMenuItem);
...

I MenuItemClick():
void __fastcall TCommonControls::MenuItemClick(TObject *Sender)
{
  TMenuItem *TheMenuItem = dynamic_cast<TButton*>(Sender);
  if(TheMenuItem == NULL)
      return;

  if(TheMenuItem->Caption == "Exit")
  {
      Application->Terminate();
  }
  else if(TheMenuItem->Parent->Caption == "Save test result")
  {
      unsigned char FixSite = TheMenuItem->Caption.SubString(4, 1);
      SaveTestResult(FixSite);
  }
...
Avatar billede hurra Novice
10. august 2005 - 13:32 #3
Sludder!!!
Jeg fik lige kopieret noget forkert rundt i mit program, i MenuItemClick() skal det være:
  TMenuItem *TheMenuItem = dynamic_cast<TMenuItem*>(Sender);
I stedet for.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester