Topic: Проблема с массивом

Добрый день, есть на форме, очень много текстовых блоков в виде календаря. Загоняю данные т.блоков в массив, теперь надо на данных одного массива, просуммировать в другом блоке.
Код вставляю такой

procedure frmNewRecord_Button3_OnClick (Sender: TObject; var Cancel: boolean);
var
    td1: string = frmNewRecord.td1.text;    td2: string = frmNewRecord.td1.text;    td3: string = frmNewRecord.td1.text;    td4: string = frmNewRecord.td1.text;
    td5: string = frmNewRecord.td1.text;    td6: string = frmNewRecord.td1.text;    td7: string = frmNewRecord.td1.text;    td8: string = frmNewRecord.td1.text;
    td9: string = frmNewRecord.td1.text;    td10: string = frmNewRecord.td1.text;    td11: string = frmNewRecord.td1.text;    td12: string = frmNewRecord.td1.text;
    td13: string = frmNewRecord.td1.text;    td14: string = frmNewRecord.td1.text;    td15: string = frmNewRecord.td1.text;    td16: string = frmNewRecord.td1.text;
    td17: string = frmNewRecord.td1.text;    td18: string = frmNewRecord.td1.text;    td19: string = frmNewRecord.td1.text;    td20: string = frmNewRecord.td1.text;
    td21: string = frmNewRecord.td1.text;    td22: string = frmNewRecord.td1.text;    td23: string = frmNewRecord.td1.text;    td24: string = frmNewRecord.td1.text;
    td25: string = frmNewRecord.td1.text;    td26: string = frmNewRecord.td1.text;    td27: string = frmNewRecord.td1.text;    td28: string = frmNewRecord.td1.text;
    td29: string = frmNewRecord.td1.text;    td30: string = frmNewRecord.td1.text;    td31: string = frmNewRecord.td1.text;
    td: Array[1..31] of String = [td1, td2, td3, td4, td5, td6, td7, td8, td9, td10, td11, td12, td13, td14, td15, td16, td17, td18, td19, td20, td21, td22, td23, td24, td25, td26, td27, td28, td29, td30, td31];

    d1: double = frmNewRecord.d1.value;    d2: double = frmNewRecord.d1.value;    d3: double = frmNewRecord.d1.value;    d4: double = frmNewRecord.d1.value;
    d5: double = frmNewRecord.d1.value;    d6: double = frmNewRecord.d1.value;    d7: double = frmNewRecord.d1.value;    d8: double = frmNewRecord.d1.value;
    d9: double = frmNewRecord.d1.value;    d10: double = frmNewRecord.d1.value;    d11: double = frmNewRecord.d1.value;    d12: double = frmNewRecord.d1.value;
    d13: double = frmNewRecord.d1.value;    d14: double = frmNewRecord.d1.value;    d15: double = frmNewRecord.d1.value;    d16: double = frmNewRecord.d1.value;
    d17: double = frmNewRecord.d1.value;    d18: double = frmNewRecord.d1.value;    d19: double = frmNewRecord.d1.value;    d20: double = frmNewRecord.d1.value;
    d21: double = frmNewRecord.d1.value;    d22: double = frmNewRecord.d1.value;    d23: double = frmNewRecord.d1.value;    d24: double = frmNewRecord.d1.value;
    d25: double = frmNewRecord.d1.value;    d26: double = frmNewRecord.d1.value;    d27: double = frmNewRecord.d1.value;    d28: double = frmNewRecord.d1.value;
    d29: double = frmNewRecord.d1.value;    d30: double = frmNewRecord.d1.value;    d31: double = frmNewRecord.d1.value;
    d: Array[1..31] of Double = [d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31];

begin
    for i:=1 to 31 DO
        begin
            if td[i] = '"П"' then ds:=ds+d[i];
        end;
    frmNewRecord.EDailyHours.Value := ds;

end;

При нажатии Расчет, получаю ошибку: Variant or safe array out of bounds
Подскажите, пожалуйста, где нужно исправить?
Заранее благодарю

с Ув. Андрей

Re: Проблема с массивом

