ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > MUI Ereignisbehandlung | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
24.04.2006, 23:44 Uhr Kaesebroetchen Posts: 643 Nutzer |
Ich bastel immer noch an meiner Aros Zune Anwendung herum. Die GUI Erzeugung habe ich jetzt einigermassen im Griff, jetzt muss ich nur noch die Nachrichten auswerten. Leider habe ich keine Erfahrung mit der Nachrichtenbehandlung unter AOS / Aros. Folgender Code funktioniert nicht: C++ code:// Click the button to quit DoMethod(open, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)app, 2, MUIM_Application_ReturnID, (long unsigned int)MUIV_Application_ReturnID_Quit); // Click the button to quit DoMethod(save, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)app, 2, MUIM_Application_ReturnID, (long unsigned int)10001); . . . // Open the window set(wnd, MUIA_Window_Open, TRUE); // Check that the window opened if (XGET(wnd, MUIA_Window_Open)) { // Main loop DoMethod(app, MUIM_Application_NewInput, (long unsigned int)&sigs); while(DoMethod(app, MUIM_Application_NewInput, (ULONG) sigs) != (long unsigned int)APTR(MUIV_Application_ReturnID_Quit)) { if (sigs) { sigs = Wait(sigs | SIGBREAKF_CTRL_C); if (sigs & SIGBREAKF_CTRL_C) break; if (sigs & (long unsigned int)APTR(10001)) { dat_aus.open("test.txt"); } } } } // Destroy our application and all its objects MUI_DisposeObject(app); } Das mit dem Bitweisen vergleichen hab ich mir von sigs mit SIGBREAK abgeguckt. Kommt mir schon mal seltsam vor. Ich habe es auch mit == probiert, aber da tut sich auch nichts. Wäre schön wenn mir das jemand erklären kann. -- http://amidevcpp.amiga-world.de/ [ - Antworten - Zitieren - Direktlink - ] |
25.04.2006, 01:39 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Zitat: hmm, ich habe das noch nie mit NewInput gemacht, sondern bisher nur mit Application_Input, aber soweit ich NewInput überblicke ist es eher dafür gedacht es in einer Objektorientierter manier zu verwenden, d.h. ganz ohne If/Then's und else. Wie du das machst kann es garnicht funktionieren, da du eine Signalmaske mit einer ID Vergleichst, sigs enthält nicht die ID welche du in DoMethod() angabst, sondern die signale welche MUI für sich reserviert hatte und code:sigs = Wait(sigs | SIGBREAKF_CTRL_C); wartet halt solange bis eines dieser Signale gesetzt ist zzgl. dem Signal welches gesetzt wird wenn du CTRL drückst. sigs selber ist nicht relevant und nicht öffentlich darüber gedanken zu machen, was diese nun Aussagen, sondern dienen einfach nur dazu dem System zu sagen worauf es warten soll. was für dich eher relevant ist ist der Rückgabewert von code:DoMethod(app, MUIM_Application_NewInput, (ULONG) &sigs); wobei du die erste DoMethod() Zeile löschen solltest und in der zweiten ein & vor's sigs setzten solltest, damit MUI/ZUNE dort die für sich nötige Signalmaske für Wait() setzten kann. Ich würde es like MUIM_Application_Input versuchen: code:ULONG sigs = 0; ULONG id; BOOL running = TRUE; while (running) { id = DoMethod(app,MUIM_Application_NewInput,&sigs); switch(id) { case MUIV_Application_ReturnID_Quit: running = FALSE; break; case 10001: dat_aus.open("test.txt"); break; } if (sigs && running) { sigs = Wait(sigs | SIGBREAKF_CTRL_C); if (sigs & SIGBREAKF_CTRL_C) running = FALSE; } } wenn es nicht klappen sollte, dann schau mal unter http://www.sasg.com in die MUI Autodocs unter MUIM_Applicaction_Input nach, dort ist es genau beschrieben wie du vorzugehen hast nur kannst du im Allgemeinen die ganzen Abfragen vergessen und solltest es auch und stattdessen lieber Hooks, MUIM_Set etc. benutzen, halt methoden der Notify class. [ - Antworten - Zitieren - Direktlink - ] |
25.04.2006, 10:38 Uhr Kaesebroetchen Posts: 643 Nutzer |
@DariusBrewka: Danke ! So klappt das hundertprozentig. Ich musste allerdings noch ein cast machen, da der g++ da etwas pingelig ist: C++ code:id = DoMethod(app, MUIM_Application_NewInput, (long unsigned int)&sigs); Jetzt bräuchte ich noch eine möglichst einfache Methode einen File_Open bzw. File_Save Dialog zu öffnen. Der Dialog sollte mir einfach nur einen String mit dem Pfad der Datei zurückliefern. Ich habe da schon ein bisschen gegoogelt und mir kommt es so vor als ob das Amiga OS / Aros da mehrere ? Möglichkeiten bietet. Optimal wäre natürlich wenn MUI sowas hätte. -- http://amidevcpp.amiga-world.de/ [ - Antworten - Zitieren - Direktlink - ] |
25.04.2006, 11:59 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Hmm, ich muss gleich arbeiten gehen, darum nur kurz, ggf würde dir ein PopaslObject helfen?, dieses erzeugt einen Popup bei wessen Betätigung ein ASL FileRequester aufgehtcode:char *RequestFile(char *strg, BOOL icon, char *pattern, BOOL quiet, BOOL drawers) { Object *app, *win; Object *iconObject; char *back; BOOL running = TRUE; ULONG signals; ULONG rtsm, id; back = NULL; app = ApplicationObject, MUIA_Application_Title, "File Setup", MUIA_Application_Base, "AMISTART", MUIA_Application_UseRexx, FALSE, MUIA_Application_UseCommodities, FALSE, SubWindow, win = WindowObject, MUIA_Window_Activate, TRUE, MUIA_Window_DepthGadget, !quiet, MUIA_Window_DragBar, !quiet, MUIA_Window_SizeGadget, !quiet, MUIA_Window_AppWindow, TRUE, MUIA_Window_CloseGadget, !quiet, MUIA_Window_Borderless, quiet, MUIA_Window_TopEdge, MUIV_Window_TopEdge_Moused, MUIA_Window_LeftEdge, MUIV_Window_LeftEdge_Moused, MUIA_Window_PublicScreen, (ULONG) ScreenName, WindowContents, iconObject = PopaslObject, NoFrame, MUIA_InnerTop, 0, MUIA_InnerLeft, 0, MUIA_InnerBottom, 0, MUIA_InnerRight, 0, MUIA_Selected, TRUE, MUIA_Popstring_String, KeyString(0,512,getShortCode(Trans(TXT_Icon))), MUIA_Popstring_Button, GetPopButton(MUII_PopFile), ASLFR_InitialPattern, pattern, ASLFR_RejectIcons, !icon, ASLFR_DrawersOnly, drawers, End, End, End; if (app) { if (!quiet) set (win,MUIA_Window_Title, Trans(TXT_Application)); DoMethod(win,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit); set(iconObject,MUIA_String_Contents,strg); DoMethod(iconObject,MUIM_Notify,MUIA_String_Acknowledge,MUIV_TriggerValue,app,2,MUIM_Application_ReturnID,SP_ICON); DoMethod(iconObject,MUIM_Notify,MUIA_AppMessage,MUIV_EveryTime, iconObject,3,MUIM_CallHook,&AppMsgHook,MUIV_TriggerValue); set(win,MUIA_Window_Open,TRUE); set(win, MUIA_Window_ActiveObject, iconObject); while (running) { id = DoMethod(app,MUIM_Application_Input,&signals); switch (id) { case MUIV_Application_ReturnID_Quit: running = FALSE; break; case SP_ICON: get(iconObject,MUIA_String_Contents,&rtsm); if (strlen((char *) rtsm)>0) back = stripInfo((char *) rtsm); running = FALSE; break; } if (running && signals) Wait(signals); } set(win,MUIA_Window_Open,FALSE); MUI_DisposeObject(app); } isetup = TRUE; return back; } [ - Antworten - Zitieren - Direktlink - ] |
25.04.2006, 12:31 Uhr Holger Posts: 8116 Nutzer |
Zitat:Also bei long in diesem Zusammenhang sollten schon Alarmglocken läuten. AmigaOS und kompatible System definieren ULONG welches für ein unsigned 32Bit integer steht, und das sollte man an dieser Stelle auch in jedem Fall benutzen. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
25.04.2006, 13:22 Uhr Kaesebroetchen Posts: 643 Nutzer |
@Darius Mit PopASL hatte ich es schon versucht, aber da gab es bei Programmaufruf gleich einen Neustart von Aros. Ich werde es halt nochmal probieren. @Holger Danke, ich habe gleich mal alle casts auf ULONG geändert. -- http://amidevcpp.amiga-world.de/ [ - Antworten - Zitieren - Direktlink - ] |
25.04.2006, 15:49 Uhr Kaesebroetchen Posts: 643 Nutzer |
Mit dem Filerequester komme ich nicht weiter. Diesen Teil: C++ code:MUIA_Popstring_String, KeyString(0,512,getShortCode(Trans(TXT_Icon))), MUIA_Popstring_Button, GetPopButton(MUII_PopFile), ASLFR_InitialPattern, pattern, ASLFR_RejectIcons, !icon, ASLFR_DrawersOnly, drawers, musste ich auskommentieren, da alles unbekannt war. C++ code:Child, iconObject = PopaslObject, NoFrame, MUIA_InnerTop, 0, MUIA_InnerLeft, 0, MUIA_InnerBottom, 0, MUIA_InnerRight, 0, MUIA_Selected, TRUE, End, kompiliert problemlos. Wenn ich dann aber unter Aros das Programm starten will geht da kein Fester auf ?! -- http://amidevcpp.amiga-world.de/ [ - Antworten - Zitieren - Direktlink - ] |
25.04.2006, 16:34 Uhr Holger Posts: 8116 Nutzer |
Zitat:Die ASLFR_* Konstanten stammen von der asl.library. Du mußt natürlich die entsprechenden #includes hinzufügen. In mui findet der Compiler sie nicht. Zitat:Nachdem Du alles wesentliche entfernt hast?... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
25.04.2006, 18:50 Uhr Kaesebroetchen Posts: 643 Nutzer |
Habe Hilfe im Aros-Exec Forum bekommen. Damit geht es: C++ code:--struct FileRequester *req; . . . case IDB_SAVE: //dat_aus.open("test.txt"); //MUI_Request(app, wnd, 0L, "broad hint", "_OK", "Function not implemented.", NULL); if ((req=(FileRequester*)MUI_AllocAslRequestTags(ASL_FileRequest, ASLFR_Window,*requester , ASLFR_TitleText, "A requester for AmiDevCpp", ASLFR_InitialDrawer , "ram:", ASLFR_InitialFile, "foo.txt", ASLFR_InitialPattern , "#?.txt", ASLFR_DoPatterns , TRUE, ASLFR_RejectIcons , TRUE, TAG_DONE))) { if (MUI_AslRequestTags(req,TAG_DONE)) { /* you can find the drawer in req->fr_Drawer and the file in req->fr_File */ textbuffer = req->fr_File; } } break; http://amidevcpp.amiga-world.de/ [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > MUI Ereignisbehandlung | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |