Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как определить первый свободный ИД в ресурсах  (Прочитано 13429 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 07-08-2005 14:52 » 

Господа, вопрос:

мне надо в проекте в процессе выполнения программы динамичски создавать / удалять элементы (иконки и текстбоксы).
Для этого мне надо при создании элемента задавать ИД. Проблема заключается в том, что я понятия не имею, как программно определить первый свободный ИД (и вообще можно ли это сделать), который можно использовать (обычно они стоят в дсв - файлах в самом конце).

Заранее большое спасибо!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 07-08-2005 17:47 » 

В проектах VisualStudio, если использовать его редактор ресурсов, создается файл resources.h . В конце его есть такое вот:
Код:
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS                     1
#define _APS_NEXT_RESOURCE_VALUE        137
#define _APS_NEXT_COMMAND_VALUE         32777
#define _APS_NEXT_CONTROL_VALUE         1008
#define _APS_NEXT_SYMED_VALUE           101
#endif
По крайней мере это у меня согдавал VS 5 и 6.

Вот от этих значений можно и отталкиваться. Напр. использовать с _APS_NEXT_COMMAND_VALUE некое число номеров. Перед назначением проверяй, есть ли такой dlgItem - если есть, то бери следующий и еще раз проверяй.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 07-08-2005 21:01 » 

RXL,
ты думаешь, что можно просто использовать эту константу без применения каких-то спезиальных функций?
Пардон, я только сейчас увидела, что вместо resources.h написала про дсп - файл. У меня проект под 6-ой студией, посему все эти константы именно там и стоят.

И огромное спасибо за идею с dlgItem!   Целую
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 08-08-2005 03:59 » 

Malaja, я думаю, стоит написать ф-ию, которая будет выдавать тебе готовое значение, да бы скрыть всю реализацию внутри.
Если делать перебор с проверкой, то, в принципе, можно отталкиваться от любых начальных значений.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #4 : 08-08-2005 07:29 » 

RXL,

похоже, что эту константу просто так не используешь - в файле стоит:

Код:

#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS                     1
#define _APS_NEXT_RESOURCE_VALUE        133
#define _APS_NEXT_COMMAND_VALUE         32772
#define _APS_NEXT_CONTROL_VALUE         1005
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif


так вот APSTUDIO_INVOKED не определена..., т.о. при компиляции все #define - константы неизвестны...
И что будет, если это условие убрать, я не знаю ;-(
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 09-08-2005 19:55 » 

#define APSTUDIO_INVOKED
#include "resources.h"
#undef APSTUDIO_INVOKED

Типа того. Можно усложнить с условиями - было или нет определено APSTUDIO_INVOKED ранее.

Не обязательно брать данные из этого файла - можно самовольно занять диапазон.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #6 : 10-08-2005 14:39 » 

RXL,

Спасибочки за идею!
Я пыталась найти объяснение, что стоит за APSTUDIO_INVOKED, но ничего не нашла. Если будет виснуть, придется придумывать что-то честное Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
ChaoticCube
ChaoticCube
Помогающий

ru
Offline Offline
Пол: Мужской
ChaoticCube


« Ответ #7 : 11-08-2005 09:22 » new

>Malaja
 Вообще я часто сталкивался с подобной задачей. Всегда хотелось решить именно так, но! еще ни разу не пришлось таки вычислять идентификатор. Есть куча способов сделать такие вещи честно. Описала бы задачу свою поподробнее - может честный способ предложу.

 Однако есть способ и без APSTUDIO_INVOKED.
 С помощью функции GetNextWindow можно выявить все контролы на диалоге, получить все их идентификаторы и просто подобрать следующий.

 Однако, все ж лучше такие сложности не делать. Практически всегда на одном окне можно сказать какое колв-во контролов и какого типа там будет.
Записан

Сила ночи, сила дня - одинакого фигня....
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 12-08-2005 08:07 » 

ChaoticCube,

Проблема следующая : есть форма с каким-то баснословным количеством элементов. В процессе выполнения задачи при определенных условиях на форме должны появляться новые элементы (пока точно CEdit - ы, но также на повестке дня стоят CStatic - и, в которые должны быть вписаны иконки).
Еще одна проблема заключается в том, что каждые 10 секунд происходит обновление информации в окне, т.е. все перерисовывается по новой (а сюда еще входит обмен инфой с другим приложением, посему все вместе есть процесс весма энергоемкий Жаль ).
Т.е. при простом переборе всех элементов это займет очень много времени, что совсем не радует...
Вот такова картина товарища Репина "Приплыли..." Ага

Если ты знаешь еще какие-то возможности выхода из этой ситуации, буду очень благодарна!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
ChaoticCube
ChaoticCube
Помогающий

ru
Offline Offline
Пол: Мужской
ChaoticCube


« Ответ #9 : 12-08-2005 08:52 » 

>Malaja.
 Ну начнем с того что простой перебор займет меньше времени чем перерисовка окна. Причем намного меньше.
 Во-вторых: а зачем делать простой перебор. Кэшируй накопленную информацию в отсортированном списке. То есть  - первый раз с запуском окна - простой перебор. При добавлении, удалении контролов - удаляй из контейнера идентификаторов номер контрола.

 Во-вторых. Самый лучший способ (если это возможно) - определить все контролы который вообще могут быть на окне с самого начала. Это не всегда возможно но все же. С этими контролами работа идет по принципу - ShowWindow, MoveWindow. Надеюсь понятно =).
 Если это не возможно - то существует следующий метод! Создаются и рисуются контролы которые расположены только на видимом пространстве. Вряд ли у тебя юзер наблюдает сразу 500 контролов. Наверняка наблюдает не больше 10-20-ти. =) Ну вот 10-20 контролов и создай - и просто динамически перегружай с ними работу.
 В обоих случаях эффективность работы возрастает сильно. Правда придется хорошо поразбираться с работой контролов. И скорее всего - создать свои - перегруженные.
 
 Еще можно плясать от получения, и потери фокуса элементом. В случае когда элемент не имеет фокуса - его можно просто нарисовать на канве =))) Ибо он занимается только одним - показом информации юзверю.
В случае получения фокуса - придется элемент создавать. Самый сложный способ - потому что требует хорошей работы GUI-мастера.
 Пример такого способа - https://club.shelek.ru/viewart.php?id=161.... Там есть контрол IEPropertyList, который в принципе должен постоянно обладать неизвестным количеством контролов, а реально всегда обладает только одним на котором в данный момент фокус.
Записан

Сила ночи, сила дня - одинакого фигня....
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #10 : 12-08-2005 11:15 » 

ChaoticCube,

Дело в том, что этот проект существует уже давно, посему я имею право (да и время тоже) только на самые необходимые изменения, посему мне нужно самое простое решение.
То, что описываешь ты, хорошо делать в процессе разработки приложения, когда все еще в твоих руках, а когда попадаешь в процессе полета в какую-то кучу чего-то, из которой надо выбираться с наименьшими потерями, то это уже сложно.

Я сейчас смотрю твой пример.
Огромное спасибо за инфу! Я еще попробую посмотреть, как я могу все это вклинить в этот проект.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines