Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obsluga konfiguracji
Konnekt | Forum > Developerzy > Tworzenie wtyczek
Stron: 1, 2
KoSiarzPL
1. Jeśli tworzę sobie checkbox
UIActionCfgAdd( id_parent, IMIB_CFG, ACTT_CHECK|ACTR_CHECK, "jakis tekst", id );

i teraz w obsłudze mam:
case id:
if (anBase->code == ACTN_CHECK )
IMessage(IMI_INFORM , 0 , 0 , (int)"Check");
if (anBase->code == ACTN_ACTION )
IMessage(IMI_INFORM , 0 , 0 , (int)"Action");

Nie informuje mnie o akcji "check" tylko o akcji "Action". Dlaczego?

2. Czym się różnią komunikaty ACTN_ od ACTS_ Np. ACTN_CHECK od ACTS_CHECKED.

3. Czy akcja chceck i inne służą jedynie do zmiany wyświetlania poszczegolnych kontrolek w konfiguracji? Tzn. Jeśli dostanę jakieś zdarzenie nie mogę na jego podstawie nic zmienic we wtyczce bo użytkownik może wybrać anuluj i nie cofnę tych zmian we wtyczce.

Czy jest jakieś inne możliwe postępowanie od:
a) użytkownik zmienia konfiguracje ja nie reaguję (najwyżej zmieniam wyświetlane elementy w konfiguracji)
b ) użytkownik wciska anuluj. Ja nic nie robię i nic sie nie zmienia
c) użytkownik wciska ok, zastosuj
c1) przelatuję całą konfiguracje (wszystkie pola) i sprawdzam czy sie zmieniły, jeśli tak to zmieniam wtyczkę i pola w pamięci konnekta.

Czy da sie pobrać tylko te kontrolki z jakiejś grupy które zmieniły swój stan?

4. Kiedy, przez kogo i jak przechwycic powiadomienie ACTN_SAVE

5. Jak stworzyc podgupę w grupie. Kombinuję na różne sposoby ale czy to ma sens? Nie mogę nigdzie znaleźć nigdzie przykłądu a z SDK nie da sie doczytać co do czego służy. Jedynie emNotifier ma takie ułożenie ale ine ma jego kodu źródłowego. RObię tak:

UIGroupAdd( IMIG_CFG_PLUGS, cfg_glowne, 0, "cos" );
{
...
UIActionAdd( cfg_glowne , 0 , ACTT_GROUP , "grupa" );
{
...
UIActionAdd( cfg_glowne , cfg_g_konf , ACTT_GROUP , "podgrupa" );
{
UIActionCfgAdd( cfg_g_konf, IMIB_CFG, ACTT_CHECK, "checkbox", cfg_checkbox );
}
}
}

No i dostaje blad przy otwieraniu konekta.
hao
Cieszę się że zadajesz pytania przez Forum smile.gif Może nie będzie trzeba później pisać tego znowu :]

2) Zacznę od 2...
ACTS_ to statusy akcji, style akcji, flagi akcji - jak zwał tak zwał. Flagi te odpowiadają za stan (ACTS_CHECKED, ACTS_DISABLED ...) i wygląd (ACTSC_BOLD) akcji...
ACTR_ to flagi "zamawiające" wybrane rodzaje zdarzeń specjalnych
ACTT_ to typ kontrolki
Wszystkie powyższe to flagi akcji, które ustawiamy w status...
ACTN_ to rodzaje zdarzeń akcji


A więc...
ACTS_CHECKED - jest stanem kontrolki. "Checked" mogą być checkboxy, oraz niektóre przyciski.
ACTN_CHECK - powiadomienie gdy zmieni się wartość kontrolki. Nie jest jednak wywoływane dla wszystkich kontrolek. Jeżeli dobrze pamiętam, rozsyłane jest tylko dla kontrolek typowo tekstowych... Stąd też checkbox wysyła ci tylko ACTION
ACTR_CHECK - zamawia ACTN_CHECK
ACTN_ACTION - standardowe wywołanie akcji - czyli najczęściej kliknięcie przez użytkownika


1) Już wiadomo

3) Tak, one zmieniają tylko kontrolki w konfiguracji...

