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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2016, 19:14   #1
Вероника92
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 35
По умолчанию Считывание массива strnggrid

Код:
procedure TForm2.btn1Click(Sender: TObject);
 var i,j,k,t: integer;
     check,checkf,checkk,checkh:boolean;
     max,min:Real;
begin
  Edt1.Text:='';
  n:=se1.Value;
  m:=se2.Value;
  //--------------------------------------------------------ïðîâåðêè íà çàïîëíÿåìîñòü âñåõ ïóíêòîâ

  if rg1.itemindex=-1 then
   begin
     checkf:=true;
     Application.MessageBox('Íå âûáðàíà öåëåâàÿ ôóíêöèÿ!','Ïðåäóïðåæäåíèå!',MB_ICONSTOP)
   end;
 //----------------------------------------------------------------- äëÿ ïóíêòà 3(êâàäðàòíàÿ ìàòðèöà)

    for i:=1 to n  do
    for j:=1 to m do
    if (strngrd1.Cells[j-1,i-1]='')or  ((strngrd4.Visible=true) and (strngrd4.Cells[j-1,i-1]='')) or ((stringGrid1.Visible=true) and (stringGrid1.Cells[j-1,i-1]='')) then
      begin
        strngrd1.SetFocus;
        check:=true
      end;
    if check=True then
     Application.MessageBox('Íå âñå ÿ÷åéêè çàïîëíåíû!','Ïðåäóïðåæäåíèå!',MB_ICONSTOP);

       if Form1.rg1.ItemIndex=1 then
        begin
          if radiogroup1.itemindex=-1 then
           begin
             checkf:=true;
             Application.MessageBox('Íå âûáðàí çíàê îãðàíè÷åíèÿ!','Ïðåäóïðåæäåíèå!',MB_ICONSTOP)
            end;
          if edit1.text='' then
           begin
             checkf:=true;
             Application.MessageBox('Íå ââåäåíî çíà÷åíèå îãðàíè÷åíèÿ!','Ïðåäóïðåæäåíèå!',MB_ICONSTOP)
            end
           end;

 //-------------------------------------------------------
 if (not(check)) and (not(checkf))  then
   begin

      for i:=1 to n do
      for j:=1 to m do
      c[i,j]:=StrToFloat(strngrd1.Cells[j-1,i-1]);
      max:=c[1,1];
      min:=c[1,1];
      for i:=1 to n do
      for j:=1 to m do
       begin
         if max<c[i,j]then max:=c[i,j];
         if min>c[i,j]then min:=c[i,j]
        end;
        If rg1.ItemIndex=0 then
          begin
            for i:=1 to n do
            for j:=1 to m do
            c[i,j]:=max-c[i,j]
           end
        else
        If (rg1.ItemIndex=1)  then
        begin
          k:=0;
          for i:=1 to n do
          for j:=1 to m do
          if c[i,j]<0 then k:=k+1;
          if k>0 then
          begin
            for i:=1 to n do
            for j:=1 to m do
           c[i,j]:=c[i,j]-min;
         end;
      end;

  //-------------------------------  ñ ìàòðèöåé çàïðåòîâ
   if form2.CheckBox1.Checked  then
     begin
      for i:=1 to n do
      for j:=1 to m do
      if strngrd4.cells[j-1,i-1]='0' then
      c[i,j]:=max*1000
     end;

   if n>=m then
         begin
           strngrd1.colCount:=n;
           strngrd3.colCount:=n;
           If form1.rg1.ItemIndex=1 then //strngrd4.colCount:=n;
           stringGrid1.colCount:=n;
           t:=n;
           for i:=1 to t do
           for j:=1 to t do
           if strngrd1.Cells[j-1,i-1]=''then
           begin
             strngrd1.Cells[j-1,i-1]:='0';
             c[i,j]:=0
           end;
          // for i:=1 to t do
           //for j:=1 to t do
           //if strngrd4.Cells[j-1,i-1]=''then strngrd4.Cells[j-1,i-1]:='1' and c1[i,j]:=1;
            //if form1.rg1.ItemIndex=1 then
              // for i:=1 to t do
               //for j:=1 to t do
               //if stringGrid1.Cells[j-1,i-1]=''then StringGrid1.Cells[j-1,i-1]:='0'
             end
          //end
       else
        begin
          strngrd1.RowCount:=m;
          strngrd3.RowCount:=m;
          If form1.rg1.ItemIndex=1 then //strngrd4.rowCount:=m;
          stringGrid1.RowCount:=m;                                   //
          t:=m;
          for i:=1 to t do
          for j:=1 to t do
          if strngrd1.Cells[j-1,i-1]=''then
          begin
            strngrd1.Cells[j-1,i-1]:='0';
             c[i,j]:=0
           end;  
         // for i:=1 to t do
         // for j:=1 to t do
          //if strngrd4.Cells[j-1,i-1]=''then strngrd4.Cells[j-1,i-1]:='1';
          //for i:=1 to t do
          //for j:=1 to t do
          //if stringGrid1.Cells[j-1,i-1]=''then stringGrid1.Cells[j-1,i-1]:='0';
        end;
       // end;


   // for i:=1 to t do
   // for j:=1 to t do
   // c[i,j]:=StrToFloat(strngrd1.Cells[j-1,i-1]);




   //-------------------------------------- óäçàâà

   //--------------------------------------
    for i:=1 to t do
    for j:=1 to t do
      x[i,j]:=0;
      L:=0;
      VengMethod(C, X, L);
    for i:=1 to t do
    for j:=1 to t do
    strngrd3.Cells[j-1,i-1]:=IntToStr(x[i,j]);
    L:=0;
    for i:=1 to t do
    begin
    for j:=1 to t do
    if StrToInt(strngrd3.cells[j-1,i-1])=1 then
    l:=l+strtoint(strngrd1.cells[j-1,i-1])
    end;
     edt1.Text:=floatToStr(L);
  //end;
  //else Form2.Show
//end;
end;
end;
Вылетает при исполнении программы выделяет строчку с c[i,j]:=StrToFloat(strngrd1.Cells[j-1,i-1]); Подскажите, пожалуйста в чем может быть проблема? и как исправить
Вложения
Тип файла: 7z 1.7z (2.79 Мб, 6 просмотров)
Вероника92 вне форума Ответить с цитированием
Старый 12.10.2016, 19:28   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Вылетает при исполнении программы
и что при этом пишет?
Цитата:
Подскажите, пожалуйста в чем может быть проблема?
Программа сказала тебе это в том сообщении, которое ты нам не привела.
Код:
окно сообщения Crtl+A Ctrl+С 
окно ввода форума Ctrl+V
чтобы исправлять, надо знать что исправлять.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 12.10.2016 в 19:35.
evg_m вне форума Ответить с цитированием
Старый 12.10.2016, 19:37   #3
Вероника92
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 35
По умолчанию

текст ошибки в аттаче.есть подозрения что это из-за выделения динамической памяти под массив. но и со сторочкой setlength вылетает
Изображения
Тип файла: png 12.10.png (19.1 Кб, 88 просмотров)
Вероника92 вне форума Ответить с цитированием
Старый 13.10.2016, 09:43   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
есть подозрения что это из-за выделения динамической памяти под массив.
Резонное предположения. Для динамического массива это нужно обязательно.(использовать SetLength).
Цитата:
но и со сторочкой setlength вылетает
Для проверки правильной работы с массивами выполнить рекомендацию отсюда

RangeCheckError это проверка ПРАВИЛЬНОСТИ задания(использования) индексов элементов массивов.
при этом ошибка останется но станет другой и будет понятно что это именно из-за массива, точнее неправильного задания его индекса(-ов).

Немножко телепатии.(Вы не привели код с SetLength)
Нумерация массивов в Delphi начинается с нуля.
соответственно если SetLength(x, 5);
то возможно только x[0] ... x[4]
x[5] уже нет.

У вас циклы используются 1..n и такую же индексацию вы используете в массивах (с, x)
есть две возможности
1. можно НЕ меняя циклов "чуть-чуть" уменьшить индексы массивов с[i-1, j-1] и делать это везде.
2. а можно "чуть-чуть" увеличить сами массивы SetLength(c, n+1, m+1); и все оставить как есть.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.10.2016 в 09:55.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание с Com порта, очистка массива Dmitri4 Общие вопросы Delphi 7 05.04.2016 18:56
Считывание данных массива в число monty "2" Общие вопросы Delphi 20 28.11.2009 18:53
Считывание массива из файла slKAHN Общие вопросы C/C++ 1 15.11.2009 15:01
Считывание массива из файла slKAHN Общие вопросы C/C++ 2 15.11.2009 14:01
DBGrid как StrngGrid Maxs Компоненты Delphi 9 14.05.2009 16:55