andrey.yugay wrote:

Variant or safe array out of bounds

Тип Double является общим типом с плавающей запятой в Delphi. Он подводит баланс между вместимость/точность и память/выполнение.
Он поддерживает приблизительно 15 цифр точности в диапазоне от 2.23 x 10-308 до 1.79 x 10308.
 
Если соответствует, то проблема в массиве

Re: Проблема с массивом

pavlenko.vladimir.v wrote:
andrey.yugay wrote:

Variant or safe array out of bounds

Тип Double является общим типом с плавающей запятой в Delphi. Он подводит баланс между вместимость/точность и память/выполнение.
Он поддерживает приблизительно 15 цифр точности в диапазоне от 2.23 x 10-308 до 1.79 x 10308.
 
Если соответствует, то проблема в массиве

Соответсвует; Не подскажите куда копать?

с Ув. Андрей

Re: Проблема с массивом

andrey.yugay wrote:

Соответсвует; Не подскажите куда копать?

а Вы пробовали заменить  Duble?
например на Extended

5 (edited by sparrow 2023-11-10 13:05:29)

Re: Проблема с массивом

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


for i:=0 to 30 DO

Re: Проблема с массивом

pavlenko.vladimir.v wrote:
andrey.yugay wrote:

Соответсвует; Не подскажите куда копать?

а Вы пробовали заменить  Duble?
например на Extended