Nie wiem o co dokładnie pytasz... Ogólnie przyjmuje się, że wciśnięcie OK w konfiguracji znaczy, że coś się zmieniło... Dostaniesz wtedy komunikat ogólny - IM_CFG_CHANGED. Akcje które mają ustawioną flagę ACTR_SAVE dostaną również ACTN_SAVE w takiej sytuacji...
Zamiast sprawdzać czy wartości ustawień faktycznie się zmieniły, lepiej zobaczyć tylko, czy nasza zakładka w konfiguracji została otwarta, a jeżeli została - uznać że na pewno coś się w niej zmieniło. Kontrolki zakładek są tworzone dopiero w chwili jej otwarcia - wystarczy więc sprawdzić czy kontrolka została utworzona, czyli czy ma jakiś Handle:
CODE
UIActionHandle( sUIAction(id_naszej_zakładki) )  != 0;


4) Jak wyżej - jest to normalne zdarzenia akcji, trzeba tylko zadeklarować chęć jego odbierania przez ACTR_SAVE w statusie akcji...

5) Przede wszystkim - _każda_ grupa _musi_ mieć unikalny identyfikator (zwykłe akcje mogą muszą mieć unikalny tylko w obszarze grupy, lub 0)! Najbezpieczniej tworzyć identyfikatory jako (NET * 1000 + liczba_porzadkowa). Twój kod nie działa, bo podałeś jako id podgrupy 0.
Po drugie - ACTT_GROUP / ACTT_GROUPEND to rodzaj kontrolki (ramka wokół grupy ustawień). Żeby utworzyć grupę trzeba jako status ustawić ACTS_GROUP, ale NAJLEPIEJ użyć funkcji UIGroupAdd i nie ustawiać nic specjalnego...

CODE


UIGroupAdd( IMIG_CFG_PLUGS, cfg_glowne, 0, "cos" );
UIGroupAdd( cfg_glowne , cfg_g_grupa , 0 , "grupa" );
UIGroupAdd( cfg_g_grupa , cfg_g_konf , 0 , "podgrupa" );
UIActionCfgAdd( cfg_g_konf, IMIB_CFG, ACTT_CHECK, "checkbox", cfg_checkbox );


KoSiarzPL
Na razie odpowiadam na pkt 3
QUOTE(hao @ 19.11.2005 - 19:25)
3) Tak, one zmieniają tylko kontrolki w konfiguracji...
Kontrolki zakładek są tworzone dopiero w chwili jej otwarcia - wystarczy więc sprawdzić czy kontrolka została utworzona, czyli czy ma jakiś Handle:
CODE
UIActionHandle( sUIAction(id_naszej_zakładki) )  != 0;


Robie weic tak:
- Konfiguracja zakladki:
CODE
UIGroupAdd( IMIG_CFG_PLUGS, cfg_glowne, 0, "linKer" );

- obsluga zdarzenia save w kontrolce znajdujacej sie w mojej zakladce (chyba mojej, moze tu jest blad)
CODE
if (anBase->code == ACTN_SAVE )
{
if ( UIActionHandle( sUIAction(IMIG_CFG_PLUGS, cfg_glowne) ) == 0 ) return 0;
IMessage(IMI_INFORM , 0 , 0 , (int)"Zapis");
}


Za kazdym razem przy wcisnieciu "ok" dostaje komunikat o zapisie. Bez znaczenia czy jestem w mojej zakladce czy nie.

- dla pewnosci podam jeszcz jak tworze ta kontrolke
CODE
UIActionAdd( cfg_glowne , 0 , ACTT_GROUP , "Wswietlanie menu" );
{
UIActionCfgAdd( cfg_glowne, IMIB_CFG, ACTT_CHECK|ACTR_SAVE, "Wstawietlaj w menu kontaktu", cfg_wyswietlaj_w_menu );
...
}
UIActionAdd( cfg_glowne , 0 , ACTT_GROUPEND);
KoSiarzPL
Męczę się z tą konfiguracją cały dzień.
Próba ustawienia w textboxie jakiegos napisu:
CODE
UIActionSetText( cfg_glowne, IMIB_CFG|cfg_skladnia_http, ",./\\%&=@-" );

wynik FALSE

Próba przechwycenia akcji save tylko przy kliknieciu ok:
CODE
if ( UIActionHandle( sUIAction(IMIG_CFG_PLUGS, cfg_glowne) ) == 0 ) return 0;

wynik FALSE

