amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > MUI Ereignisbehandlung [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2006-04-24, 23:44 h

Kaesebroetchen
Posts: 643
User
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/

[ - Answer - Quote - Direct link - ]

2006-04-25, 01:39 h

DariusBrewka
Posts: 899
[Banned user]
Zitat:
Original von Kaesebroetchen:

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.


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.

[ - Answer - Quote - Direct link - ]

2006-04-25, 10:38 h

Kaesebroetchen
Posts: 643
User
@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/

[ - Answer - Quote - Direct link - ]

2006-04-25, 11:59 h

DariusBrewka
Posts: 899
[Banned user]
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 aufgeht

code:
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;
   }


[ - Answer - Quote - Direct link - ]

2006-04-25, 12:31 h

Holger
Posts: 8116
User
Zitat:
Original von Kaesebroetchen:
@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);


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.

[ - Answer - Quote - Direct link - ]

2006-04-25, 13:22 h

Kaesebroetchen
Posts: 643
User
@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/

[ - Answer - Quote - Direct link - ]

2006-04-25, 15:49 h

Kaesebroetchen
Posts: 643
User
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/

[ - Answer - Quote - Direct link - ]

2006-04-25, 16:34 h

Holger
Posts: 8116
User
Zitat:
Original von Kaesebroetchen:
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.

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:
[...]
kompiliert problemlos.
Wenn ich dann aber unter Aros das Programm starten will geht da kein Fester auf ?!

Nachdem Du alles wesentliche entfernt hast?...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2006-04-25, 18:50 h

Kaesebroetchen
Posts: 643
User
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/

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > MUI Ereignisbehandlung [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.