Тоже самое(
Можно попросить вас посмотреть проект во вложении?

Post's attachments

Attachment icon Табель.zip 412.08 kb, 48 downloads since 2023-11-10 

с Ув. Андрей

Re: Проблема с массивом

sparrow wrote:
for i:=0 to 30 DO

Заработало, спасибо огромное

с Ув. Андрей

Re: Проблема с массивом

andrey.yugay wrote:
sparrow wrote:
for i:=0 to 30 DO

Заработало, спасибо огромное

Получается, что диапазон индексов при объявлении массива игнорируется, учитывается только размер, а индекс всегда начинается с нуля?

Визуальное программирование: блог и телеграм-канал.

9 (edited by sparrow 2023-11-10 14:45:05)

Re: Проблема с массивом

k245 wrote:
andrey.yugay wrote:
sparrow wrote:
for i:=0 to 30 DO

Заработало, спасибо огромное

Получается, что диапазон индексов при объявлении массива игнорируется, учитывается только размер, а индекс всегда начинается с нуля?

Да есть такой момент ...
Сам накалывался

Но зато вот так

    a: Array [1..4] of Double;

begin
    a[1] := 11;
    a[2] := 22;
    a[3] := 33;
    a[4] := 44;

Re: Проблема с массивом

Тоже самое(
Можно попросить вас посмотреть проект во вложении?

Так будет удобнее работать

Post's attachments

Attachment icon Табель-m.zip 376.83 kb, 55 downloads since 2023-11-10 

Re: Проблема с массивом

sparrow wrote:
Тоже самое(
Можно попросить вас посмотреть проект во вложении?

Так будет удобнее работать

Офигеть... надо будет разобраться; думал на счет Кейсов, но как-то сразу не сообразил.
Спасибо огромное за помощь.

с Ув. Андрей

12 (edited by andrey.yugay 2023-11-12 16:37:15)

Re: Проблема с массивом

Добрый день, подскажите, пожалуйста, еще по одному вопросу- Можно ли, разрешить ввод только числовые значения и некоторые буквы?
Сработает ли такое?

if CharInSet(key, ['0'..'9', '.', ',']) then
      Key := #0;
с Ув. Андрей

13 (edited by sparrow 2023-11-12 18:07:30)

Re: Проблема с массивом

procedure Form1_Edit2_OnKeyPress (Sender: TObject; var Key: Char);
begin
  if not ( Key in ['0'..'9','.',',','Z','X']) then key :=#0;
end;

Re: Проблема с массивом

sparrow wrote:
procedure Form1_Edit2_OnKeyPress (Sender: TObject; var Key: Char);
begin
  if not ( Key in ['0'..'9','.',',','Z','X']) then key :=#0;
end;

Как всегда на высоте) Спасибо большое

если кому понадобится, тут коды, берем из #Decimal number - https://adrenalinebot.com/en/api/useful … i-keycodes

с Ув. Андрей

Re: Проблема с массивом

Добрый день,
Подскажите, плиз, можно ли сделать что бы в таблице показывались только уникальные значения из видимых столбцов?

Post's attachments

Attachment icon 2023-11-14_141242.jpg 144.5 kb, 17 downloads since 2023-11-14 

с Ув. Андрей

Re: Проблема с массивом

К сожалению на форуме не сложилось с ясновидящими

17 (edited by andrey.yugay 2023-11-22 11:10:07)

Re: Проблема с массивом

Добрый день, есть 2 комбобокса (зависимых), на первом "Организация" (главном) настроена фильтрация по ролям - все работает, но на 2м зависимом "Департамент", указаны фильтры и они не работают. открывается весь список, а нужно фильтровать.
настроил скриптами (2 первые процедуры), но я думаю это не должно работать так.
Можете подсказать, может я где-то неправильно настроил роли?
Для всех пользователей кроме админа (пустой пароль) пароль 1

Post's attachments

Attachment icon Табель v2.zip 1.56 mb, 48 downloads since 2023-11-22 

с Ув. Андрей

Re: Проблема с массивом

Добрый,

вы проделали двойную работу когда внесли информацию в скрипте и в DataFiltr.

Вы можете оставить DataFiltr и убрать в свойствах ParentComboBox= ComboBox3.
Соответственно закомментировать код в скрипте.

19 (edited by sparrow 2023-11-22 13:14:57)

Re: Проблема с массивом

А в общем в режиме ПарентБокса они работают так как внесены данные в базу данных.


Например для ид=4  Организации определены

департаменты с ид=88 по ид=153

Проверьте зависимость в таблицах организации и департаментов

Re: Проблема с массивом

sparrow wrote:

А в общем в режиме ПарентБокса они работают так как внесены данные в базу данных.


Например для ид=4  Организации определены

департаменты с ид=88 по ид=153

Проверьте зависимость в таблицах организации и департаментов

Доброго.
В том то и дело, если закоментить код, то вываливается весь список

с Ув. Андрей

Re: Проблема с массивом

В режиме ParentComboBox список дочернего Комбо формируется на основе фильтра и зависимости в базе данных.
Как я вам написал при выборе в Родительском окне Организации ИД=4 в дочернем Комбо будут выведены все записи департаментов где
id_tOrganization=4. При этом фильтр изменяет фильтр заданый в ролях.

При отключении функции ParentComboBox работа с фильтрами в ролях работает без нареканий, как через скрипт так и через роли.
Для использования ролей фильтров вам нужно будет их все описывать в ролях.

Re: Проблема с массивом

sparrow wrote:

В режиме ParentComboBox список дочернего Комбо формируется на основе фильтра и зависимости в базе данных.
Как я вам написал при выборе в Родительском окне Организации ИД=4 в дочернем Комбо будут выведены все записи департаментов где
id_tOrganization=4. При этом фильтр изменяет фильтр заданый в ролях.
.

Вот именно, не работает, хотя все прописано. Оставил через скрипт, а то уже много времени на это потратил(((
Спасибо вам за помощь

с Ув. Андрей

Re: Проблема с массивом

SQLExecute('SELECT id FROM tYear WHERE id='+frmNewRecord.ComboBox1.sqlValue);

А если перевести на понятный язык: из таблицы год получить ID когда ID =  frmNewRecord.ComboBox1.sqlValue.
Верно, но бессмысленно поскольку frmNewRecord.ComboBox1.sqlValue уже содержит ID

Тоже самое для месяца.

SQLExecute('SELECT id FROM tGraph WHERE id='+IntToStr(SQLExecute('SELECT id_tGraph FROM TEmployee WHERE id='+frmNewRecord.ComboBox3.sqlValue)));

Тоже верно но все проще если используется подзапрос в самом запросе SQL.
И далее по тексту.