Pytania do komunikatu SAVE [edit: już wiem że zapis jest automatyczny].
1. Czy wartości z kontrolek są zapisywane w konfiguracji automatycznie czy trzeba to robić ręcznie.
2. Jeśli dzieje się to automatycznie. To czy mogę przechwycić tą akcje w takim miejscu gdzie jestem pewien że nie została zapisana ani jedna kontrolka. Chce przeprowadzic walidację wprowadzonych wartości.
3. Czy jęsli zmienie te wartości w kontrolkach przed zapisem a zapis jest automatyczny to czy mi je zapisze.
4. Jak poinformować użytkownika o błędnie podanej wartości. Wyświetlić dialog czy nie informować go wcale.
Olórin
Co do tego pierwszego - chyba innej funkcji należy użyć, sprawdź przykład actcfg.cpp z sdk, wydaje mi sie ze tam cos takiego bylo...
hao
No niestety, API wymaga trochę przyzwyczajenia, ale potem idzie z górki wink.gif Z resztą dlatego zamiast dodawać nowe ficzery przebudowywujemy API smile.gif

QUOTE
Za kazdym razem przy wcisnieciu "ok" dostaje komunikat o zapisie. Bez znaczenia czy jestem w mojej zakladce czy nie.


ACTN_SAVE wysyłany jest zawsze do wszystkich kontrolek, które go zamówiły. Wciśnięcie OK w końcu zatwierdza zmiany we wszystkich oknach...

QUOTE
if ( UIActionHandle( sUIAction(IMIG_CFG_PLUGS, cfg_glowne) ) == 0 ) return 0;

Jeżeli chociaż raz otworzyłeś swoją zakładkę - wtedy Handle będzie ustawiony...
I przepraszam za wprowadzenie w błąd... Grupy mają dwa uchwyty - uchwyt akcji (w tym wypadku akurat HTREEITEM), oraz uchwyt grupy, którym akurat tutaj jest uchwyt okna. Na ogół będzie Ciebie interesował właśnie uchwyt grup (dla grup oczywiście wink.gif ) który pobiera się używając UIGroupHandle... A więc:

CODE
if ( UIGroupHandle( sUIAction(IMIG_CFG_PLUGS, cfg_glowne) ) == 0 ) return 0;


QUOTE
Próba ustawienia w textboxie jakiegos napisu:


UIActionSetText ustawia dla akcji parametr text - czyli jej opis. Ty chcesz zmienić wartość kontrolki w konfiguracji więc używasz UIActionCfgSetValue.

