|
Вопрос # 5 412/ вопрос решён / |
|
Здравствуйте, эксперты!
На форме есть компонент TPageControl на котором достаточно много TTabSheet на которых ещё больше различных компонентов, так проблема в торм что пока работа идёт на одной странице на других страницах компоненты ничего не делают только оперативку жрут, так как сделать чтобы они её не жрали) уверен для этого есть очень много способов но ни одного я не знаю так что прошу помощи)
 |
Вопрос задал: ierihon1 (статус: 1-ый класс)
Вопрос отправлен: 15 июня 2011, 11:21
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: Gooddy
Здравствуйте, ierihon1!
Проблема очень востребованная. Не каждому нравится писать программы жрущие 14 мегабайт. Даже если это большая программа, нужно стараться сокращать расходы памяти к минимуму.
Выход из данной проблемы есть. И даже не один.
1. Можно создавать компоненты для каждой вкладки в RunTime. Для этого нужно заменить PageControl на TabControl и отклавливать изменение вкладки. Далее для каждой вкладки написать процедуры добавления, установки параметров и удаления компонентов.
Для начала делаем такое:
Создаём обработчик для OnChange
там пишем
DeleteNowComponents(); //создаём процедуру для удаления компонентов сейчас находящихся на вкладке.
case TabControl1.TabIndex of
0: Create0Components();
1: Create1Components();
...
end;
Далее в DeleteNowComponents перебираем все компоненты TabControl1 и удаляем с помощью метода Free.
В CreateNComponents пишем много кода, например:
var
CloseButton: TButton;
begin
CloseButton := TButton.Create(TabControl1);
CloseButton.Left := ...;
CloseButton.Caption := ...;
И так - для всех закладок, для всех компонентов!
2. Второе решение очень простое, но в два этапа:
Во-первых, произвести рефакторинг интерфейса - удалить ненужные элементы, заменить некоторые группы элементов на общий менее ресурсоёмкий.
Во-вторых, разделить элементы интерфейса на формы и удалять\создавать нужные когда необходимо.
Вывод:
Второй метод быстро и почти без затрат позволит снизить расходы памяти.
Первый хорош, но придётся писать очень много кода для создания\удаления компонентов run-time.
 |
Ответ отправил: Gooddy (статус: 3-ий класс)
Время отправки: 15 июня 2011, 15:27
Оценка за ответ: 5
Комментарий к оценке: Почему то мне больше понравился первый метод)
|
Мини-форум вопроса
Всего сообщений: 25; последнее сообщение — 15 июня 2011, 15:45; участников в обсуждении: 4.
Страницы: [1] [2] [Следующая »]
|
corban (статус: 2-ой класс), 15 июня 2011, 11:33 [#1]:
??? как они жрут оперативку???? че за компоненты????
|
|
ierihon1 (статус: 1-ый класс), 15 июня 2011, 11:37 [#2]:
самые обычные компоненты. А жрут они её так: запускаюприложение оно с начала занимает 14 мегабайт а после того как пройдусь по все вкладкам оно занимет 38 мегабайт.
|
|
corban (статус: 2-ой класс), 15 июня 2011, 13:40 [#3]:
ну начнем с того если компоненты самые обычные, то отжирать 14 метров памяти в состоянии невидимости просто не могут... че хоть за программа? в чем там заморочка с кучей страниц?
|
|
ierihon1 (статус: 1-ый класс), 15 июня 2011, 13:53 [#4]:
всего около 8 сот компонентов, 9 пайджконтролов на одном 8 страниц на каждой ещё по одному контролу всего их 9 и получается на каждом из восьми конторолов по 5 страниц.
будет проще если я саму программу дам посмотреть.
http://depositfiles.com/files/42zjyz8mc
код прилагать не буду не думаю что там есть что то интересное.
|
|
min@y™ (статус: Доктор наук), 15 июня 2011, 14:28 [#5]:
Ты в проге гденить память динамическую выделяешь? Создаёшь ли каки-нить экземпляры классов в run-time?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
ierihon1 (статус: 1-ый класс), 15 июня 2011, 14:29 [#6]:
нет ничего такого... код практически пустой это всё только интерфейс потому и говорю что в коде нет ничего интересного)
|
|
ierihon1 (статус: 1-ый класс), 15 июня 2011, 14:32 [#7]:
ну только если dll.. но там только небольшие вычисления... но эта проблема возникла ещё до того как я стал их использовать.
|
|
min@y™ (статус: Доктор наук), 15 июня 2011, 14:35 [#8]:
Цитата (ierihon1):
нет ничего такого... код практически пустой
А сколько весит DFM-файл этой самой формы?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
ierihon1 (статус: 1-ый класс), 15 июня 2011, 14:37 [#9]:
Пол мегабайта
|
|
corban (статус: 2-ой класс), 15 июня 2011, 14:41 [#10]:
нет, как раз в коде и должно быть че-нить интересное давай уж смотреть в код
|
|
min@y™ (статус: Доктор наук), 15 июня 2011, 14:44 [#12]:
Ой, мать моя женщина! Скачал я твою прогу. Удивляюсь, что она занимает всего лишь 38 МБ, а не 200! Только экзешник весит больше 8 метров! Жуть какая...
Я тебе как профессионал скажу: это не та задача, к которой надо привязывать скины. Это поддержка скинов хавает память. Имхо, чем проще, тем красивее. Выкинь эти рющечки и примочечки и жизнь наладится.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
ierihon1 (статус: 1-ый класс), 15 июня 2011, 14:47 [#13]:
ты в этом так уверен????? с исползованием стандартных VCL без всяких картинок и рюшечек он вообще память уничтажал доходило и до сотни! жаль нет у меня её уже винду недавно менял а то показал бы)) та что с AC он ещё по божески с памятью обращается)
|
|
ierihon1 (статус: 1-ый класс), 15 июня 2011, 14:48 [#14]:
Да и что хочу сказать эта прога не для того чтобы её продавать а для того чтобы учиться програмировать в целом, поэтому так много компонентов потому и спрашиваю как освободить память от невидимых компонентов.
|
|
ierihon1 (статус: 1-ый класс), 15 июня 2011, 14:55 [#15]:
и ещё с отключенным AC при открытии занимает 4 мега в конце 6 так что всё равно нужно что то с этим делать.
|
|
min@y™ (статус: Доктор наук), 15 июня 2011, 14:56 [#16]:
Цитата (ierihon1):
как освободить память от невидимых компонентов.
А никак. Они все создаются при создании формы и освобождаются при её освобождении.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
ierihon1 (статус: 1-ый класс), 15 июня 2011, 14:58 [#17]:
то есть оставить как есть? а динамически создавать самому 600 кнопочек и 50 эдитов а потом их уничтожаь при переключении тоже не вариант.
|
|
min@y™ (статус: Доктор наук), 15 июня 2011, 15:06 [#18]:
Ну, ещё можно нашлёпать фреймов и создавать/убивать их по мере необходимости.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
ierihon1 (статус: 1-ый класс), 15 июня 2011, 15:15 [#19]:
хм.. я что то пробовал такое но не смог разобраться с фреймами как их использовать так и не понял..
|
|
corban (статус: 2-ой класс), 15 июня 2011, 15:20 [#20]:
вот быстренько посмотрел увидел в dll-ке:
function ChetvertSin1(a:currency):currency;
var a1:real;
begin
a1:=ChetvertSin1(a); // это че за нафиг? бесконечная рекурсия?
if a1 >= 0 then
result:=90-a1
else
result:=90+a1;
end;
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|