Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2009, 19:53   #1
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию Помогите в небольшой оптимизации

Здрасте, вообщем такая проблемка:
У меня Unit10.pas занимает 13378 КБ (13.0 МБ)
И при работе в коде 10 формы после 5-10 изменений делфи начинает виснуть на 5-20 сек. (приходится вырезать весь текс кроме нужной процедуры и т.д, вставлять в блокнот, писать процедуру и затем обратно вставлять в делфи вырезанный текст из блокнота).
И компелируется тож долговато.
Всего 59988 строк.
На строчке 400-500 знаков (эт только там где условие, но часть условия(для удобства) переходит на 2 строчку (если все вместить, то будет примерно 35000 строк))
___________________________________ _
Постараюсь нормально сформулировать что хочу сделать.
Есть часть условия:
if (Edit40.Text<>t1) and (Edit38.Text<>t1) and (Edit36.Text<>t1) and (Edit34.Text<>t1) and (Edit32.Text<>t1) and (Edit30.Text<>t1) and (Edit28.Text<>t1) and (Edit26.Text<>t1) and (Edit24.Text<>t1) and (Edit22.Text<>t1) and (Edit20.Text<>t1) and (Edit18.Text<>t1) and (Edit16.Text<>t1) and (Edit14.Text<>t1) and (Edit12.Text<>t1) and (Edit10.Text<>t1) and (Edit8.Text<>t1) and (Edit6.Text<>t1) and (Edit4.Text<>t1) and (edit2.Text<>t1)
___________________________________ _
Оно повторяется если быть точным 4200 раз.
Изменяются только "номера\имена" эдитов (только четные от 2 до 240) и "t1" (t2, t3, t4, .. ,t35).
Хотелось бы задать переменную (Например "Z") и присвоить ей это условие, но так чтобы переменные "t1, t2, t3, .. ,t35)" и "имена\номера" эдитов задавались в каждой процедуре (всего 6 процедур), где находится оставшееся часть условия.
Можите подсказать как мне это реализовать?
Зарание спс.

Последний раз редактировалось ZBEP; 10.04.2009 в 19:59.
ZBEP вне форума Ответить с цитированием
Старый 10.04.2009, 22:02   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Оформить проверку в виде функции.
Если в номерах TEdit нет закономерности, можно передать список номеров

Код:
function CheckEdits(F:TForm; list:array of integer; S:String):boolean;  overload;
var i: Integer;
    e : TEdit;
begin
   result := true;
   for i := low(list) to high(List) do begin
      e := F.FindComponent('edit'+intToStr(list[i])) as TEdit;
      if e = nil then continue;
      if e.Text = S then begin
         result := false;
         break;
      end;
   end;
end;

   if CheckEdits(Form10, [2, 4, 8], 'aaa') then...
или использовать цикл с некоторым шагом:

Код:
function CheckEdits(F:TForm; nb, ne, step:integer; S:String):boolean;  overload;
var e : TEdit;
begin
   result := true;
   while nb <= ne do begin
      e := F.FindComponent('edit'+intToStr(nb)) as TEdit;
      if (e <> nil) and (e.Text = S) then begin
         result := false;
         break;
      end;
      inc(nb, step);
   end;
end;

if CheckEdits(Form10, 2, 10, 2, 'bbbb') then
Но, все равно, 4K условий - это что-то. Как у Вас только терпения хватило столько написать.
alexBlack вне форума Ответить с цитированием
Старый 10.04.2009, 23:29   #3
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

alexBlack, спасибо))
Закономерность только в том, что берутся каждый 2 эдит до 240 и все впринципи))
3 самоэкзамена + готовая курсовая и дипломная -хороший стимул))

п.с.
Эт только часть условия.
Я делаю авто расстановку расписания всего колледжа по семестрам, включая часы работы препадов, самих препадов, дни, скок пар в неделю, пар в семестр, в день, четная нечетная неделя, кабинеты, совмесные пары, и т.д. с возможностью полной автоматики и ручного изменения.
Правда еще 1.5 года до здачи но она уже на 85% сделана, осталось немного подравнять и оптимизировать))
П.п.с.
Я делфи еще плохо знаю, завтра попытаюсь разобраться и сделать как Вы посоветовали, скорее всего у меня из-за моей пока еще криворукости ниче не выйдет и я опять начну задавать глупые вопроссы..
Лан пока, спс еще раз, я спать.

Последний раз редактировалось ZBEP; 10.04.2009 в 23:43.
ZBEP вне форума Ответить с цитированием
Старый 11.04.2009, 11:51   #4
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

Возможный вариант когда часть текста из файла переносится в отдельный файл и подключается директивой компилятора. Приблизительно так {$I 'DOPFILE.INC'}
естественно, что DOPFILE.INC это имя файла с вынесеным текстом. Тогда эта часть подключится на этапе компиляции и на текстовый редактор не влияет
Всякое безобразие должно быть единообразным. Тогда это называется порядком.