1. Jeżeli nie ustawisz parametru p1 dla akcji - zapisu nie będzie... W przeciwnym razie już wiesz wink.gif
2. ACTN_SAVE dla akcji jest wywoływany przed jej zapisaniem (również przed rozpoczęciem zapisywania grupy, więc wystarczy go złapać dla grupy, sprawdzając wcześniej UIGroupHandle
3. Jeżeli użyjesz UIActionCfgSetValue to tak, zapisze zmienioną...
4. Lepiej wyświetlić.. Do validowania tekstu najlepsze jest jednak powiadomienie ACTN_CHECK (zamawiane przez ACTR_CHECK). Możesz w nim modyfikować tekst, już w trakcie wpisywania (np. nie dopuszczając do wprowadzenia konkretnych znaków)...
KoSiarzPL
QUOTE(hao @ 20.11.2005 - 14:37)
4. Lepiej wyświetlić.. Do validowania tekstu najlepsze jest jednak powiadomienie ACTN_CHECK (zamawiane przez ACTR_CHECK). Możesz w nim modyfikować tekst, już w trakcie wpisywania (np. nie dopuszczając do wprowadzenia konkretnych znaków)...

No są tego plusy i minusy. Ja raczej wzbraniam się od takiego postępowania. Komuś się coś kliknie niechcący i otrzyma domyślne ustawienie (lub ostatnie).

A za reszte informacji dziękuje może niedługo uda mi sie skończyć tą konfigurację. Dziś nie mam już czasu ale może jutro smile.gif
KoSiarzPL
Niestety poraz kolejny jestem bezradny. Proba wyłączenia kontrolki w oknie konfiguracji:

UIActionSetStatus( anBase->act, 1, ACTS_DISABLED ); //dla prostoty tej samej

UIActionSetStatus( sUIAction(cfg_glowne, IMIB_CFG|cfg_kontrolka1), 1, ACTS_DISABLED ); //a teraz konkretnej

Coz znowu robie nie tak?
Olórin
UIActionSetStatus( anBase->act, 1, ACTS_DISABLED, ACTS_DISABLED ); ? moze maski brakowalo?
KoSiarzPL
Zgodnie z dokumentacja UIActionSetStatus ma tylko 3 parametry sUiaction, status, mask.

Probowalem użyć też z przykłądu:
sUIActionInfo ai;
ai.act = an->act;
ai.mask = UIAIM_STATUS;
ai.status = ACTS_DISABLED;
ai.statusMask = ACTS_DISABLED;

ICMessage(IMI_ACTION_SET , (int)&ai);

Bez rezultatu.
Olórin
Miało być:
UIActionSetStatus( anBase->act, ACTS_DISABLED, ACTS_DISABLED );

ale skoro to nie działa to musi się hao wypowiedzieć.
KoSiarzPL
To przy okazji jeszcze potrzebuje informacji. Jesli dodam przycisk do toolbara w oknie wiadomosci to na razie moge przechwycic jego tworzenie ale nie iwem jak przechwycic jego wyswietlenie (mam zaznaczone zapamietuj rozmowe czy jakos tak).
Poza tym jak ukryc moj przycisk we wszystkich oknach jesli bede tego potrzebowal (jeszcze nie szukalem sam ale jak juz ktos bedzie odpowiadal wink.gif ) Chodzi mi o przejście wszystkich otwartych (zapamietanych) okien jakąś iteracja i powysyłąć tam jakieś msg.

Poza tym w sdk jest napisane:
#define IMIG_MSGTB 200
Definicja w linii 860 pliku UI.h.

I tyle. A szukałem jak umieścic swój przycisk na toolbarze. Całe szczęście mam sporo kodów wtyczek to dogrzebałem się.

Jeszcze przy okazji dowiedział bym się chętnie jak przechwycić zmianę statusu kontaktu.
hao
Przechwycenie zmiany statusu - ACTN_STATUS (zamawiane przez ACTR_STATUS).

żeby zrobić disabled najwygodniej:
UIActionSetStatus( anBase->act, -1, ACTS_DISABLED );
żeby wyłączyć:
UIActionSetStatus( anBase->act, 0, ACTS_DISABLED );

Dziwne, że nie działa... Na jakiego typu kontrolce to próbujesz?
W oknie @DEV masz przycisk UI - tam możesz debugować akcje, włącznie ze zmieniającym się statusem...


O ile dobrze pamiętam, niestety możesz wyłapać tylko moment tworzenia przycisków w toolbarze okna rozmowy, a już nie ich wyświetlania...

Przy okazji słówko o akcjach w oknach / menusach przypisanych do kontaktów. Jest tylko jedna instancja akcji. Operując na takich akcjach zawsze musimy podać id kontaktu o który nam chodzi, w przeciwnym razie możemy zmienić dane kilku różnym kontaktom (jeżeli w międzyczasie inny wątek przestawi aktualnie aktywny kontakt dla akcji...). Poza tym np. ustawiany status zapisywany jest w "całej" akcji, ale jego skutek widoczny jest tylko w kontrolce wybranego kontaktu...
Dlatego wszystko ładnie działa, gdy dane akcji ustawiamy - nie powinniśmy ich jednak pobierać (oprócz handle, group handle i wartości pól w więcej - one są osobne dla każdego kontaktu)! To podstawowa wada tego systemu, ale wystarczy o niej pamiętać, żeby później się nie denerwować smile.gif

Teraz żeby ukryć przycisk dla wszystkich kontaktów, przejęć w pętli wszystkie kontakty (z głowy, może się nie zgadzać wink.gif ):

QUOTE
sUIAction(...,...) act;
int c = ICMessage(IMC_CNT_COUNT);
for (i = 1; i < c; ++i) {
  act.cnt = i; // tak, identyfikatorem kontektu może być zamiennie identyfikator, lub jego pozycja na liście
  if (UIActionHandle(act)) {
    UIActionSetStatus(act ....);
  }
}


Olórin
QUOTE
O ile dobrze pamiętam, niestety możesz wyłapać tylko moment tworzenia przycisków w toolbarze okna rozmowy, a już nie ich wyświetlania...

To ja zapytam: da się w przypadku okna rozmowy wyłapać jakiekolwiek zdarzenie które powie mi że okno jest już utworzone i spozycjonowane? Bo że tak powiem jest to kluczowa sprawa ;p
hao
W takich przypadkach najlepiej subclassować całe okno metodami windowsowymi smile.gif
Olórin
No do tego doszedłem... tylko w którym miejscu okno jest pokazywane i finalnie spozycjonowane przez UI? Albo jak to pozycjonowanie zablokować.
hao
Po prostu obsłuż komunikat zmiany pozycji. WM_SETPOS czy jakoś... Zobacz Spy++ smile.gif
Olórin
A gdzie UI przechowuje ustawione rozmiary okna rozmowy? Szukałem i nie moge znaleźć... do głównego jest w konfigu, a rozmowy?
KoSiarzPL
To ja dorzucę pytanie. Czy są w jakis sposób przechowywane otwarte (jak rownież te w pamięci) okna rozmowy? Chciałbym się przez nie przeiterować. A poza tym Olórin jak przechwytujesz komunikaty winapi do okna? Podmieniłeś procedurę odbierania komunikatów? Jeśli tak to czekam na info jak otrzymać uchwyt okna tongue.gif
Olórin
KoSiarz - litości, olórin, jak juz nie chce Ci sie wciskac alta to może być olorin, obydwie pisownie są poprawne.... ale nie przez U!

1. Można zrobić loopa po kontaktach i sprawdzać czy jest uchwyt do okna (czy okno istnieje), bądź specjalnym komunikatem UI (IMI_WNDSTATE czy jakostak) czy jest otwarte
2. Procedure swoją drogą podmieniłem, z resztą nie w jednej wtyczce. Najprościej w oknie stworzyć kontrolkę ACTT_HWND, w ACTN_CREATEWINDOW dostajemy hwnd okna w an->hwndParent.
KoSiarzPL
Ups, sorki Olórin

Całe zamieszanie z tym nie działającym ACTS_DISABLED jest spowodowane przez jkąś niekonsekwencję.

UIActionSetStatus( anBase->act, 1, ACTS_HIDDEN ); // 1
UIActionSetStatus( anBase->act, -1, ACTS_HIDDEN ); // 2

Pierwszy sposób działa jeśli akcja jest dla elementu w menu kontekstowym kontaktu, nie działa dla elementu z konfiguracji. Dla elementu bedącego w konfiguracji musi stać "-1". Dziwne, prawda?
hao
Nie no, panowie, można łatwiej smile.gif

CODE
UIGroupHandle(sUIAction(0, IMIG_MSGWND, cntId));


I mamy uchwyt okna rozmowy...

QUOTE
A gdzie UI przechowuje ustawione rozmiary okna rozmowy? Szukałem i nie moge znaleźć... do głównego jest w konfigu, a rozmowy?

W pliku acts.dtb smile.gif

QUOTE
UIActionSetStatus( anBase->act, 1, ACTS_HIDDEN ); // 1
UIActionSetStatus( anBase->act, -1, ACTS_HIDDEN ); // 2

Pierwszy sposób działa jeśli akcja jest dla elementu w menu kontekstowym kontaktu, nie działa dla elementu z konfiguracji. Dla elementu bedącego w konfiguracji musi stać "-1". Dziwne, prawda?


Faktycznie dziwne... Przy czym dziwne tylko dlatego, że ACTS_HIDDEN akurat jest równe 1... W UIActionSetStatus podajesz status który chcesz ustawić, oraz maskę z bitami, które mają być ruszane... Dlatego gdy chcemy coś włączyć, podajemy jako status -1 (wszystkie bity ustawione), a jako maskę flagi, które nas interesują...
KoSiarzPL
Ooo no to teraz w końcu wiem jak to działa biggrin.gif
KoSiarzPL
QUOTE(hao @ 19.11.2005 - 19:25)
5) Przede wszystkim - _każda_ grupa _musi_ mieć unikalny identyfikator (zwykłe akcje mogą muszą mieć unikalny tylko w obszarze grupy, lub 0)! Najbezpieczniej tworzyć identyfikatory jako (NET * 1000 + liczba_porzadkowa). Twój kod nie działa, bo podałeś jako id podgrupy 0.
Po drugie - ACTT_GROUP / ACTT_GROUPEND to rodzaj kontrolki (ramka wokół grupy ustawień). Żeby utworzyć grupę trzeba jako status ustawić ACTS_GROUP, ale NAJLEPIEJ użyć funkcji UIGroupAdd i nie ustawiać nic specjalnego...

