Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.10.2019, 10:54
____jarik____ ____jarik____ вне форума
Прохожий
 
Регистрация: 06.10.2019
Сообщения: 10
Версия Delphi: Delphi XE8
Репутация: 10
По умолчанию list index out of bounds (0)

Здравствуйте!
ошибка list index out of bounds (0)
подскажите в чем ошибка?

Код:
procedure TForm2.Button5Click(Sender: TObject);
begin


    for i := 0 to Form2.ListBox1.Count-1  do

     if (Form2.ListBox1.Items[i] = 'Лиття під тиском')then
      if (Form2.ListBox1.Items[i] = 'Виконати лиття') then

     begin
      a1:=50000; {вартість станка}
      a2:= 8; {кількість годин на добу}
      a3:= 250; {Робочих днів на рік}
      a4:= 1.15; {витратин на обслуговування}
      a5:= 5; {термін окупності}
      a6:= 1.05; {витрати на інструмент}
      a7:=0.75; {потужність станка}
      a8:= 2.13; {тариф за електроенегрію}
      a9:= 500; {зарплата робітника за 1 зміну}
      a10:= 2; {ваговий коефіціент(податкиі зарплата)}
      a11:= 2; {ваговий коефіціент (статистичнйи показник)}
      a12:= 4; {ваговий коефіціент (статистичний показник)}
      a13:= 0.4; {час роботи станка)}

      a:=((((a1*a6*a4)/(a2*a3*a5))+(a7*a8)+((a9*a10)/a2)+((a9*a10)/2*a2)+((a9*a10)/4*a2))*(1+(a14/100)))/a15;

       end;
Админ: Пользуемся тегами при оформлении кода!


Спасибо!

Последний раз редактировалось Admin, 06.10.2019 в 17:07.
Ответить с цитированием
  #2  
Старый 06.10.2019, 12:13
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

В приведенном коде ошибку "list index out of bounds (0)" ничего не вызывает. А сама ошибка говорит о том, что индекс списка к которому идет обращение лежит в не границ. Другими словами, обращение идет к несуществующему индексу списка.
А вот здесь у меня вопрос.
Код:
if (Form2.ListBox1.Items[i] = 'Лиття під тиском')then
if (Form2.ListBox1.Items[i] = 'Виконати лиття') then
Как один и тоже элемент списка может равняться двум различным значениям? Или где-то опечатка?

P.S.: заверните свой код в тег, или же получите предупреждение.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #3  
Старый 06.10.2019, 12:25
____jarik____ ____jarik____ вне форума
Прохожий
 
Регистрация: 06.10.2019
Сообщения: 10
Версия Delphi: Delphi XE8
Репутация: 10
По умолчанию

да, но ошибка появляется при нажатии на эту кнопку.

по поводу этих 2-х строчек, мне необходимо чтобы проверялось 2 условия
эсли в списку есть первое слово и второе слово тогда выполняется формула.

Последний раз редактировалось ____jarik____, 06.10.2019 в 12:39.
Ответить с цитированием
  #4  
Старый 06.10.2019, 12:30
____jarik____ ____jarik____ вне форума
Прохожий
 
Регистрация: 06.10.2019
Сообщения: 10
Версия Delphi: Delphi XE8
Репутация: 10
По умолчанию

вот полный текст программы, но она еще недописанная до конца.

Код:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    ListBox1: TListBox;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Edit3: TEdit;
    Button3: TButton;
    Edit4: TEdit;
    Button4: TButton;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  a,b:Double;
  i:integer;
  a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15:Double;
implementation

{$R *.dfm}

uses Unit5;




procedure TForm2.Button1Click(Sender: TObject);
begin


   if (Edit1.Text = 'Лиття під тиском') or (Edit1.Text = 'Віброабразивна')
   or (Edit1.Text = 'Слюсарна') or (Edit1.Text = 'Фрезерна')
   or (Edit1.Text = 'Свердлильна') or (Edit1.Text = 'Хімічне окислення')
   or (Edit1.Text = 'Маркування') or (Edit1.Text = 'Контроль') then
   ListBox1.Items.Add(Edit1.Text)
   else ShowMessage('Не правильна назва операції');
   Edit1.Clear
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
     if (Edit2.Text = 'Виконати лиття') or (Edit2.Text = 'Виконати обробку заготовок')
     or (Edit2.Text = 'Встановити, закріпити, зняти') or (Edit2.Text = 'Запилити і розчистити місце роз’єму')
     or (Edit2.Text = 'Фрезерувати пов.21, 22') or (Edit2.Text = 'Зняти задирки')
     or (Edit2.Text = 'Фрезерувати пов.6, 3,16 Попередньо ') or (Edit2.Text = 'Фрезерувати пов.2, 3, 4, 10, 11, 19 начисто')
     or (Edit2.Text = 'Фрезерувати пов.23') or (Edit2.Text = 'Свердлити отв. 12 під різьбу М3-6Н')
     or (Edit2.Text = 'Свердлити отв.5, 8 під різьбу М2-6Н') or (Edit2.Text = 'Перевстановити')
     or (Edit2.Text = 'Свердлити отв.20') or (Edit2.Text = 'Свердлити отв.9 під різьбу М2-6Н')
     or (Edit2.Text = 'Розточити отв.7') or (Edit2.Text = 'Розточити отв.6')
     or (Edit2.Text = 'Розточити отв.16')  or (Edit2.Text = 'Нарізати різьбу М2-6Н в 2 отв. Поз.9 ')
     or (Edit2.Text = 'Нарізати різьбу М2-6Н в 4 отв. Поз.5') or (Edit2.Text = 'Нарізати різьбу М2-6Н в 3 отв. Поз.8')
     or (Edit2.Text = 'Змінити інструмент') or (Edit2.Text = 'Нарізати різьбу М3-6Н в 1 отв. Поз.12')
     or (Edit2.Text = 'Нанести хімічне покриття') or (Edit2.Text = 'Маркувати умовний порядковий номер')
     or (Edit2.Text = 'Контролювати паралельність поверхонь') then

   ListBox1.Items.Add(Edit2.Text)

   else ShowMessage('Не правильна назва переходу');
   Edit2.Clear
end;

procedure TForm2.Button3Click(Sender: TObject);

begin
  a14:=StrToInt(Edit3.Text);
  Edit3.Clear
end;

procedure TForm2.Button4Click(Sender: TObject);
begin
  a15:=StrToInt(Edit4.Text);
  Edit4.Clear
end;

procedure TForm2.Button5Click(Sender: TObject);
begin

    for i:=0 to ListBox1.Count-1  do

     if (Form2.ListBox1.Items[i] = 'Лиття під тиском') and
      (Form2.ListBox1.Items[i] = 'Виконати лиття') then

     begin
      a1:=50000; {вартість станка}
      a2:= 8; {кількість годин на добу}
      a3:= 250; {Робочих днів на рік}
      a4:= 1.15; {витратин на обслуговування}
      a5:= 5; {термін окупності}
      a6:= 1.05; {витрати на інструмент}
      a7:=0.75; {потужність станка}
      a8:= 2.13; {тариф за електроенегрію}
      a9:= 500; {зарплата робітника за 1 зміну}
      a10:= 2; {ваговий коефіціент(податкиі зарплата)}
      a11:= 2; {ваговий коефіціент (статистичнйи показник)}
      a12:= 4; {ваговий коефіціент (статистичний показник)}
      a13:= 0.4; {час роботи станка)}

      a:=((((a1*a6*a4)/(a2*a3*a5))+(a7*a8)+((a9*a10)/a2)+((a9*a10)/2*a2)+((a9*a10)/4*a2))*(1+(a14/100)))/a15;

       end;

       if (Form2.ListBox1.Items[i] = 'Віброабразивна')then
        if Form2.ListBox1.Items[i] = 'Виконати обробку заготовок' then

     begin
      a1:=50000; {вартість станка}
      a2:= 8; {кількість годин на добу}
      a3:= 250; {Робочих днів на рік}
      a4:= 1.15; {витратин на обслуговування}
      a5:= 5; {термін окупності}
      a6:= 1.05; {витрати на інструмент}
      a7:=0.75; {потужність станка}
      a8:= 2.13; {тариф за електроенегрію}
      a9:= 500; {зарплата робітника за 1 зміну}
      a10:= 2; {ваговий коефіціент(податкиі зарплата)}
      a11:= 2; {ваговий коефіціент (статистичнйи показник)}
      a12:= 4; {ваговий коефіціент (статистичний показник)}
      a13:= 0.4; {час роботи станка)}

      a:=((((a1*a6*a4)/(a2*a3*a5))+(a7*a8)+((a9*a10)/a2)+((a9*a10)/2*a2)+((a9*a10)/4*a2))*a14)/a15;

       end ;

       Form5.Label1.Caption:='a' ;
       Form5.Show


end;

