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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2017, 17:24   #1
Ernest027
Форумчанин
 
Регистрация: 27.04.2015
Сообщений: 437
По умолчанию Сократить размер кода

Добрый день.
Подскажите, можно ли этот код как-нибудь сократить?
Код:
// 1ый канал
if
(DataModule2.adoquery1.FieldByName('CH1').asstring<>'') and
(DataModule2.adoquery1.FieldByName('CH2').asstring='') and
(DataModule2.adoquery1.FieldByName('CH3').asstring='') and
(DataModule2.adoquery1.FieldByName('CH4').asstring='') then
App.ActiveDocument.Tables.Item(2).Cell(i+2,1).Range.Text:=
'Рис.4.'+inttostr(DataModule2.adoquery1.recno)+
#13#10+
DataModule2.adoquery1.FieldByName('CH1').asstring+' - '+
DataModule2.adoquery1.FieldByName('Точка1').asstring+' '+
DataModule2.adoquery1.FieldByName('№точки1').asstring+', '+
DataModule2.adoquery1.FieldByName('Датчик1').asstring;

// 2ой канал
if
(DataModule2.adoquery1.FieldByName('CH1').asstring='') and
(DataModule2.adoquery1.FieldByName('CH2').asstring<>'') and
(DataModule2.adoquery1.FieldByName('CH3').asstring='') and
(DataModule2.adoquery1.FieldByName('CH4').asstring='') then
App.ActiveDocument.Tables.Item(2).Cell(i+2,1).Range.Text:=
'Рис.4.'+inttostr(DataModule2.adoquery1.recno)+
#13#10+
DataModule2.adoquery1.FieldByName('CH2').asstring+' - '+
DataModule2.adoquery1.FieldByName('Точка2').asstring+' '+
DataModule2.adoquery1.FieldByName('№точки2').asstring+', '+
DataModule2.adoquery1.FieldByName('Датчик2').asstring;

// 3ий канал
if
(DataModule2.adoquery1.FieldByName('CH1').asstring='') and
(DataModule2.adoquery1.FieldByName('CH2').asstring='') and
(DataModule2.adoquery1.FieldByName('CH3').asstring<>'') and
(DataModule2.adoquery1.FieldByName('CH4').asstring='') then
App.ActiveDocument.Tables.Item(2).Cell(i+2,1).Range.Text:=
'Рис.4.'+inttostr(DataModule2.adoquery1.recno)+
#13#10+
DataModule2.adoquery1.FieldByName('CH3').asstring+' - '+
DataModule2.adoquery1.FieldByName('Точка3').asstring+' '+
DataModule2.adoquery1.FieldByName('№точки3').asstring+', '+
DataModule2.adoquery1.FieldByName('Датчик3').asstring;

// 4ый канал
if
(DataModule2.adoquery1.FieldByName('CH1').asstring='') and
(DataModule2.adoquery1.FieldByName('CH2').asstring='') and
(DataModule2.adoquery1.FieldByName('CH3').asstring='') and
(DataModule2.adoquery1.FieldByName('CH4').asstring<>'') then
App.ActiveDocument.Tables.Item(2).Cell(i+2,1).Range.Text:=
'Рис.4.'+inttostr(DataModule2.adoquery1.recno)+
#13#10+
DataModule2.adoquery1.FieldByName('CH4').asstring+' - '+
DataModule2.adoquery1.FieldByName('Точка4').asstring+' '+
DataModule2.adoquery1.FieldByName('№точки4').asstring+', '+
DataModule2.adoquery1.FieldByName('Датчик4').asstring;
Ernest027 вне форума Ответить с цитированием
Старый 24.04.2017, 18:46   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

правильный подход СДЕЛАТЬ правильную таблицу(запрос к БД).
чтобы не в одной строке(записи) была информация о четырех станциях
СН1 точка1 ... CH2 точка2 ... CH3 точка3... CH4 точка4...
и из которых заполнены данные ровно одной станции
а сделать те же четыре записи но в которых будет информация РОВНО по одной станции.

СН1 точка1 ...
СН2 точка2 ...
CH3 ...
CH4 ...

тогда в коде
не будет не будет никаких проверок

и останется только
Код:
App.ActiveDocument.Tables.Item(2).Cell(i+2,1).Range.Text:=
'Рис.4.'+inttostr(DataModule2.adoquery1.recno)+
#13#10+
DataModule2.adoquery1.FieldByName('CH').asstring+' - '+
DataModule2.adoquery1.FieldByName('Точка').asstring+' '+
DataModule2.adoquery1.FieldByName('№точки').asstring+', '+
DataModule2.adoquery1.FieldByName('Датчик').asstring;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.05.2017, 22:19   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

В применении к текущему коду:

Код:

Function GetChannel: byte;
var
  ResultStr: string;
  i: integer;

begin
  
  ResultStr := '';
  
  for i := 1 to 4 do
  begin

    if DataModule2.adoquery1.FieldByName('CH' + IntToStr(i)).asstring = '' then
      ResultStr := ResultStr + '0'
    else
      ResultStr := ResultStr + '1'; 

  end;

  Result := pos('1', ResultStr);

end;
и дальше юзаем функцию

Код:
Channel := GetChannel();

App.ActiveDocument.Tables.Item(2).Cell(i+2,1).Range.Text:=
'Рис.4.'+inttostr(DataModule2.adoquery1.recno)+
#13#10+
DataModule2.adoquery1.FieldByName('CH' + IntToStr(Channel)).asstring+' - '+
DataModule2.adoquery1.FieldByName('Точка' + IntToStr(Channel)).asstring+' '+
DataModule2.adoquery1.FieldByName('№точки' + IntToStr(Channel)).asstring+', '+
DataModule2.adoquery1.FieldByName('Датчик' + IntToStr(Channel)).asstring;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 19.05.2017 в 22:25.
Sciv вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Размер символьной переменной и размер указателя на символьную переменную MrQuestion Помощь студентам 1 29.08.2015 20:52
QFrame c QLabel минимальный размер + размер по содержимому Krasiosoft Qt и кроссплатформенное программирование С/С++ 1 29.06.2015 04:44
сократить код kostan3 Паскаль, Turbo Pascal, PascalABC.NET 2 17.02.2013 17:24
Сократить код shapiro Помощь студентам 0 14.04.2010 17:38
Как уменьшить размер сис кода? Sergeu Общие вопросы Delphi 5 17.01.2009 21:40