CODE

UIGroupAdd( IMIG_CFG_PLUGS, cfg_glowne, 0, "cos" );
UIGroupAdd( cfg_glowne , cfg_g_grupa , 0 , "grupa" );
UIGroupAdd( cfg_g_grupa , cfg_g_konf , 0 , "podgrupa" );
UIActionCfgAdd( cfg_g_konf, IMIB_CFG, ACTT_CHECK, "checkbox", cfg_checkbox );


Ech robie tak:
UIGroupAdd( IMIG_CFG_PLUGS, cfg_glowne, 0, "cos");
UIActionAdd( cfg_glowne , cfg_g_wyswietl , ACTT_GROUP , "grupa" );
UIActionCfgAdd( cfg_g_wyswietl, 0, ACTT_COMMENT, "komentarz" , 0 , 0 , 0 , 1 );
UIActionCfgAdd( cfg_g_wyswietl, 0, ACTT_COMMENT, "komentarz" , 0 , 0 , 0 , 1 );

Dostaje blad przy uruchamianiu konnekta mowi mi ze:
"grypa cfg_g_wyswietl dla akcji 3 nie istnieje"
No to ja juz nie wiem. Jak wstawie zera to mowi mi ze dla akcji zero nie istnieje.
Olórin
A tak?
CODE
UIGroupAdd( IMIG_CFG_PLUGS, cfg_glowne, 0, "cos");
UIActionAdd( cfg_glowne , 0, ACTT_GROUP , "grupa" );
UIActionCfgAdd( cfg_glowne, 0, ACTT_COMMENT, "komentarz" , 0 , 0 , 0 , 1 );
UIActionCfgAdd( cfg_glowne, 0, ACTT_COMMENT, "komentarz" , 0 , 0 , 0 , 1 );
UIActionAdd( cfg_glowne , 0, ACTT_GROUPEND);
hao
No właśnie, zapomniałem zapytać konkretnie co chcesz zrobić smile.gif

Jeżeli grupa w postaci RAMKI grupującej kilka kontrolek - to tak jak Olórin (czyli płaski układ, wszystkie akcje należą do jednego paretne - ACTT_GROUP, akcje, ACTT_GROUPEND...)

Jeżeli jako podelement z drzewka i nowy ekran, tak jak podałem ja... Twój kod nie działa z prostego powodu:

QUOTE
UIActionAdd( cfg_glowne , cfg_g_wyswietl , ACTT_GROUP , "grupa" );


To NIE tworzy grupy, stąd błąd, że grupa ta nie istnieje... UIGroupAdd tworzy grupę (i nie używasz do tego ACTT_GROUP, które służy do tworzenia ramek!)
KoSiarzPL
Widze ze rzeczywiscie powstalo nieporozumienie. Tak myslalem ze hao mowi o grupowaniu akcji. Mi chodzi po prostu o to ze mam jedna glowna grupe akcji. W oknie mam kilka groupboxow i teraz chce w jeden taki groupbox wstawic jeszce jeden i jesli robie tak:
CODE

UIGroupAdd( IMIG_CFG_PLUGS, cfg_glowne, 0, "glowne", );
UIActionAdd( cfg_glowne , 0 , ACTT_GROUP , "grupa" );
UIActionAdd( cfg_glowne , 0 , ACTT_GROUP , "podgrupa" );
UIActionCfgAdd( cfg_glowne, IMIB_CFG, ACTT_CHECK, "checkbox w podgrupie", cfg_cb, 0, 0, 100 );


Aaa może tak sie nie da? No i to by wszystko wyjaśniało. Włąśnie zauważyłem że nawet EmNotifier tak nie ma tylko jego ramka jest po prostu mała a nie na całą szerokość. :/
Aule
Na obecnym UI sie tego chyba nie da zrobić. Najlepiej rozplanować konfig tak, żeby nie było w nim podgrup.
hao
Da się zrobić, kombinują z ustawianiem pozycjonowania i szerokości, ale nie pomagam i nie polecam smile.gif Najlepiej rozplanować to tak, żeby zagnieżdżania nie było...
Olórin
Jeszcze 1 pytanie wink.gif Czy da się ustalić do którego kontaktu należy okno mając hWnd? Może w GWL_USERDATA w jakiejś strukturze? Czy też muszę robić swojego std::map?
hao
GetProp(hwnd , "CNTID");
Olórin
smile.gif Id kontaktu jest zawsze dość dużą liczbą.... jaka jest dolna granica cntid?
hao
Możesz sprawdzić używając ISCNTID(). Identyfikatory wierszy mają flagę 0x40000000 (DT_ROWID_MASK). Dotyczy to w sumie wszystkiego z DTB - kontaktów, identyfikatorów wiadomości i innych rzeczy w przyszłości które będą z tego korzystać (np. grupy kontaktów smile.gif )
Olórin
CODE
GetProp(hwnd, "CNTID");
nie działa, działa natomiast
CODE
sUICnt * cnt = (sUICnt*)GetProp(hwnd, "CNT");

