Delphi: восстановить предварительную вкладку после того, как пользователь ее закрыл - PullRequest
0 голосов
/ 04 мая 2010

У меня есть tPageControl в форме, и я создал прекрасную «приветственную страницу» в виде новой таблицы во время разработки, чтобы пользователь мог начать с нее. Однако, если пользователь закрывает эту вкладку, я бы хотел вернуть ее обратно, как это было изначально (очень похоже на страницу приветствия в Delphi IDE). Это кажется простой проблемой ...

Когда вкладка закрывается, исходный лист освобождается и устанавливается на ноль. Я попытался создать лист еще раз по имени (например, tabsheet1: = ttabsheet.create) и назначить его для pagecontrol, но больше нет ни одного из оригинальных компонентов листа ...

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

Спасибо всем!

Расти

Ответы [ 4 ]

2 голосов
/ 04 мая 2010

Как уже упоминал Serg, вы можете просто установить для свойства TabVisible вкладки значение false, если вы хотите скрыть страницу. Элемент управления страницей переключится на следующую вкладку, если потребуется, вкладка исчезнет, ​​и пользователь не сможет вернуться к ней, пока вы не измените TabVisible обратно.

1 голос
/ 04 мая 2010

Повторное создание вкладки времени разработки будет довольно сложной задачей, поскольку вся информация, описывающая ее макет, встроена в ресурс DFM для вашей формы. Это не похоже на отдельный ресурс для каждой вкладки, поэтому вам нужно прочитать ресурс, извлечь часть, относящуюся к вкладке, а затем получить ReadComponent для создания нового экземпляра; Ничто в Delphi не разработано, чтобы сделать это очень легко, поэтому вы должны рассмотреть другие варианты.

Самым простым решением, вероятно, было бы оформление страницы приветствия в рамке ; Я обнаружил, что фреймы немного более эффективны, чем полноценные формы, когда дело доходит до их переучивания.

Другой вариант - создать вкладку целиком в коде. У GExperts есть инструмент, чтобы сделать это довольно легко. Выберите вкладку, а затем выберите команду DExperts « компоненты для кода ». Это помещает некоторый код в буфер обмена, и вы можете вставить его в функцию в вашей программе. Код будет содержать все необходимое для воссоздания выбранных компонентов в коде, а не для их сборки из ресурса DFM. Затем вы можете использовать эту функцию не только для повторного создания вкладки после ее закрытия, но и для создания вкладки в первую очередь. Таким образом, вы можете быть уверены, что вы создаете одну и ту же вещь оба раза.

Причина, по которой ваша попытка воссоздать вкладку не сработала, заключается в том, что имя переменной, используемой для хранения ссылки на форму, на самом деле ничего не определяет. Все, что вы сделали, это создали совершенно новый TTabSheet. Тот факт, что вы сохранили ссылку на нее в той же переменной, которая использовалась для хранения ссылки на старую вкладку, не имеет значения. (Но, пожалуйста, не стесняйтесь, дайте этой переменной более осмысленное имя; все, что говорит «TabSheet1», это то, что это первая вкладка, которую вы поместили в форму, еще тогда, когда вы впервые начали работать над этим проектом.)

0 голосов
/ 04 мая 2010

Спасибо всем за ваши комментарии и предложения. Пара замечаний:

Я попробовал опцию GEExperts (довольно хорошо, я не использовал ее раньше!): Однако, она не сохранила много настроек времени разработки (например, размер шрифта и цвет) ... также были компоненты с глифами, которые не спасись ....

Изменение видимости вкладки также не работает; Контроллер страницы, похоже, не знает, что отображать, даже после вызова .Refresh ... он показывает, что находится под вашим окном.

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

Еще раз спасибо!

0 голосов
/ 04 мая 2010

Роб прав о том, что происходит, и об использовании фреймов, чтобы это исправить. Если вам нужно более простое решение, вы можете просто сделать вкладку невидимой, когда пользователь закрывает ее, а не освобождать ее.

...