Как отобразить то же управление на двух различных вкладках?

Наиболее вероятная причина этой проблемы - текстовые файлы не были открыты. Добавьте проверку с помощью is_open, чтобы убедиться, что они были открыты.

При использовании Относительных путей (любой путь, который не идет до корня файловой системы (и является Абсолютным путем)), следите за тем, чтобы программа запускалась из каталога, в который вы верите это быть. Это не всегда тот же каталог, что и исполняемый файл. Термин поиска, чтобы использовать, чтобы узнать больше об этом: Рабочий каталог.

Теперь по другим причинам эта программа не будет работать:

void addWordToDictionary(char* word) { words_ += *word; };

не добавляет слова в словарь. Вместо этого он продвигает адрес, по которому words_ указывает на числовое значение буквы в *word. Это крайне деструктивно, поскольку теряет указатель на буфер, выделенный для words_ в конструкторе, что делает delete[] words_; в деструкторе Dictionary неэффективным и, вероятно, смертельным.

Вместо этого вы хотите (заметьте, я использую , хочу с небольшим трепетом. Что вы действительно хотите сделать, так это использовать std::vector и std::string, но я сильно подозреваю, что это нарушило бы назначение маркер)

  1. Динамически назначать новый Word с new.
  2. Поместите это слово в свободное место в массиве words_. Что-то вроде words_[numberOfWordsInDictionary_] = myNewWord;
  3. Увеличьте numberOfWordsInDictionary_ на 1.

Обратите внимание, что все Word, выделенные с помощью new, должны быть освобождены в деструкторе Dictionary. Вам понадобится цикл for, чтобы помочь с этим.

Кроме того, я бы переместил

    if (numberOfWordsInDictionary_ == capacity_)
    {
        resize();
    }

из Dictionary в addWordToDictionary, чтобы каждый раз, когда вызывается addWordToDictionary, он имеет правильный размер.

Ммм. Пока мы на этом, давайте посмотрим на resize

void resize() {
    capacity_ = capacity_ * 2;
    cout << "Size = " << capacity_ << endl;
};

Это увеличивает capacity_ объекта, но ничего не делает, чтобы выделить больше памяти для words_. Это должно быть исправлено. Вы должны:

  1. Удвоить значение capacity_. У вас уже есть это.
  2. Выделите больший буфер для хранения замены words_ на new.
  3. Скопируйте все Word из words_ в больший буфер.
  4. Освободить буфер, на который в данный момент указывает words_
  5. Точка words_ на новый, больший буфер.

Приложение

Я не очень внимательно изучил find, потому что резня, необходимая для исправления чтения и хранения словаря, скорее всего сделает find непригодной для использования, даже если он в настоящее время работает , Использование reinterpret_cast, однако, является сигналом тревоги. Не должно быть никаких причин для приведения, не говоря уже о наиболее разрешительных из них, в функции поиска. Практическое правило. Когда вы видите reinterpret_cast и не знаете, для чего он нужен, предположите, что он скрывает ошибку, и подходите к ней с осторожностью и подозрением.

В дополнение к изучению правила трех, упомянутого в комментариях, обратите внимание на правило пяти . Это позволит вам сделать гораздо более простой и, возможно, более эффективный словарь, основанный на Word* words_, где words_ будет указывать на массив Word непосредственно вместо указателей на Word с.

6
задан 4 February 2009 в 20:52
поделиться

4 ответа

Если Вам не нужна поддержка режима разработки, Вы можете просто, во времени выполнения, изменять Родителя экземпляра ListBox от одной вкладки до другого (удостоверяющийся устанавливать расположение соответственно, конечно).

По существу это:

listBox1.Parent = tabControl1.TabPages[1];

В конце, хотя, Вы, вероятно, найдете легче просто иметь два ListBox с тем же источником данных.

13
ответ дан 8 December 2019 в 14:47
поделиться

Да, я думаю, что Вам будет нужно управление ListBox на каждой вкладке. Если у них есть те же данные, можно использовать тот же DataSource для обоих все же.

1
ответ дан 8 December 2019 в 14:47
поделиться

Да, добавьте новый экземпляр на каждой вкладке.

1
ответ дан 8 December 2019 в 14:47
поделиться

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

1
ответ дан 8 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: