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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2011, 08:53   #1
Skalp
Пользователь
 
Регистрация: 01.12.2011
Сообщений: 52
По умолчанию Заполнение динамического массива

Код:
procedure TForm1.Button3Click(Sender: TObject);

var i: integer;

begin

  Button3.Visible:=false;

  Button2.Visible:=true;

  if StringGrid1.RowCount >= ComboBox1.Items.Count then

    SetLength(mx,StringGrid1.RowCount)

  else

    SetLength(mx,ComboBox1.Items.Count);

    for i:=0 to StringGrid1.RowCount-1 do

      mx[ComboBox1.ItemIndex,i]:=StringGrid1.Cells[1,i];

  StringGrid1.Options:=StringGrid1.Options-[goEditing];

  ComboBox1.Enabled:=true;

end;
Есть StringGrid, где можно заполнить 1 столбец, и есть ComboBox, надо заполнить двумерный массив из одного одномерного(ComboBox) и одного измерения другого двухмерного массива(StringGrid).

Вылетает ошибка. Проблема в цикле.

Последний раз редактировалось Skalp; 02.12.2011 в 09:21. Причина: все еще актуально
Skalp вне форума Ответить с цитированием
Старый 02.12.2011, 09:11   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Конечно есть. Где объявлен мх? Почему Вы ему натягиваете одну размерность по длине, пишете в обе? Мы же не телепаты.
Опишу на примере.
Допустим изначально размерность мх[0, 0], Комбобокс 5 элементов, СтрингГрид 10. Жмакаем на кнопку и попадаем на Вашу процедуру. мх становится такого вида: мх[10, 0]
Дальше Вы в цикле пытаетесь засунуть в одномерный массив два измерения и получаете справедливый подзатыльник от дельфи.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 02.12.2011 в 09:16.
Utkin вне форума Ответить с цитированием
Старый 02.12.2011, 09:24   #3
Skalp
Пользователь
 
Регистрация: 01.12.2011
Сообщений: 52
По умолчанию

Цитата:
Где объявлен мх?
Это глобальная переменная.

Сейчас не важно, сколько элементов у ComboBox, есть ItemIndex, он постоянный на протяжении всей процедуры.
У StringGrid тоже на протяжении процедуры одно измерение постоянно.

Фактически, я присваиваю одномерный массив другому одномерному.

Последний раз редактировалось Skalp; 02.12.2011 в 09:31.
Skalp вне форума Ответить с цитированием
Старый 02.12.2011, 09:28   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
у меня combobox.intemindex не меняется
Я рад за Вас, но про это даже не упоминал. Я понял, что это глобальный массив - покажите где он инициализируется .
Цитата:
двумерному массиву с одним фиксированным измерением
Что это? Вы хоть представляете те действия которые пытаетесь совершить и те действия которые совершаете? Что бы предупредить еще один бесполезный пост с Вашей стороны рекомендую прочитать в гугле как используется SetLength для многомерных массивов. И сравнить с тем, как использовали его Вы.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 02.12.2011 в 09:32.
Utkin вне форума Ответить с цитированием
Старый 02.12.2011, 09:33   #5
Skalp
Пользователь
 
Регистрация: 01.12.2011
Сообщений: 52
По умолчанию

Цитата:
Я понял, что это глобальный массив - покажите где он инициализируется .
Код:
var
  Form1: TForm1;
  mx: array of array of string;
Цитата:
Вы хоть представляете те действия которые пытаетесь совершить и те действия которые совершаете?
Я следую логике )
Если что не так, то объясните )

Цитата:
как используется SetLength для многомерных массивов
Я подозревал, что причина именно в этом.

Последний раз редактировалось Skalp; 02.12.2011 в 09:39.
Skalp вне форума Ответить с цитированием
Старый 02.12.2011, 09:41   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Если Вы переделываете измерения для двухмерных массивов, то нужно указывать оба измерения, что бы потом не путаться где что.
Должно быть SetLength(mx, измерение1, измерение2)
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.12.2011, 09:43   #7
Skalp
Пользователь
 
