Zireael |
Отправлено: 19 Ноября, 2019 - 01:11:23
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: как мне переменовать ТЕКУЩУЮ вкладку
1. Из обработчика WM_NOTYFI убери лишний код. Похоже что не успевает все события обработать.
CODE:function getmessage(0, WM_NOTIFY)
{
Selected_Tab = sendmessage(TCM_GETCURSEL, 0, 0, formatiw(Object_Tab1));
}
2. В WM_COMMAND добавь ретурны. Нет смысла лишние проверять.
CODE:function getmessage(0, WM_COMMAND)
{
if (message.lparam == Object_Button1)
{
// тут код
return;
}
if (message.lparam == Object_Button2)
{
// тут код
return;
}
// остальное аналогично
}
3. Убрать точки с запятыми после фигурных скобок.
4. С первого раза непонятно видимо, повторю:
Цитата: size(#text_tab_c[0])
Исправить на sizearray(text_tab_c)
5. Зачем ставить флаг TCIF_IMAGE, если иконки не используются?
Теперь, по поводу вопроса. Вот структура:
Цитата: int TCITEMA[7] = {TCIF_TEXT, 0, 0, address(#Buffer1[0]), sizearray(Buffer1), 0, 0}
В ней записан адрес массива Buffer1, а текст для вкладки копируется в Buffer2.
Цитата: strcpy(#Buffer2[0], format(#Text_Tab[0]));
Так может стоит копировать текст туда, откуда он будет браться, а не куда попало.
А вообще проще сразу получить текст из списка в Buffer1 и ничего, никуда копировать не придётся.
Кнопку 'Выбрать' можно убрать. Если в списке была выбрана строка, то сразу выполнить нужные действия. |
|
|
007wan |
Отправлено: 19 Ноября, 2019 - 09:02:39
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael пишет: Из обработчика WM_NOTYFI убери лишний код. Похоже что не успевает все события обработать.
Это лишний код?
CODE:function getmessage(0, WM_NOTIFY)
{
if(addressi(message.lparam) == Object_Tab1)
{
if(addressi(message.lparam+8) == NM_CLICK || addressi(message.lparam+8) == TCN_SELCHANGE)
{
Selected_Tab = sendmessage(TCM_GETCURSEL, 0, 0, formatiw(Object_Tab1));
sendmessage(TCM_GETITEMA, 1, address(#TCITEMA[0]), formatiw(Object_Tab1));//это
//если получили текст текущей вкладки при переключении вкладок, показывать нужные контроллы ShowWindow SW_SHOW & SW_HIDE
return;
}
}
}
тут всего одна строчка дополнительная и всё и скоро еще прибавится код.
Zireael пишет: Зачем ставить флаг TCIF_IMAGE, если иконки не используются? Иконки пока не нарисовал и не придумал. В будущем ширина вкладки будет учитываться и иконка(или нет, если он уже дает ширину с иконками). Zireael пишет: Кнопку 'Выбрать' можно убрать. Если в списке была выбрана строка, то сразу выполнить нужные действия. А можно по двойному щелчку по строчке?
PS:Остальное вроде как поменял. Можно взглянуть (Есть ошибки при запуске, изменил как всё было написано). Яндекс.Жиск.
Напомню суть скрипта: WM_NOTYFY (при переключении вкладки) определяет текст ТЕКУЩЕЙ вкладки, а потом исходя из текста показывает или скрывает нужные контроллы.
(Добавление)
Zireael пишет:
Теперь, по поводу вопроса. Вот структура: Ты же сам говорил, что в буфер записывается последний текст СОЗДАННОЙ вкладки, т.е создали первую вкладку записался ей текст, потом вторую вкладку и он заменился текст. А Как узнать текст текущей вкладки я так и не понял.
(Добавление)
Я конечно единственное что я понял так это, что текст вкладок содержится в структуре TCITEMA, а как получить не ясно. |
|
|
Zireael |
Отправлено: 19 Ноября, 2019 - 10:31:18
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Есть ошибки при запуске
И даже пишет где ошибка, в sizearray.
Цитата: А Как узнать текст текущей вкладки
Цитата: int TCITEMA[7] = {TCIF_TEXT, 0, 0, address(#Buffer1[0]), sizearray(Buffer1), 0, 0}
sendmessage(TCM_GETITEMA, 1, address(#TCITEMA[0]), formatiw(tab)); // текст второй вкладки
// текст второй вкладки будет в массиве Buffer1
Что тут непонятного? Без разницы что было в массиве до этого, хоть вообще пустой, отправили TCM_GETITEMA, указав номер вкладки, текст запишется в массив. Если TCM_SETITEMA, то установит текст вкладки, который записан в массиве.
Цитата: что текст вкладок содержится в структуре TCITEMA
Нет его там. |
|
|
007wan |
Отправлено: 19 Ноября, 2019 - 11:02:51
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael , Последние вопросы и они вам не понравятся)
Есть код)
CODE:Selected_Tab = sendmessage(TCM_GETCURSEL, 0, 0, formatiw(Object_Tab1));
sendmessage(TCM_SETCURSEL, Selected_Tab+1, 0, formatiw(Object_Tab1));
Вопросы: почему TCM_SETCURSEL не отправляет сообщение WM_NOTIFY, мы же назначили(выбрали вкладку), что не так?
Как вызвать WM_NOTIFY принудительно?
Логика такая: вызываем TCM_SETCURSEL, значит нужно узнать текст вкладки, а если текст такой-то, то показать нужные контроллы И что бы мне не писать лишний код, можно просто вызвать WM_NOTIFY(по идеи я думал он сам будет вызываться, а оказалось нет) |
|
|
007wan |
Отправлено: 19 Ноября, 2019 - 11:27:34
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael пишет: Что мешает вызвать функцию, которая выполнит нужный код.
CODE:sendmessage(TCM_SETCURSEL, Selected_Tab+1, 0, formatiw(Object_Tab1));
func(); // вызвать нужную функцию Ой,)
(Добавление)
Zireael , Вот как я примерно хотел, но работает коряво, очень)
При переключении вкладок должен получать норме вкладки и текст, а т.к он не срабатывает или не успевает, то контроллы не убираются и нужные не показываются.
Яндекс.Диск
Так что я не знаю что теперь делать, похожу всё время на которое я потратил Табам в бездну-_-
(Добавление)
Не забудь убрать messagebox WM_NOTIFY |
|
|
Zireael |
Отправлено: 19 Ноября, 2019 - 12:52:04
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: а т.к он не срабатывает или не успевает
Так сложно удалить несколько строчек кода?
Цитата: function getmessage(0, WM_NOTIFY)
{
if(addressi(message.lparam) == Object_Tab1)
{
if(addressi(message.lparam+8) == NM_CLICK || addressi(message.lparam+8) == TCN_SELCHANGE)
{
Selected_Tab = sendmessage(TCM_GETCURSEL, 0, 0, formatiw(Object_Tab1));
Show_Controls(0, 1);
messagebox(1);
return;
}
}
}
CODE:function getmessage(0, WM_NOTIFY)
{
Selected_Tab = sendmessage(TCM_GETCURSEL, 0, 0, formatiw(Object_Tab1));
Show_Controls(0, 1);
} |
|
|
|