Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Снова про массивы переменных  (Прочитано 6275 раз)

MaxHari

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Снова про массивы переменных
« Ответ #15 : 28 Октября 2019, 10:53:49 »
Спасибо за объяснение.

Метод ComboBox.AddItem добавляет только по одной строке.
Можно ли как-то передавать в ComboBox весь массив или список, сформированный ранее?
Это возможно делать с помощью того же метода AddItem в цикле, но как тогда сформировать массив или список небольшого количества заданных значений, не используя "ручной" метод?

Код
ar[1] := 1;
ar[2] := 5;
...
Другими словами, что-то по типу инициализации локального массива ar := (1,5,2,4) на этапе реализации (это также ручной метод, с более удобной записью). В delphi не силён, в примере могут быть синтаксические ошибки.


И на эту же тему...
В описании к  "Глобальному модулю" есть важное замечание по поводу объявления глобальных переменных строкового типа..

Цитировать
Важно! Использование таких глобальных переменных является плохим тоном. Вместо этого рекомендуется создавать глобальные переменные через меню редактирования переменных. Особенно не рекомендуется объявлять в глобальных модулях переменные строковых типов из-за особенностей их хранения в памяти.

Как быть в этом случае со строковыми переменными?
« Изменён: 28 Октября 2019, 10:57:49 от MaxHari »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3009
    • Просмотр профиля
    • Simple-Scada
Re: Снова про массивы переменных
« Ответ #16 : 29 Октября 2019, 09:45:02 »
Цитировать
Можно ли как-то передавать в ComboBox весь массив или список, сформированный ранее?
Нет, для добавления строк в список через скрипты можно использовать только метод AddItem. При необходимости добавление можно сделать в цикле.

Цитировать
но как тогда сформировать массив или список небольшого количества заданных значений, не используя "ручной" метод?
Массивы бывают статические и динамические:
Код: (delphi)
var
  arStat: array[1..4] of byte;  // статический массив
  arDyn: array of integer;      // динамический массив
Про статические массивы мы писали выше: если такой массив объявлен в глобальном модуле, то его можно инициализировать сразу в объявлении. Если статический массив описан не в глобальном модуле, то для его инициализации нужно либо пройти в цикле по элементам массива и заполнить каждый элемент, либо, если значения массива уникальные, то отдельной строкой кода инициализировать каждый элемент массива.
А с динамическими массивами инициализацию можно выполнить и в одну строку, вот пример объявление + инициализация + проход в цикле:
Код: (delphi)
var
  i: integer;
  a: array of integer;
begin
  a := [7, 8, 9]; // инициализируем массив тремя значениями

  for i := 0 to Length(a) - 1 do  // проходим по элементам массива в цикле
  begin
    // здесь работаем с каждым элементом массива
  end;
end.

Цитировать
В описании к  "Глобальному модулю" есть важное замечание по поводу объявления глобальных переменных строкового типа..
Это рекомендация. Ответ написан в процитированном Вами тексте: "... Вместо этого рекомендуется создавать глобальные переменные через меню редактирования переменных.". В целом, если без строк в глобальном модуле можно обойтись, то лучше их в нём не использовать. Если других вариантов нет, то можно использовать строковые переменные.

Создаётся впечатление, что Вы хотите решить какую-то странную задачу средствами скады, не совсем понятно зачем нужны эти массивы и строковые переменные, если со строками в списке можно работать напрямую. И почему Вы хотите передать в список числа типа byte, когда список работает со строками, а не с числами. Возможно, если бы Вы подробно описали конкретную задачу, то мы бы предложили оптимальное решение.

MaxHari

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Снова про массивы переменных
« Ответ #17 : 29 Октября 2019, 16:50:13 »
Спасибо за ответ и напоминание, что со строками в списке можно работать напрямую.

Задача простая, но из-за долгого перерыва и недостатке знаний, завис на простых моментах.

Есть два ComboBox'а, один состоит из 4-х элементов. Для второго имеется n строковых элементов, по разному набору с разными значениями для каждого из 4-х вариантов. Необходимо заполнять второй ComboBox в зависимости от выбора в первом.

Решил вначале объявлением строкового массива в глобальном модуле, инициализации и заполнением его в 'Проект запущен' и использованием в коде.
После переделал на работу со строкой путём вытягивание необходимых элементов по заданным правилам. Сложновато, но работает.
Как альтернатива - можно создать 4 дополнительных ComboBox'а и переносить значения по заданным правилам во второй ComboBox. Или в таблицу занести всё и из неё тянуть. Не знаю, что будет по памяти/нагрузке на систему сложнее.

// Тип byte использовал просто в качестве примера.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3009
    • Просмотр профиля
    • Simple-Scada
Re: Снова про массивы переменных
« Ответ #18 : 30 Октября 2019, 10:18:45 »
Обычно это делают одним OnDatachange скриптом. Пример: у нас есть два раскрывающихся списка ComboBox1 и ComboBox2. Нужно формировать разный набор строк в списке ComboBox2, в зависимости от того что выбрано в списке ComboBox1.

Решение: выделяем список ComboBox1 и на событие OnDataChange назначаем следующий скрипт:
Код: (delphi)
begin
  ComboBox2.Clear;  // очищаем список ComboBox2
  case ComboBox1.AsInt of
    0: // выбрана первая строка в списке ComboBox1
    begin
      ComboBox2.AddItem('Красный');
      ComboBox2.AddItem('Синий');
      ComboBox2.AddItem('Зелёный');
    end;

    1: // выбрана вторая строка в списке ComboBox1
    begin
      ComboBox2.AddItem('Один');
      ComboBox2.AddItem('Два');
      ComboBox2.AddItem('Три');
    end;

    2: // выбрана третья строка в списке ComboBox1
    begin
      ComboBox2.AddItem('Вверх');
      ComboBox2.AddItem('Вниз');
      ComboBox2.AddItem('Влево');
      ComboBox2.AddItem('Вправо');
    end;
  end;
end.
Задача решена.
« Изменён: 30 Октября 2019, 10:20:04 от Simple-Scada »

MaxHari

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Снова про массивы переменных
« Ответ #19 : 01 Ноября 2019, 10:07:33 »
Тот же способ и использовал.
Вместо ComboBox1.AsInt брал ComboBox1.ItemIndex, а элементы загнал в строку и через обработчик вытягивал нужные значения и добавлял их цикле через ComboBox2.AddItem.

Спасибо за помощь :-)