Регистрация: 01.12.2011
Сообщений: 52
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Если Вы переделываете измерения для двухмерных массивов, то нужно указывать оба измерения, что бы потом не путаться где что.
Должно быть SetLength(mx, измерение1, измерение2)
Да, я только что погуглил, надо бы вместо условия иф зен елс просто написать SetLength(mx,ComboBox1.Items.Count, StringGrid1.RowCount);

На данном этапе проблема исчерпана, но у меня еще кое-что есть))
Skalp вне форума Ответить с цитированием
Старый 02.12.2011, 09:47   #8
Skalp
Пользователь
 
Регистрация: 01.12.2011
Сообщений: 52
По умолчанию

Как двухмерный массив мх записать в строку с разделителями, сохранить в файл и, соответственно, достать от туда.

Вот как я записфваю его в строку и сохраняю в файл:

Код:
procedure TForm1.N2Click(Sender: TObject);
var sTemp: string;
    i,j: integer;

begin
  saveDialog1.InitialDir:=GetCurrentDir;
  if savedialog1.Execute then
    begin
      ShowMessage('Файл: '+saveDialog1.FileName+' успешно сохранен.');
      sTemp:='';
      SetLength(mx,ComboBox1.Items.Count,StringGrid1.RowCount);
      for i:=0 to ComboBox1.Items.Count-1 do
        begin
          for j:=0 to StringGrid1.RowCount-1 do
            begin
              sTemp:=sTemp+mx[i,j]+'%';
            end;
            sTemp:=sTemp+';';
        end;
      SaveStrToFile(sTemp,savedialog1.FileName);
    end
  else
    ShowMessage('Сохранение файла отменено.');
end;

procedure TForm1.SaveStrToFile(SrcStr: string; FileName: string);
var
  FS: TFileStream;
begin
  FS := TFileStream.Create(FileName, fmCreate);
  try
    FS.WriteBuffer(SrcStr[1], Length(SrcStr) * SizeOf(SrcStr[1]));
  finally
    FS.Free;
  end;
end;
Я не очень понимаю строку : "FS.WriteBuffer(SrcStr[1], Length(SrcStr) * SizeOf(SrcStr[1]));"
И хотел бы узнать, можно ли сделать проще.

Последний раз редактировалось Skalp; 02.12.2011 в 09:52.
Skalp вне форума Ответить с цитированием
Старый 02.12.2011, 09:49   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Все должно быть в одну строку или каждая строка массива в новой строке? Посмотрел по тексту - логика интересная, но я бы делал по-другому.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.12.2011, 09:54   #10
Skalp
Пользователь
 
Регистрация: 01.12.2011
Сообщений: 52
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Все должно быть в одну строку или каждая строка массива в новой строке? Посмотрел по тексту - логика интересная, но я бы делал по-другому.
Все в одну строку, использую для этого два разделителя "%" и ";".
Я решил утрамбовать все в одну строку, потому что так легче сохранить и извлечь.
Вот как расшифровать извлеченную строку и записать обратно в массив не знаю.
Просто когда сохраняется последний последний элемент энной строки массива идут два разделителя подряд "%;", есть какие-нибудь соображения по этому поводу ?

Последний раз редактировалось Skalp; 02.12.2011 в 10:01.
Skalp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание и заполнение динамического списка m@dman Помощь студентам 6 17.10.2010 09:56
Заполнение динамического массива данными из файла и последующий вывод на экран vitalyisaev2 Общие вопросы C/C++ 5 08.09.2010 12:51
Сохранение динамического массива Horus92 Помощь студентам 3 07.05.2009 12:36
Удаление динамического массива Сергей089 Общие вопросы C/C++ 3 08.03.2009 13:13
Заполнение динамического списка из файла KORT Помощь студентам 2 01.05.2007 22:28