Robotprojekt - fra Konsol til GUI

Tags:    c++

<< < 12 > >>
Hej..

Jeg er mekanik ingeniørstuderende på DTU og er igang med at lave automatiske musikrobotter, dvs. maskiner der spiller på akustiske instrumenter - f.eks et trommesæt. Softwaren ligger tildels på mikrokontrollere, dels på en laptop med Windows XP.

OK.. Her kommer mit problem:

Jeg har indtil videre skrevet programmet som en simpelt konsolapplikation i Visual C++, men vil gerne have en grafisk brugerflade. I første omgang blot et tekstfelt til at printe meddelelser i (ligesom konsollen). Programmet er objektorienteret opbygget, således at det øverste lag (RobotApp) har x antal Robotter som hver især har x antal aktuatorer osv. I konsolapplikation har jeg blot benyttet std::cout til at udskrive meddelelser fra forskellige steder i programmet. Jeg har installeret Borland C++ Builder, hvor man rimeligt simpelt kan benytte 'drag n' drop' til at opbygge en GUI. Jeg har lavet en form med et TMemo objekt, som jeg gerne vil bruge i stedet for konsolvinduet.


Hvad er den 'korrekte metode' til at strukturere programmet og hvordan skal jeg kommunikere med TMemo objektet?

På forhånd tak
Vh Anders



14 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Hej Ken...

Nu har jeg forstået dit event eksempel og fået det til at virke :). Desuden har jeg også indsat min egen backend kode, og det compiler fint.

Jeg har dog stadigt et spørgsmål som jeg håber du kan hjælpe med:
Min backend er fordelt i forskellige classer i forskellige filer. Tidligere kunne jeg bare benytte #include <iostream> i hver fil og udskrive til konsollen. Hvordan kan jeg bedst benytte dit OnEvent til at sende info fra en af mine andre objekter/classer til min frontend?? Jeg mener, OnEvent'et er jo umiddelbart kun anvendeligt i RobotBackend classen, right?

Vh
Anders







Hey Anders,
cool! er glad for det kan bruges :)

Er det sådan at den ene klasse opretter en instans af den anden? eller hvor foregår det henne? :)

Det nemmeste vil umidelbart være at have en 'overklasse' der opretter instanserne af dem og derfra har events :)

Således at begge dine backend klasser har hver deres 'onDataEvent'.

Denne event ses så af din 'overklasse' som smider den videre til GUI :)



Hej Ken..
Det er egentligt lidt kompliceret for min backend er opbygget i flere 'lag'

'Overklassen' som jeg tidligere kaldte CRobotApp, er nu lavet til et komponent og navngivet TRobotBackend. Denne 'overklasse' opretter dynamisk en eller flere instanser af klassen CTrommeRobot. Hver instans af CTrommeRobot opretter dynamisk x antal instanser af klassen CTromme alt efter, hvor mange trommer den enkelte robot benytter.
Der er altså i øjeblikket tre lag i hierakiet.
Eventet er oprettet i overklassen TRobotBackend, men jeg vil jo også gerne kunne sende tekst til min frontend fra objekterne længere nede i hierakiet.

Herunder er tre af de ideer, som jeg har overvejet. Ved ikke rigtigt hvad der er bedst...

1. En reference til event'et sendes ned gennem hierakiet, så de andre lag også kan benytte event'et direkte. Ved ikke hvordan sådan en reference vil se ud. Desuden kræver det vel også at hver af de underliggende klasser (CTrommeRobot , CTromme) benytter #include"RobotBackend" for at kunne benytte referencen.

2. En reference til instancen af overklassen TRobotBackend sendes ned gennem hierakiet, således at alle de underliggende klasser kan kalde funktionerne i overklassen, hermed også event'et. Denne metode kræver vel også #include"RobotBackend" i alle de underliggende klasser.

3. Hver objekt har en reference til objektet der har oprettet det. Derfor vil hver instans af CTromme, have en reference til CTrommeRobot, som igen vil have en reference til TRobotBackend. Hvis hver klasse har en funktion (method) der videresender info fra det underliggende lag, kan det vel lade sig gøre at sende info fra CTromme til CTrommeRobot og videre til TRobotBackend, som derefter kan benytte eventet.

Håber ikke det er altfor rodet beskrevet :P

Venlig Hilsen
Anders



Hey Anders,

hvis det var mig der skulle lave det, ville jeg sørge for at alle klasser har en 'output' event.

Denne output 'event' skal så indeholde en eller anden datastruktur således at du altid kan finde ud af hvem der reelt har kaldt eventen i første omgang, men ellers sendes den blot op til det overstående lag, som igen smider den videre til et overstående lag indtil du rammer top laget - din GUI.

Ex:
CTromme har en 'onOutput' event, denne kaldes ved alle output data.

CTrommeRobot som er owner til CTromme, har en eventhandler til Ctromme's onOutput, som kalder CTrommeRobot's egen OnOutput event.

Denne opfanges af TRobotBackend som smider det videre til GUI :)

Det er dog vigtigt her at tage forbehold for eventuel brug af threads mv.



<< < 12 > >>
t