VB6 молча удаляет огромные куски управляющих данных из форм

В моем проекте может быть 130 элементов управления (всего всех меток, текстовых полей и т. д.) в SSTab (4 вкладки). Проект загружается нормально, он работает нормально, я не вижу ни одной ошибки или предупреждения в любой момент, но когда я сохраняю форму с SStab, данные SStab не сохраняются (они полностью исчезли). Обычно соответствующая часть файла .frm выглядит следующим образом:

   Begin TabDlg.SSTab SSTab1 
     Height          =   8895
     [1550 more lines of code for all the controls]
     Width           =   540
   End
   Begin VB.Menu FileMenu

Но в последнее время он обрезается до:

   Begin TabDlg.SSTab SSTab1 
   Begin VB.Menu FileMenu

Это очень расстраивает! В моей VB IDE фрейм, sstab и все элементы управления присутствуют, редактируются, работают/компилируются нормально, никаких сообщений об ошибках в любой момент, но когда вы сохраняете файл, 1550 строк драгоценных данных sstab просто исчезают - опять же, с никаких предупреждений или сообщений об ошибках. Поэтому, если вы выйдете и перезапустите IDE, вы получите ошибку загрузки формы, потому что 60% кода теперь отсутствует. Файл журнала указывает на первую найденную ошибку (в данном случае это Begin TabDlg без End) — в нем нет другой информации. (Файл журнала был создан после того, как код был удален и сохранен, поэтому логично, что он бесполезен.)

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

Я также попытался удалить SStab и переместить все элементы управления в 4 разных кадра. Я успешно сделал это в среде IDE, но при сохранении большой кусок данных (начиная с ползунка) отсутствовал. Так что я понятия не имею, что происходит.

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

Кто-нибудь еще сталкивался с чем-то подобным?


person Fred Hamilton    schedule 03.04.2009    source источник


Ответы (6)


Создайте UserControl для каждой вкладки. Это делает редактирование НАМНОГО проще. Это также позволяет вам красиво разбить код на модули, поэтому каждая вкладка живет в своем собственном файле, и это позволит вам повторно использовать вкладки в другом месте, если хотите.

person Joel Spolsky    schedule 03.04.2009
comment
Ничего себе, я никогда не знал о UserControls до этого. Я помещал каждую вкладку в пользовательский элемент управления, а затем не мог понять, как обращаться к элементам управления в пользовательском элементе управления из моего основного модуля. Затем примерно тогда же произошло повреждение сохранения. Я посмотрю на это снова, когда у меня будет время - это кажется довольно крутым. - person Fred Hamilton; 05.04.2009
comment
Здесь я должен согласиться с Джоэлом. Это способ заполнения элементов управления с вкладками. Вы не помещаете вкладку в пользовательский элемент управления, вы помещаете пользовательский элемент управления в каждую вкладку. Вы не обращаетесь к элементам управления из формы, вы перемещаете их логику в пользовательский элемент управления. Думайте о них как о классах — просто особом виде. - person Bob; 05.04.2009

Звучит ужасно, никогда о таком не слышал.

Предположительно, вы не получаете файл журнала ошибок из VB6, когда загружаете форму в IDE, прежде чем она будет повреждена? Файл журнала имеет то же имя, что и файл формы, но с расширением .log. Например, если при загрузке Myform.frm возникли ошибки, Visual Basic создаст файл журнала с именем Myform.log. Сообщения об ошибках, которые вы можете увидеть, задокументированы в руководстве.

загляните в журнал событий Windows и посмотрите, не регистрируются ли в нем какие-либо интересные проблемы с интегрированной средой разработки VB6. ?

Используете ли вы какие-либо странные элементы управления? Возможно, один из них каким-то образом повреждает FRM или FRX. Файлы FRM - это просто текст, как вы, очевидно, знаете, и формат задокументирован в руководстве VB6. Видите ли вы какое-либо повреждение FRM в текстовом редакторе? Если вы удалите какие-либо свойства, определенные в FRX, все равно произойдет сбой.

Я думаю, что я бы попробовал создать новый проект и новую форму, а затем использовать IDE, чтобы скопировать и вставить в нее все определения элементов управления - без кода. Поиграйте с новой формой, посмотрите, есть ли в ней та же проблема. Может быть, вы можете воссоздать форму таким образом без проблем. Если в новой форме есть проблема, сделайте то же самое, но возьмите только половину элементов управления. Может быть, вы можете найти контроль проблемы с помощью «бинарного поиска».

person MarkJ    schedule 03.04.2009
comment
Я последовал вашему совету и создал совершенно новый проект, вставив в него все элементы управления - пока работает. Ничего полезного в журнале ошибок для файла (кроме указания номера строки, где впервые появляется разрыв). Где находится файл журнала событий? - person Fred Hamilton; 05.04.2009
comment
Это журнал событий Windows, вы используете средство просмотра событий из панели управления. support.microsoft.com/kb/308427 - person MarkJ; 05.04.2009
comment
Что ж, решением оказалось упомянутое выше копирование всех элементов управления и кода в новый проект. Это не заняло много времени, чтобы заставить его работать, и форма работала нормально после нескольких дней интенсивного использования и дополнений. Если я когда-нибудь выясню основную причину, я обновлю этот вопрос. - person Fred Hamilton; 10.04.2009
comment
Рад, что работает! Вы можете использовать файловый дифференциатор для поиска различий между вашей новой рабочей формой и старой поврежденной. - person MarkJ; 11.04.2009

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

person Kevin    schedule 16.10.2009
comment
Интересно, но я получаю всевозможные сообщения об ошибках, когда пытаюсь сохранить с помощью FRX только для чтения. Вы можете сохранить без этих сообщений об ошибках? - person Fred Hamilton; 27.10.2009

Не уверен, что это проблема, но в форме VB6 существует ограничение до 255 (или 256) именованных элементов управления. Возможно, вы сталкиваетесь с этим?

Один из способов обойти это ограничение — использовать массивы элементов управления. Например, если у вас было 10 меток, вместо метки1, метки2, метки3 и т. д. вы могли бы выполнить от метки (0) до метки (9) и использовать только один именованный элемент управления.

Еще одна вещь, которую стоит упомянуть о SSTAB, — это то, как он показывает/скрывает элементы управления. Хотя может показаться, что элементы управления находятся на отдельных вкладках, на самом деле элементы управления перемещаются waaaayyyyy влево (и, следовательно, вне поля зрения). Возможно, с таким количеством компонентов SSTAB задыхается в среде IDE, пытаясь отобразить элементы управления в представлении «Дизайн»?

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

person OneNerd    schedule 03.04.2009
comment
Интересно... Я не думал, что наберу 255, и многие элементы управления уже являются массивами, так что я не думаю, что это так. Однако я подвергаю сомнению некоторые из моих первоначальных предположений о том, что вызывает удаление кода. Сегодня нужно провести еще несколько тестов и обновить описание. Спасибо за ответ! - person Fred Hamilton; 03.04.2009

Так что функция СОХРАНИТЬ не работает.

Я подозреваю, что один из компонентов, которые вы размещаете на полосе вкладок, является виновником.

So ..

1) Проведите инвентаризацию каждого компонента, который вы размещаете в форме.

2) исключить один (вид), СОХРАНИТЬ

3) Это СОХРАНИЛО?

-> Да = это был проблемный элемент управления

-> Нет = вернуться к шагу 2, но выбрать другой тип

Конечно, важно удалить все элементы управления определенного типа на шаге № 2 (например, ВСЕ метки или ВСЕ текстовые поля и т. д.).

Однако я никогда не слышал об этом.

person OneNerd    schedule 03.04.2009

Ты не одинок! Я видел эту проблему. . .фактически я занимаюсь этим прямо сейчас, что и привело меня на этот сайт.

Я работаю с VB с 94 года (VB3) и впервые столкнулся с этой проблемой около 5 или 6 лет назад, когда использовал VB6. Тогда мое решение мало чем отличалось от некоторых предложений, которые вы получили от хороших людей, ответивших выше: выбросить существующий файл и перестроить форму в новом файле. Я сделал это обратно, и с тех пор затронутая форма работала.

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

Также могу подтвердить ваши наблюдения по поводу переноса проекта на второй ПК. . . Я тоже так делал, проблема осталась. Более того, могу добавить, что безрезультатно переносил проект с одной общей системы хранения на другую. (Исходное место хранения было на диске, подключенном к системе Win-tel, а новое место — на NAS на базе UNIX!)

Просто пересобрал файл еще раз и проверил: Controls.Count = 62, так что я далеко не рядом с контрольным пределом 255, упомянутым ранее. Это действительно странно! (Не говоря уже о фурстрации!)

person scotty-    schedule 03.08.2009
comment
Я чувствую твою боль! Я все еще просто занимаюсь этим. После некоторого редактирования это происходит снова, и мне приходится вставлять все в новый проект, и некоторое время он снова работает. Вы используете управление sstab? Мне интересно, имеет ли это какое-то отношение к этому. - person Fred Hamilton; 12.08.2009
comment
Что-нибудь показывает, когда вы используете файловый дифференциал для сравнения рабочих файлов с поврежденными файлами? Вроде первое что нужно проверить. - person MarkJ; 13.08.2009
comment
У меня больше нет копии поврежденного файла (в следующий раз я сохраню копию), но я просмотрел его, когда он впервые начал давать сбой, и что, казалось, произошло, так это то, что огромный кусок данных был просто скопирован. из раздела формы (не кода) файла .frm. Я полагаю, что удаление началось/заканчивалось на границах строк (а не в середине строки), но оно определенно не учитывало вложенную структуру: ABCD /D /C /B /A стало чем-то вроде: AB /A Это было бы интересно измерить пропавший размер (количество строк и байтов)... Сделаю это в следующий раз. - person Fred Hamilton; 14.08.2009