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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2011, 08:06   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Не получается составить условие

Добрый день! Прошу помощи. Задача: к двум условиям добавить третье условие, которое получается так: из sListBox8 нужно в цикле взять каждое значение и передать его в kategoria и выполнить код в цикле. С выполнением кода в цикле вроде проблем нет. Проблема в передаче значения в kategoria из списка. Вот код:
Код:
  i1:=0;
  for i1:=0 to Form1.sListBox8.Items.Count - 1 do
  begin
   if (dateszv6 = '+') and (datedsv3 = '-') //and
{      (kategoria = '91') } then
//      (kategoria = Form1.sListBox8.Items[i1]) then
   begin
      //код к цикле 
   end;
  end;
Заранее спасибо за помощь.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.12.2011, 09:30   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

Честно говоря не совсем понял задачу, но может это?
Код:
  for i1:=0 to Form1.sListBox8.Items.Count - 1 do
  begin
// в цикле взять каждое значение и передать его в kategoria
   kategoria := Form1.sListBox8.Items[i1];
   if (dateszv6 = '+') and (datedsv3 = '-') then 
   begin
      //код к цикле 
   end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.12.2011, 09:30   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Если я правильно понял, тогда так:
Код:
i1:=0;
for i1:=0 to Form1.sListBox8.Items.Count - 1 do
begin
  kategoria:=Form1.sListBox8.Items[i1];//присвоили категорию, можем с ней работать в цикле ниже по коду
  if (dateszv6 = '+') and (datedsv3 = '-') then
  begin
    //код к цикле 
  end;
end;

evg_m, одновременно и одно и то же
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 14.12.2011, 09:33   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не совсем понятна постановка вопроса. Из того что понял
Код:
  for i1:=0 to Form1.sListBox8.Items.Count - 1 do
  begin
    kategoria:=Form1.sListBox8.Items[i1];
    if (dateszv6 = '+') and (datedsv3 = '-') and (kategoria = '91') then
    begin
      //код к цикле 
    end;
  end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.12.2011, 10:18   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Всем спасибо за ответы. Проблему вроде решил так. Я забыл сказать, что у меня Form1.sListBox8 заполняется значениями в результате работы хранимой процедуры. Эти же результаты-значения присваиваются и kategoria. Я просто написал так:
Код:
   if (dateszv6 = '-') and (datedsv3 = '-') and
      (kategoria = Form1.sp2.FieldByName('KATEGORIA').AsString) then
   begin
     ....
   end;
Вроде заработало. Но, объясните мне смысл подобной записи? Взял это из головы. Что значит в таких условиях запись вида "а=а"?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.12.2011, 10:24   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если условие kategoria = Form1.sp2.FieldByName('KATEGORIA'). AsString не зависит от индекса цикла его вообще можно вынести за пределы цикла и цикл выполнять только при его истинности. А если оно всегда истинно - зачем оно вообще нужно?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.12.2011, 09:46   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Не, все равно мой способ не совсем корректно работает. Итак, поясняю задачу.
В результате работы кода выше у меня в строковые переменные заносятся некоторые значения, которые были получены в результате работы запросов и хранимых процедур. Из всех переменных, мне нужны только 6:
regnumber,dateszv6,datedsv6,kategor ia,rsvnol,datasnyt.
Первый параметр будет проверяться на пустоту. Если он не пустой, то будет выполняться основной код. Если пустой, то будет выполняться другой код.
Во вторую и третью переменныу всегда будут заноситься значения либо "+" либо "-" в зависимости от результатов работы хранимой процедуры.
Проблема с четвертой переменной. В нее заносится результат работы хранимой процедуры и занесенное значение должно сравниваться со списком значений Form1.sListBox8.
Пятая переменная может принимать только либо значение "Сданы" либо "Не сданы". Он менее важен, т.к. для него код вроде отрабатывается.
Шестая переменная может быть либо пустой либо содержать дату.
Вся проблема с составлением условия. Вот код, который сейчас отрабатывается так как я его написал:
Код:
  ...//тут выше код получения значений в результате работы запросов и хранимых процедур
   if regnumber <> '' then
   begin
   if (dateszv6 = '+') and (datedsv3 = '+') and
      (Form1.sp2.FieldByName('KATEGORIA').AsString = kategoria){ and
      (datasnyt = '') }then
     begin
     end;
   if (dateszv6 = '-') and (datedsv3 = '-') and
      (Form1.sp2.FieldByName('KATEGORIA').AsString = kategoria){ and
      (datasnyt = '') }then
     begin
     end;
   if (dateszv6 = '+') and (datedsv3 = '-') and
      (Form1.sp2.FieldByName('KATEGORIA').AsString = kategoria){ and
      (datasnyt = '') }then
     begin
     end;
   if (dateszv6 = '-') and (datedsv3 = '-') and
      (Form1.sp2.FieldByName('KATEGORIA').AsString = kategoria){ and
      (datasnyt = '') }then
     begin
     end;
   if (dateszv6 = '-') and (datedsv3 = '-') and
      (Form1.sp2.FieldByName('KATEGORIA').AsString = kategoria) and
      (rsvnol = 'Сданы'){ and (datasnyt='')} then
   begin
   end;
   end;

   if regnumber <> '' then
   begin
     ...//другой код, который выполняется правильно
   end;