end.
Админ: Пользуемся тегами при оформлении кода!

Последний раз редактировалось Admin, 06.10.2019 в 17:08.
Ответить с цитированием
  #5  
Старый 06.10.2019, 12:59
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

А вот это
Код:
if (Edit1.Text = 'Лиття під тиском') or (Edit1.Text = 'Віброабразивна')
or (Edit1.Text = 'Слюсарна') or (Edit1.Text = 'Фрезерна')
or (Edit1.Text = 'Свердлильна') or (Edit1.Text = 'Хімічне окислення')
or (Edit1.Text = 'Маркування') or (Edit1.Text = 'Контроль')
и вот это
Код:
if (Edit2.Text = 'Виконати лиття') or (Edit2.Text = 'Виконати обробку заготовок')
or (Edit2.Text = 'Встановити, закріпити, зняти') or (Edit2.Text = 'Запилити і розчистити місце роз’єму')
or (Edit2.Text = 'Фрезерувати пов.21, 22') or (Edit2.Text = 'Зняти задирки')
or (Edit2.Text = 'Фрезерувати пов.6, 3,16 Попередньо ') or (Edit2.Text = 'Фрезерувати пов.2, 3, 4, 10, 11, 19 начисто')
or (Edit2.Text = 'Фрезерувати пов.23') or (Edit2.Text = 'Свердлити отв. 12 під різьбу М3-6Н')
or (Edit2.Text = 'Свердлити отв.5, 8 під різьбу М2-6Н') or (Edit2.Text = 'Перевстановити')
or (Edit2.Text = 'Свердлити отв.20') or (Edit2.Text = 'Свердлити отв.9 під різьбу М2-6Н')
or (Edit2.Text = 'Розточити отв.7') or (Edit2.Text = 'Розточити отв.6')
or (Edit2.Text = 'Розточити отв.16') or (Edit2.Text = 'Нарізати різьбу М2-6Н в 2 отв. Поз.9 ')
or (Edit2.Text = 'Нарізати різьбу М2-6Н в 4 отв. Поз.5') or (Edit2.Text = 'Нарізати різьбу М2-6Н в 3 отв. Поз.8')
or (Edit2.Text = 'Змінити інструмент') or (Edit2.Text = 'Нарізати різьбу М3-6Н в 1 отв. Поз.12')
or (Edit2.Text = 'Нанести хімічне покриття') or (Edit2.Text = 'Маркувати умовний порядковий номер')
or (Edit2.Text = 'Контролювати паралельність поверхонь')
не лучше сделать в ComboBox'e для того, чтобы просто выбироать из списка готовых значений. Так можно избавиться от опечаток пользователя и независить от регистра.

Далее...
Как это по Вашему должно сработать?
Код:
for i:=0 to ListBox1.Count-1 do

if (Form2.ListBox1.Items[i] = 'Лиття під тиском') and
(Form2.ListBox1.Items[i] = 'Виконати лиття') then
ListBox это ведь список строк, а Вы хотите чтобы она, строка из списка, равнялась и "Лиття під тиском" и "Виконати лиття" одновременно. Это как?
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
Этот пользователь сказал Спасибо Kailon за это полезное сообщение:
____jarik____ (06.10.2019)
  #6  
Старый 06.10.2019, 13:22
____jarik____ ____jarik____ вне форума
Прохожий
 
Регистрация: 06.10.2019
Сообщения: 10
Версия Delphi: Delphi XE8
Репутация: 10
По умолчанию

это моя первая программа, не знаком с " ComboBox'e ",

Задача следующая:
у меня есть тех. процесс производства детали
мне необходимо его ввести в программу, название операции и название перехода.
и оценить стоимость каждого перехода по формуле.
в некоторых операциях есть одинаковые названия переходов (например установка) , мне необходимо чтобы программа понимала что это относится к разным операциям и у этих переходов разная стоимость.

Большое спасибо!
Ответить с цитированием
  #7  
Старый 06.10.2019, 13:25
____jarik____ ____jarik____ вне форума
Прохожий
 
Регистрация: 06.10.2019
Сообщения: 10
Версия Delphi: Delphi XE8
Репутация: 10
По умолчанию

"ListBox это ведь список строк, а Вы хотите чтобы она, строка из списка, равнялась и "Лиття під тиском" и "Виконати лиття" одновременно. Это как?"

хотел задать условие чтобы в списке была строка "Лиття під тиском" и строка "Виконати лиття".
не одна и также строка, а просто чтобы в списке били эти 2 строки.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter