Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obsluga akcji
Konnekt | Forum > Developerzy > Tworzenie wtyczek
KoSiarzPL
Czy da się, a jeśli tak to jak, zmienić w czasie dzałania wtyczki rodzica akcji?
Olórin
Tak jak subclassowanie akcji (patrz SDK), tylko że zmieniasz akcja->act.parent
KoSiarzPL
Jeszcze nie wiem o co ci chodzi ale poszukam. Przypomnało mi sie tylko jeszce jedno pytanie.

2. Da się pobrać dzieci jakiejś akcji? Chodzi o identyfikatory.
Olórin
Tak...
CODE

int id = IMIG_MAIN;
int ile= Message(IMI_GROUP_ACTIONSCOUNT,0,0,(int)&sUIAction(parent,id));
for(int i = 0; i < ile; i++)
{
int akcja= IMessage(IMI_ACTION_GETID,0,0,id, i);
if(akcja != 0) //to dla pewnosci, wiekszosc separatorów ma 0...
{
...
}
}

W k.lawie robie w ten sposób (rekurencyjnie) drzewko akcji
Aule
KosiarzPL: zobacz w SDK: Dodatkowe strony->HOWTO:Subclassowanie akcji . Różnica będzie taka, że dodatkowo zmieniasz rodzica akcji przed wstawieniem, więc akcja będzie tworzona już w innym miejscu.
KoSiarzPL
Gdzie mogę sie dowiedzić kto jest rodzicem akcji IMG_?
Przykladowo interesuje mnie:
- IMIG_CNT
- IMIG_MSGTB
- menu_wtyczki
- menu_ustawienia
- menu_kontakt
- menu_program
- IMG_TRAY
Aule
Ja bym próbował IMI_ACTION_FINDPARENT szukać.
hao
Z subclassowaniem lepiej jednak nie przesadzać... Co konkretniej chcesz osiągnąć?
Olórin
QUOTE
Z subclassowaniem lepiej jednak nie przesadzać...

Że co? tongue.gif Jakby podliczyć moje wtyczki to w polowie cos subclassuje wink.gif
hao
Chodzi mi o to, żeby nie subclassować wszystkich możliwych akcji wink.gif
KoSiarzPL
Jak na razie to subklasowanie to "magia" dla mnie. DO tej pory tego ine uzywalem nawet nie wiem do czego tego się uzywa. Wiec mam z tym problem.
Jak byscie rozwiazali moj problem.
- Tworze sobie menu_glowne (actionGroup w IMI_GETPLUGINSGROUP)
- w tem menu_glownym tworze sobie 10 podmenu
- tworze 40 akcji przypisanych do pierwszego podmenu w menu glowny.

Chce by po otwarciu menu_glownego akcje 0-40 odpowiednio sie porozkladaly w dziesieciu podmenu.

3. czy da sie opozniec tworzenie podmenu do momentu najechanie na menu glowne i jego rozwinieciu.

4. w ACTN_CREATE menu_glowne

robie tak:
sUIActionInfo nfo( podgrupa1, akcja20 );
nfo.mask = UIAIM_ALL; // chcemy pobrać wszystko...
//nfo.txt = new char [100];
//nfo.txtSize = 99;
UIActionGet(nfo); // pobieramy wszystkie dane
ICMessage(IMI_ACTION_REMOVE , (int)&nfo.act);
nfo.act.parent = podgrupa2;
ICMessage(IMI_ACTION , (int)&nfo);

i dziala swietnie. Jesli ten kod przeniose do metody i go wykonam dostaje krytyka. Pomoglo odkomentowanie nfo.txt. Do czego jest mi to potrzebne i skad mam wiedziec ze akurat 100 znakow mi wystarczy. Po krytyku widze ze jest uzyta wynkcja strncpy wiec napewno wystarczy.

Ok. pisząc ten post już to zrobiłem. Teraz będe myślał jak pozbierać te porozrzucane akcje po pierwszym rozłożeniu by przy kolejnym móc je znowu poprzydzielać do grup. (pewnie będzie trzeba wykorzystać wiedze z punktu 2.)

Jakieś sugestie co do rozwiązań?
Aule
hm, bufor przy txt jest potrzebny, bo pobierasz również opis wtyczki i gdzieś go musi zapisać, tak? Opisu pozycji z menu dłuższego niż 99 znaków nie widziałem jeszcze, ale może istnieją takie cuda.
Możesz usuwać wszystkie akcje przy ACTN_DESTROY, a potem na nowo je tworzyć przy ACTN_CREATE wybranej kontrolki, która nie byłaby usuwana i byłaby pierwszą tworzoną w tym menu. Robie coś takiego w MetaK i przy większości przypadków sie sprawdza. Możliwe, ze mógłbyś użyć do tego tworzenie i usuwanie sie menu, ja takiej możliwości nie mam.
KoSiarzPL
kolejne pytanie mi się nasunęlo.
5. Mogę podczas działania wtyczki tworzyc zupelnie nowe akcje, tak? Nie musze tego najpierw robic w iPrepeare. Mogę w dowolnym miejscu wywolac uiactionadd() czy trzeba korzystrac z IMI_ACTION ?
hao
Po to była ci zmiana rodzica smile.gif No to podejście jest złe...

