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
Hey Anders,
jeg har lavet en simpel løsning som du kan hente her: http://kenman.dk/temp/robottest.zip

Det er i alt sin enkelhed et component (object) "RobotBackend".

Dette skal forestille at være hvor ALT din backend kode hører til.

Til denne backend er pt. én event, 'OnEvent'.
Til denne vent hører 3 parametre, 'Sender' som reffererer til objektet, Event som er en enum type der fortæller hvilken event der er eksekveret samt data der er en struct der indeholder muligheden for at sende en string, pointers mv. med til din frontend.

Den eneste ulæmpe ved denne løsning, er den umidelbare mangel på integration direkte med konsollen.

Dette kan der dog nemt tages forbehold for, ved blot at lave et komponent, som tager sig af at parse alt til CLI.

Kig det igennem og spørg endelig :)



Blot en generel kommentar; hvis ikke du får god hjælp hurtigt, er det muligvis fordi der ikke er ret mange der bruger Borland C++ Builder.

Jeg ved meget lidt Om Builderen, så jeg kan ikke rigtigt hjælpe dig der, men nok svare på generelle spørgsmål om GUI.



Hey Anders,
TMemo er opbygget således at det har et underobjekt Lines (TStrings).

Dette benytter du dig af når du skal tilføje nye linier af tekst.

Du skulle gerne kunne gøre følgende:
Fold kodeboks ind/udKode 

Er dog ikke testet, da jeg ikke lige har c++ builder liggende her :)



Tak for hjælpen, men mit spørgsmål er i højere grad, hvordan jeg kan strukturere programmet. Koden Memo1->Add("Tekst"); kræver jo at jeg har pointeren til Memo1 tilrådighed. Skal jeg så sende den med ind gennem alle objekterne, hvorfra jeg gerne vil udskrive tekst, eller er der en bedre løsning?



Det lyder ikke som om c++ builderen er særlig populær.. Er der bedre alternativer, der også giver mulighed for at opbygge programmet vha. 'drag n drop'..



Det nemmeste er at lave et interface mellem de 2.

Til din backend laver du en række 'events', ét for hver forskellig ting din GUI/Frontend skal kunne gøre noget ved. I din GUI definerer du så koden der eksekveres ved hver event :)

enten kan du bruge 'rigtige' events, eller lave et interface.



Ahh.. så Frontend og Backend skal helst være 2 forskellige tråde?
Før jeg startede dette projekt har jeg aldrig skrevet c++. Jeg har læst en del bøger og skrevet programmet om flere gange efterhånden som jeg har lært principperne bag objektorienteret programmering. Hvad angår GUI er jeg dog helt nybegynder, som I kan høre..

Her er hvordan jeg forestiller mig at frontend og backend kan kobles sammen, så må I meget gerne komme med rettelser, hvis det er helt ude i skoven :)

1. Der skal jo kun være én .exe fil. Forestiller mig at det er frontend app. der kompiles til .exe, right?

2. Min frontend skal vel som noget af det første eksekvere min backend. Skal min backend i såfald kompiles som .dll, og skal den eksekveres i en separat tråd?

3. Når min backend f.eks gerne vil udskrive en fejlbesked eller en variabel kan jeg som Ken foreslår bruge et event til at signalere min frontend, men jeg skal jo også overføre noget data. Jeg kan vel ikke sende data sammen med event'et, eller hvad?



Det du gør rent objektorienteret er følgende:

Dit App opretter dit GUI "komponent" + dit robot "komponent".

1: det hele compiles til én .exe, da din frontend og din backend smelter sammen i samme app, blot med 2 forskellige 'komponenter'.

2: den kan sagtens compiles i samme app og blot ekserkveres i en ny tråd.

3: du kan sagtens sende data med :) du kan eksempelvis lave en struct hvori dine data ligger alt efter hvad du har brug for :)

Kan prøve at smække et eksempel sammen i løbet af idag/imorgen hvis jeg kan nå det :)



Hej Ken...

Tusinde tak for eksemplet, det er helt sikkert til stor hjælp :D
Vil prøve at sætte mig ordentligt ind i, hvordan det fungerer her i weekenden, så kan det være jeg vender tilbage med et par supplerende spørgsmål...

Mange tak for hjælpen og god weekend :P
- Anders



Så lidt, er glad for det kan hjælpe :)
du kan bare skrive, så skal jeg se om jeg kan svare :P

God weekend og held og lykke med projektet ;)



<< < 12 > >>
t