Ta nieudokumentowana struktura to
CODE
struct sUICnt {
  unsigned int net, status; // obie wartosc nie zawsze musza byc PRAWDZIWE!!!
  unsigned int ID;
};
KoSiarzPL
Troche sie pogubilem. (Przez ponad godzine pisałem tego posta i już zaczynam łapać wink.gif )

1. Chce sprawdzic czy istieje akcja na toolbarze w oknie rozmowy o id "act_przycisk" dla kontaktu to:
CODE
sUIAction akcja( IMIG_MSGTB, act_przycisk, cntID );
void* uchwyt =  UIActionHandle( akcja );
if( uchwyt == 0 ) return 0; //nie ma akcji


2. Teraz jesli stwierdzam ze jest to chce wyslac do inego komunikat SHOW. Wiec:
CODE
sUIActionNotify_base wiadomosc( akcja, ACTN_SHOW );


Dobrze kombinuję? Czy może da się jakoś wkorzystać uchwyt który dostałem z UIActionHandle?.

Pytania z innej beczki.
3. Po co robimy to:
CODE
sUIActionNotify_2params * an = ( anBase->s_size >= sizeof(sUIActionNotify_2params) ) ? static_cast<sUIActionNotify_2params*>(anBase) : 0;

Rozumiem, że chcemy sprawdzic czy wyslany komunikat jest typu sUIActionNotify_2params ale po co? Kiedy będziemy z niego korzystać. Co daje nam ta klasa od zwyklej. Normalnie jest to nam niepotrzebne bo do obslugi komunikatow wystarczy nam klasa sUIActionNotify_base. Chyba, że wiemy iż ktoś wysłał komunikat za pomocą tej klasy to mamy możliwość dobrania się do dodatkowych parametrów. Tak?

4. Czy wartości zwracane przez funkcje wywoływane w IMessageProc() ma jakieś znaczenie. Np wyniki z funkcji ISetCols(), IEnd(), ActionProc(), ...
Olórin
3. http://www.konnekt.info/forum/index.php?sh...52&hl=an+anbase

2. Chcesz wywołać akcję?
CODE
sUIActionNotify_2params akcja = sUIActionNotify_2params();
akcja.act = sUIAction(x,y);    
akcja.code = ACTN_ACTION;
ICMessage(IMI_ACTION_CALL , (int)&akcja , 0);

Oczywiście możesz zamienić rodzaj wywołania smile.gif
4. Oczywiście! W wielu przypadkach.
1. Nie wiem czy sprawdzanie handle dla przycisków będzie działało, hao musi się wypowiedzieć.
KoSiarzPL
1. No wlasnie na tym stoje. Bo zglasza mi zawsze ze takiego uchwytu nie ma. To do czego ta funkcja sluzy? wink.gif A już myślałem że sprytny jestem wink.gif

2. Echh zapomnialem dodac jednej linijki. Wiec
CODE
sUIActionNotify_base wiadomosc( akcja, ACTN_SHOW );
UIActionCall( &wiadomosc );


Olórin ldaczego ty chcesz użyć sUIActionNotify_2params a nie zwykłego sUIActionNotify_base. Poza tym chyba robimy to samo smile.gif

4. Jeśli to takie oczywiste to gdzie mam niby przeczytać jaką wartość powinienem zwrócić? Podaj mi jakiś przykład albo dwa smile.gif (nie mówimy tutaj o odpowiedziach na IM_PLUG_ )

3. Dokladnie mi o to chodzilo!! Po co ludziom wciskać w przykładach jakieś linijki na siłe które są niepotrzebne a oni nie potrafią z nich korzystać? Radził bym poprawienie przykładów (są tam z tego co pamiętam i inne BŁĘDY)
Aule
Co do tej 2: Olórin podał kawałek kodu, który działa na 100%, sam możesz zrobić z nim co chcesz.
KoSiarzPL
Przeciez ja nie mowie ze nie działa. Mój też działa smile.gif

1. Dalej jest aktulne to pytanie. narazie jade na tym co podał hao "UIGroupHandle(sUIAction(0, IMIG_MSGWND, cntId));"
Olórin
QUOTE
Olórin ldaczego ty chcesz użyć sUIActionNotify_2params a nie zwykłego sUIActionNotify_base. Poza tym chyba robimy to samo smile.gif

Ze względu na to że jak użyjesz _base to będzie problem z wtyczkami które mają w/w błąd...