Т.к. не задается условие с kategoria, то есть одинаковые условия и будет неверно отрабатывать программа. Если его правильно записать, то все будет правильно делать. В предыдущих версиях я использовал для решения этого вопроса БД, но в текущей версии вообще отказался от нее.
Как видно, в коде где if regnumber <> '' есть одинаковые условия, именно поэтому и путается программа. Потому что нет сравнения значения, внесенного в переменную kategoria со списком значений в Form1.sListBox8. Не могу никак правильно воткнуть эту проверку. Прошу помощи. Надеюсь, что сейчас я яснее озвучил задачу.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 16.12.2011 в 09:50.
artemavd вне форума Ответить с цитированием
Старый 16.12.2011, 10:05   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
  for i1:=0 to Form1.sListBox8.Items.Count - 1 do begin
    kategoria:=Form1.sListBox8.Items[i1];
    if Form1.sp2.FieldByName('KATEGORIA').AsString = kategoria then begin
      if regnumber <> '' then begin            // regnumber<>''
        if (dateszv6 = '+') and (datedsv3 = '+') then begin  //+ +
          //
        end
        else if dateszv6 = '+' then begin                    //+ -
          //
        end
        else if datedsv3 = '+' then begin                    //- +
          //
        end
        else begin                                           //- -
          //
        end;
      end
      else begin                               // regnumber=''
      //
      end;
    end
    else begin
      //обработка Form1.sp2.FieldByName('KATEGORIA').AsString <> kategoria
    end;
  end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.12.2011, 10:26   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Но ведь у меня в kategoria в результате работы хранимой процедуры sp2 и заносится значение из Form1.sp2.FieldByName('KATEGORIA'). AsString. Это условие
Код:
if Form1.sp2.FieldByName('KATEGORIA').AsString = kategoria then
точно должно быть?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 16.12.2011, 11:25   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Судя по тому, что вы показали kategoria берете в цикле из ListBox, а сравнение идет со значением поля конкретной записи из Query или Table - то надо. А в общем приведенного кода и ваших объяснений не достаточно для точного диагноза. У вас классическая проблема тестирования значений нескольких параметров, и, в зависимости от комбинации значений, выполнения определенных действий. Для некоторых комбинаций действия возможно совпадают. Хочется и кода меньше написать и прозрачности проги добиться. Если опыта недостаточно лучше расписать все возможные значения комбинаций. Совпадающие участки кода для выполнения действий по условиям можно вынести в отдельные процедуры.

Если kategoria берете из Form1.sp2 то
Код:
    kategoria:=Form1.sListBox8.Items[i1];
    if Form1.sp2.FieldByName('KATEGORIA').AsString = kategoria then begin
замените на
    kategoria:=Form1.sp2.FieldByName('KATEGORIA').AsString;
    if Form1.sListBox8.Items[i1] = kategoria then begin
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.12.2011 в 11:29.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается составить массив чисел для массива букв TheKostarico Общие вопросы C/C++ 4 30.11.2011 14:47
Не получается составить навигацию между Window и page Destroy WPF, UWP, WinRT, XAML 0 18.06.2011 17:38
Не получается составить программу. ITxan Помощь студентам 10 23.10.2010 22:02
Не получается правильно составить запрос XPath, Использую SelectSingleNode kolchakA Общие вопросы .NET 0 09.07.2010 17:32
Помогите пожалуйста решить две задачи по паскалю и составить и составить блок схему! ...Оленька... Паскаль, Turbo Pascal, PascalABC.NET 2 20.01.2009 09:37