powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 3 вопроса. Оптимизация кода, странности с датами, и вызов события из другого события.
4 сообщений из 4, страница 1 из 1
3 вопроса. Оптимизация кода, странности с датами, и вызов события из другого события.
    #39558938
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сабж: Есть счетчик, среди прочего он имеет: Наименование, дату поверки, дату следующей поверки. Счетчики поверяются каждые 5 и 4 года в зависимости от фирмы.
Задача: исходя из названия счетчика, и даты поверки выставить соответствующую дату след. поверки. Таких счетчика на форме 4 шт.
Имена компонент содержат нумерацию и так же соответствуют тегам.
Поясню :
ComboBox с выбором имен для перового счетчика имеет имя "m1c" и тег "1" соответственно, 4-ый счетчик имеет имя "m4c" и т.д. Параметры счетчиков сделаны таким же образом, дата поверки первого счетчика "dp1c" и тд.
Дабы не плодить кучу условий я сделал следующий обработчик для всех четырех DateEdit:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
procedure TForm2.dv1cAcceptDate(Sender: TObject; var aDate: TDateTime;
  var CanAccept: Boolean);
var i,j:integer;
begin

 for j := 0 to ComponentCount - 1 do
 begin
   if (Components[j] is TsComboBox) then
      if  (Components[j] as TsComboBox).Name='m'+inttostr(TsDateEdit(Sender).tag)+'c' then
        begin
           if (Ansipos(AnsiUpperCase('БелЦеннер'),m1c.Text)>0)or(Ansipos(AnsiUpperCase('Zenner'),m1c.Text)>0)
           or(Ansipos(AnsiUpperCase('Гран'),m1c.Text)>0) or(Ansipos(AnsiUpperCase('Сенсус'),m1c.Text)>0)
           or(Ansipos(AnsiUpperCase('Бетар'),m1c.Text)>0) then
             begin
                 for i := 0 to ComponentCount - 1 do
                    if (Components[i] is TsDateEdit) then
                        if  (Components[i] as TsDateEdit).Name='dnv'+inttostr(TsDateEdit(Sender).tag)+'c' then
                            (Components[i] as TsDateEdit).Date:=IncYear(TsDateEdit(Sender).date,5);
             end else
                   for i := 0 to ComponentCount - 1 do
                    if (Components[i] is TsDateEdit) then
                        if  (Components[i] as TsDateEdit).Name='dnv'+inttostr(TsDateEdit(Sender).tag)+'c' then
                            (Components[i] as TsDateEdit).Date:=IncYear(TsDateEdit(Sender).date,4);
        end;
 end;
end;



Возвращаясь к вопросам:
1. Можно ли упростить данную конструкцию? Или пойти каким либо другим путем, не плодя на каждом компоненте одни и те же условия.
2. Почему-то компонента отрабатывает первый раз не правильно. Не важно на какую дату и какой тип счетчика выбирать, результатом будет 30.12.1903. На второй раз срабатывает. Чт-то не так с обработчиком...
3. Можно ли вызвать обработчик к примеру в событии OnChange на Comboboxe с именем счетчика. Чтобы при смене Имени, менялась дата сл. поверки. dv1cAcceptDate(Self, можно ли не менять тут дату,true);
...
Рейтинг: 0 / 0
3 вопроса. Оптимизация кода, странности с датами, и вызов события из другого события.
    #39558944
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такие вещи обычно делаются в базе с учетом параметра счетчика.
В данном случае - в зависимости от интервала поверки счетчика.
А еще лучше - в параметрах счетчика хранится интервал поверки, а в деталях счетчика хранится история поверок.
Срок следующей поверки вычисляется на лету, возможности редактирования даты следующей поверки нет.
Есть теоретическая (вычисляемая) и есть история с фактами поверок.
...
Рейтинг: 0 / 0
3 вопроса. Оптимизация кода, странности с датами, и вызов события из другого события.
    #39558966
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сколько я понял: есть 1 комбик и связаные с ним два DateEdit. Нужно в зависимости от того что выбрано в комбике переставить дату в соответстующем DateEdit.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
// Combo именуются mc1, DateEdit - Date11+Date21, у всех Tag=1
// Combo именуются mc2, DateEdit - Date12+Date22, у всех Tag=2
procedure TForm2.DoChange(Sender: TObject);
var i,j:integer;
    C: TsComboBox;
    D1,D2: TsDateEdit;
const N: array[1..5] of string = ('БУЛЦЕННЕР','ZENNER','ГРАН','СЕНСУС','БЕТАР');
begin
  if Sender is TsComboBox then begin
    C := TsComboBox(Sender);
    D1 := TsDateEdit(FindComponent('Date1'+IntToStr(C.Tag)));
    D2 := TsDateEdit(FindComponent('Date2'+IntToStr(C.Tag)));
  end;
  if Sender is TsDateEdit then begin
    D1 := TsDateEdit(Sender);
    C := TsComboBox(FindComponent('ms'+IntToStr(D1.Tag)));
    D2 := TsDateEdit(FindComponent('Date2'+IntToStr(D1.Tag)));
  end;
  j := 0;
  for i := 1 to Length(N) do
    if AnsiPos(N[i],C.Text)>0 then j := i;
  if J > 0
    then D2.Date := IncYear(D1.date,5)
    else D2.Date := IncYear(D1.date,4);
end;
...
Рейтинг: 0 / 0
3 вопроса. Оптимизация кода, странности с датами, и вызов события из другого события.
    #39559054
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrНа сколько я понял: есть 1 комбик и связаные с ним два DateEdit. Нужно в зависимости от того что выбрано в комбике переставить дату в соответстующем DateEdit.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
// Combo именуются mc1, DateEdit - Date11+Date21, у всех Tag=1
// Combo именуются mc2, DateEdit - Date12+Date22, у всех Tag=2
procedure TForm2.DoChange(Sender: TObject);
var i,j:integer;
    C: TsComboBox;
    D1,D2: TsDateEdit;
const N: array[1..5] of string = ('БУЛЦЕННЕР','ZENNER','ГРАН','СЕНСУС','БЕТАР');
begin
  if Sender is TsComboBox then begin
    C := TsComboBox(Sender);
    D1 := TsDateEdit(FindComponent('Date1'+IntToStr(C.Tag)));
    D2 := TsDateEdit(FindComponent('Date2'+IntToStr(C.Tag)));
  end;
  if Sender is TsDateEdit then begin
    D1 := TsDateEdit(Sender);
    C := TsComboBox(FindComponent('ms'+IntToStr(D1.Tag)));
    D2 := TsDateEdit(FindComponent('Date2'+IntToStr(D1.Tag)));
  end;
  j := 0;
  for i := 1 to Length(N) do
    if AnsiPos(N[i],C.Text)>0 then j := i;
  if J > 0
    then D2.Date := IncYear(D1.date,5)
    else D2.Date := IncYear(D1.date,4);
end;



1. Спасибо, так гораздо удобочитаемее. Я еще добвил пару строк
Код: pascal
1.
2.
   str:=StringReplace(D1.Text,' ','',[rfReplaceAll, rfIgnoreCase]);
    if length(str)>=10 then



перед
Код: pascal
1.
  if J > 0


2. Глюк компоненты, первый раз почему-то обработчик пропускает через себя пустую дату.
3. Отпала надобность.

wadman, направление программы немного не то, просто нет надобности в ведении БД по счетчикам, это простое оформление заявок.
А так, совет дельный, спасибо!

Всем спасибо.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 3 вопроса. Оптимизация кода, странности с датами, и вызов события из другого события.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]