Последний раз редактировалось Anatole; 11.04.2009 в 11:53.
Anatole вне форума Ответить с цитированием
Старый 11.04.2009, 12:48   #5
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Все, СПАСИБО БОЛЬШОЕ!
Разобрался, работает)))
СПС!

Последний вопрос.
Есть ли какая нить маленькая программка, которая сможет в тексте на 13МБ заменить это:
Код:
if (Edit40.Text<>t1) and (Edit38.Text<>t1) and (Edit36.Text<>t1) and (Edit34.Text<>t1) and (Edit32.Text<>t1) and (Edit30.Text<>t1) and (Edit28.Text<>t1) and (Edit26.Text<>t1) and (Edit24.Text<>t1) and (Edit22.Text<>t1) and (Edit20.Text<>t1) and (Edit18.Text<>t1) and (Edit16.Text<>t1) and (Edit14.Text<>t1) and (Edit12.Text<>t1) and (Edit10.Text<>t1) and (Edit8.Text<>t1) and (Edit6.Text<>t1) and (Edit4.Text<>t1) and (edit2.Text<>t1)
На это:
Код:
if CheckEdits(Form10, [40,38,36,34,32,30,28,26,24,22,20,18,16,14,12,10,8,6,4,2], t1)
??

Последний раз редактировалось Stilet; 13.04.2009 в 10:10.
ZBEP вне форума Ответить с цитированием
Старый 11.04.2009, 13:50   #6
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

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

Последний раз редактировалось Anatole; 11.04.2009 в 13:54.
Anatole вне форума Ответить с цитированием
Старый 11.04.2009, 13:58   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Во-первых
if CheckEdits(Form10, [40,38,36,34,32,30,28,26,24,22,20,18 ,16,14,12,10,8,6,4,2], t1)
можно заменить на второй вариант функции
if CheckEdits(Form10, 2, 40, 2, t1)
(c 2-х до 40-ка с шагом 2)

Во-вторых, если в тексте есть повторы, то с большой вероятностью их можно выделить в отдельную функцию. Может и не придется делать замены.

Программка для автозамены скорее всего существует, но ничего конкретного предложить не могу. Я бы для такой замены написал свою утилитку. Это интересней, чем править 4K строк вручную.
alexBlack вне форума Ответить с цитированием
Старый 11.04.2009, 14:38   #8
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Anatole, поиск нашел, замену чет еще ненашел (Ctrl+h некатит)
alexBlack,
Цитата:
Во-вторых, если в тексте есть повторы, то с большой вероятностью их можно выделить в отдельную функцию. Может и не придется делать замены.
Не, повторов нет, переменные и номера эдитов меняются.
За
Цитата:
if CheckEdits(Form10, 2, 40, 2, t1)
спс.
ZBEP вне форума Ответить с цитированием
Старый 11.04.2009, 15:15   #9
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

Для поиска с заменой в меню Delphi пишет Ctrl+R . Кстати, в этом диалоге есть кнопка "Replace all"
Всякое безобразие должно быть единообразным. Тогда это называется порядком.

Последний раз редактировалось Anatole; 11.04.2009 в 15:29.
Anatole вне форума Ответить с цитированием
Старый 11.04.2009, 16:16   #10
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Anatole, спс.
alexBlack, еще похожий вопросик есть:
Вот этот код повторяется 6 раз, изменяются ток дни недели (Понедельник - Суббота)
Код:
procedure TForm10.Button2Click(Sender: TObject);
var t1,t2 ... Ber1, .. , Yac6 :string;
begin
Ribbon1.Caption:='Автораспределение (в разработке):Понедельник';
if n19.checked=true then clear_ed(self);
IniFile:=TIniFile.Create(extractfilepath(paramstr(0))+'\ini\ZBEP.ini');
t1:=IniFile.ReadString('Учитель','1',' ');
...
t35:=IniFile.ReadString('Учитель','35',' ');

Ber1:=IniFile.ReadString('Расписание_Понедельник','36',' ');
...
Yac6:=IniFile.ReadString('Расписание_Понедельник','245',' ');
{Дальше условия ...if CheckEdits(Form10... }
Подскажите еще процедурку, для того что бы не писать все эти 9170 строк 6 раз, из-за того что меняются только дни недели.
Я прост пока додумаюсь много времени пройдет.

Блин, туплю...
Как мне в отдельную функцию засунуть
Код:
var t1,t2 ... Ber1, .. , Yac6 :string;
begin
{Дальше условия ...if CheckEdits(Form10... ... then edit2.text:=t1}
Он мне эдит подчеркует...

Последний раз редактировалось ZBEP; 12.04.2009 в 00:24.
ZBEP вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
небольшой калькулятор Shevali Помощь студентам 8 26.03.2009 21:17
Помощь в оптимизации anger Общие вопросы Delphi 13 05.11.2007 13:15
задачи оптимизации kirasir Microsoft Office Excel 2 08.08.2007 00:40