Stwórz swoje menu główne...
Stwórz 10 podmenu...

A te 40 podakcji twórz dynamicznie w ACTN_CREATE menu głównego i niszcz w ACTN_DESTROY, tak jak napisał Aule...
Tworzysz wtedy identycznie, a usuwa się o ile pamiętam przez IMI_ACTION_REMOVE lub coś w ten deseń...

W przypadku menusów zawsze będzie to działać prawidłowo...

Co do nfo.txt pamiętaj, żeby zwolnić zaalakowany bufor...
A najlepiej:

CODE

char buffer[101];
nfo.txt = buffer;
nfo.txtSize = 100;


Prościej będzie, jeśli napiszesz co chcesz zrobić, być może jest zupełnie inne, lepsze rozwiązanie wink.gif
Olórin
UIActionAdd możesz wywołać praktycznie wszędzie smile.gif
Aule
W MetaK mam kontrolkę, która ma status hidden i init, oraz jest tworzona po wszystkich dynamicznych kontrolkach, gdyż musza one być już wszystkie przez ui obsłużone, zeby mogły byc usunięte, inaczej jest krytyk.
CODE
case Actions::Control:
   if(anBase->code==ACTN_DESTROY)
   {
    IMLOG("usuwanie akcji - start");
    for(int i=0;ICMessage(IMI_ACTION_EXISTS, (int)&sUIAction(IMIG_CNT, Actions::FirstMeta+i, an->act.cnt));i++)
    {
     IMLOG("Usuwanie akcji %i", Actions::FirstMeta+i);
     ICMessage(IMI_ACTION_REMOVE, (int)&sUIAction(IMIG_CNT, Actions::FirstMeta+i));
    }    
   }          
   break;
Przy tworzeniu kontrolka, która ma tworzyć musi być przed tymi, które chcesz utworzyć, bo inaczej juz sie nie utworzą.
KoSiarzPL
QUOTE(hao @ 24.12.2005 - 13:23)
Po to była ci zmiana rodzica smile.gif No to podejście jest złe...

Stwórz swoje menu główne...
Stwórz 10 podmenu...

A te 40 podakcji twórz dynamicznie w ACTN_CREATE menu głównego i niszcz w ACTN_DESTROY, tak jak napisał Aule...
Tworzysz wtedy identycznie, a usuwa się o ile pamiętam przez IMI_ACTION_REMOVE lub coś w ten deseń...

W przypadku menusów zawsze będzie to działać prawidłowo...
*


Ale to wychodzi na to samo. Bo po rozstawieniu akcji i tak w destroy musze wyszukac gdzie one sie znalazly i je pousuwac. A teraz ich nie usuwam tylko przenosze te ktore leza gdzie indziej do pierwszej grupy. Przy kolejnym create je znowu rozdzielam.
No moze wasza metoda by byla nieco mniej skomplikowana wink.gif
W kazdym badz razie dziala biggrin.gif
KoSiarzPL
Taki problem:
- tworze sobie podczas dzialania programu akcje w menu za pomoca :
CODE
UIActionAdd( menu_id, id_kolejnejAkcji, ACTR_INIT, "nazwa" );

- tworze kolejna w tym samym menu
- ok ladnie sie wyswietla

- usuwam pierwsza
CODE
id_akcji = IMessage(IMI_ACTION_GETID, 0, 0, id_menu, pozycja);
IMLOG("usuwanie akcji: rodzic = %d; akcja = %d", id_menu, id_akcji );
ICMessage( IMI_ACTION_REMOVE , (int)&sUIAction(id_menu, id_akcji) );

- usuwam kolejna, BLAD
- w logach mam ze druga akcja ma id == -1

Domyslam sie ze moze problem lezy w tym iż te akcje pozycje maja ustawione na "-1", czyli wstaw na koncu. Co mam w takiej sytuacji robic?
Olórin
Bo.... usuwając pierwszą akcje druga zajmuje jej miejsce (jak na stosie smile.gif )...

Śmiem twierdzić że -1 oznacza że taka akcja nie istnieje....
KoSiarzPL
Ależ ze mnie inteligent. Napewno to to biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2012 Invision Power Services, Inc.