4. plug.h: IM_MSG_RCV, IM_MSG_SEND, IM_MSG_OPEN. Jeżeli nie jest napisane najbezpieczniej zwracać 0 smile.gif
Aule
Hmm, nie bawiłem sie kontrolkami w oknie rozmowy, ale czy nie lepiej po prostu ukrywać kontolkę, gdy nie jest potrzebna, a potem sprawdzać, czy kontrolka ma status ukryty, zamiast czy istnieje?
KoSiarzPL
Gdyby to było takie proste. Niestety takie nie jest.

Hao to jak z tym punktem pierwszym?
hao
Jeżeli chcesz sprawdzić czy istnieje przycisk na toolbarze - sprawdź czy istnieje toolbar smile.gif Przyciski na toolbarze o ile dobrze pamiętam uchwytów nie posiadają. Dla toolbara pobierz UIGroupHandle...
Aule
A co chcesz dokładnie zrobić? Wytłumacz z użyciem znaków interpunkcyjnych wink.gif
KoSiarzPL
Chodzi mi tylko o to, że skoro istnieje "UIActionHandle", to zamiast sprawdzać czy istnieje okno za pomocą "UIGroupHandle", sprawdze czy istnieje akcja (na toolbarze w postaci przycisku). Na jedno wychodzi wink.gif
Skoro to nie działa, to zastanawiam się, uchwyt jakiej akcji mozemy w ten sposób pobrać?
Olórin
Akcji w konfigu.
hao
Handle tak na prawdę jest na użytek wewnętrzny UI. UI wstawia sobie tam różne rzeczy do późniejszego użytku.

O ile dobrze pamiętam, pole to wykorzystywane jest do zapisywania uchwytów okien (dla grup i akcji), uchwytów do HTREEITEM (UIActionHandle na grupach w konfiguracji), uchwytów do pozycji menu (HMENUITEM). Przyciski na toolbarze uchwytów w windzie nie mają - dlatego też handle nie jest używany....

W oknie @Debug można podejrzeć jaka akcje ma Handle, a jaka nie...
KoSiarzPL
Czy grupe przycisków "radio" muszę sam obsługiwać czy może da sie w jakiś sposób obsłużyć to automatycznie. Chodzi o automatyczne odznaczanie pozostałych przycisków. Jeśli da się, to jak oraz jak zrobic kilka takich grup aby się na wzajem nie wyłączały. Być może służy do tego ACTT_CHECKGROUP ale nie potrafie tego poprawnie użyć. Nie ma też wtyczki która by obsługiwała tego typu przyciski.

[edit]
Przed chwilą miałem dziwną sytuację.
CODE
UIActionCfgAdd( cfg_glowne, IMIB_CFG, ACTT_SEPARATOR, 0, 0 , 0, 0, 0 );
UIActionCfgAdd( cfg_glowne, 0, ACTT_COMMENT, "Wyrażenie regularne:" , 0 , 0 , 0 , 200 );
UIActionCfgAdd( cfg_glowne, IMIB_CFG, ACTT_BUTTON, "Domyślne", cfg_id, 0, 0, 80 ); //linia X

Wywalalo mi błąd że akcja net*1000+101 juz istnieje. Błąd ten odnosił się do "linia X", gdzie id jest zupelnie inne. Po skomentowaniu tej linijki wszystko bylo ok. A id = net*1000+101 to id ikonki. Jesli przenioslem "linie X" powyżej separatora wszystko łądnie działało.
Rozwiązaniem było poprawienie tej lini na:
CODE
UIActionCfgAdd( cfg_glowne, 0, ACTT_SEPARATOR, 0, 0 , 0, 0, 0 );

Wiem, że poprzednie nie było prawidłowe. Tak mnie tylko zdziwiło zachowanie K.
Olórin
W temaciku jest tak:
CODE
   UIActionCfgAdd(OPEN_WND,0,ACTT_RADIO|ACTSRADIO_BYPOS|ACTSC_INLINE,"Ikony + tekst", CFG_ICOS);   UIActionCfgAdd(OPEN_WND,0,ACTT_RADIO|ACTSRADIO_BYPOS|ACTSC_INLINE,"Ikony", CFG_ICOS);   UIActionCfgAdd(OPEN_WND,0,ACTT_RADIO|ACTSRADIO_BYPOS|ACTSRADIO_LAST,"Tekst", CFG_ICOS);
KoSiarzPL
1. Nie wiem gdzie ty to znalazłeś ale radiobuttonów nie ma ani we wtyczce ani w jej kodzie sad.gif Może nazwę wtyczki pomyliłeś
2. Podany przez ciebie sposób nie działa.
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.