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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2014, 01:12   #11
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Если границы для любого из уровней известны, то здесь может помочь динамический массив.
Только в нем можно задавать "не прямоугольные матрицы", т.е. разное количество элементов для каждого элемента предыдущей размерности.
К тому же, автору нужно не два комбобокса, а больше.
И эта задача посильна трех-, четырех-, и т.д. мерным дин. массивам.
Недостаток в этой ситуации - формирование всех размерностей можно делать только в рантайме.

Последний раз редактировалось Прик; 10.02.2014 в 01:14.
Прик вне форума Ответить с цитированием
Старый 10.02.2014, 01:15   #12
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Если границы для любого из уровней известны, то здесь может помочь динамический массив.
Только в нем можно задавать "не прямоугольные матрицы", т.е. с разным количеством элементов для каждого элемента предыдущей размерности.
К тому же, автору нужно не два комбобокса, а больше.
И эта задача посильна трех-, четырех-, и т.д. мерным дин. массивам.
Недостаток в этой ситуации - формирование всех размерностей можно делать только в рантайме.
границы известны, да, но я подобного никогда не делал из-за этого и путаюсь, не могу понять с чего начать и как это должно реализовываться...
FleXik вне форума Ответить с цитированием
Старый 10.02.2014, 01:31   #13
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Без претензий на оптимальность и изящность, только для примера как вариант:
Код:
var
  arr : array of array of Integer; //сам рабочий массив

const
  arr2 : array[0..4] of Integer = (2, 3, 5, 4, 8); //колич. элементов во второй размерности

procedure Tfrmmain.Button1Click(Sender: TObject);
var
  I, J : Integer;
begin
  SetLength(arr, 5); //первая размерность из пяти элементов
  for I := 0 to High(arr) do begin
    SetLength(arr[I], arr2[I]);
    for J := 0 to High(arr[I]) do
      arr[I, J] := J;
      //каким-то образом заполнять вторую размерность значениями
      //видимо, тоже надо сделать свой константный массив (массивы)
  end;
end;
И весь этот геморр только для удобства дальнейшей работы с массивом через индексы. Стоит игра свеч, решать нуждающемуся.

Последний раз редактировалось Прик; 10.02.2014 в 01:45.
Прик вне форума Ответить с цитированием
Старый 10.02.2014, 02:16   #14
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Вобщем подумал немного и что-то уже надумал, в принципе все отлично работает, вот только очень много строк кода получается, но все таки, как вам такой способ? Или кто-то что-то менее геморное предложить может?

Код (естественно изначально указываются пункты через Items.Add):
Код:
procedure TForm1.sButton1Click(Sender: TObject);
begin
ShowMessage(s);
end;

procedure TForm1.sComboBox2Select(Sender: TObject);
begin
s:='';

if Form1.sComboBox1.ItemIndex=1 then
begin
if Form1.sComboBox2.ItemIndex=1 then
s:='273';
if Form1.sComboBox2.ItemIndex=2 then
s:='56';
if Form1.sComboBox2.ItemIndex=3 then
s:='742';
end;

if Form1.sComboBox1.ItemIndex=2 then
begin
if Form1.sComboBox2.ItemIndex=1 then
s:='847';
if Form1.sComboBox2.ItemIndex=2 then
s:='107';
if Form1.sComboBox2.ItemIndex=3 then
s:='18';
if Form1.sComboBox2.ItemIndex=4 then
s:='59';
end;
Изначально я вообще хотел делать через if Pos, т.е сверять название пункта и если название совпадает то присваивать этому пункту нужное число, в принципе это тоже возможно.
FleXik вне форума Ответить с цитированием
Старый 10.02.2014, 02:31   #15
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Сократить код для удобочитаемости можно так:
Код:
  s:='';

  case sComboBox1.ItemIndex of
    1 : case sComboBox2.ItemIndex of
      1 : s:='273';
      2 : s:='56';
      3 : s:='742';
    end;
    2 : case sComboBox2.ItemIndex of
      1 : s:='847';
      2 : s:='107';
      3 : s:='18';
      4 : s:='59';
    end
  end;
Как в этом случае решена проблема изменения количества элементов в комбобоксе 2?

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

Последний раз редактировалось Прик; 10.02.2014 в 02:36.
Прик вне форума Ответить с цитированием
Старый 10.02.2014, 02:34   #16
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Прик, вот, за case of спасибо больше, это уже как минимум достаточно сильно упростит код, спасибо

Прик, жееесть, case of реально работает и очень сильно упрощает работу))))


Цитата:
Перед наименованиями компонентов, находящихся на этой же форме нельзя подставлять квалификатор (переменную формы).
Т.е. конструкция Form1.sComboBox1 является организационной ошибкой.
ничего не понял, можете немного понятнее обьяснить?

Цитата:
Как в этом случае решена проблема изменения количества элементов в комбобоксе 2?
вы про что?

Последний раз редактировалось FleXik; 10.02.2014 в 02:37.
FleXik вне форума Ответить с цитированием
Старый 10.02.2014, 02:43   #17
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Цитата:
ничего не понял, можете немного понятнее обьяснить?
Когда перед именем компонента мы ставим переменную класса, в котором этот компонент находится, это неправильно. В нашем случае это Form1.sComboBox1.
Вы хотите этим сказать, что обращаетесь к комбобоксу, размещенному в классе TForm1. Но ведь комбобокс и так находится на этой форме. Зачем уточнять (называется тавтологией)?. Это не только не логично, но и опасно. При необходимости изменить имя пеерменной (здесь Form1) можно забыть, что везде в тексте подставлено имя этой переменной и придется ее менять. Лишняя работа.

Если бы нам нужно было обратиться к компоненту на другой форме из формы 1, то тогда да, нужно указывать принадлежность этого компонента к другой форме.
Например, Form5.sComboBox1.
А в тексте нашей TForm1 нужно указывать имя компонента без переменной формы Form1. Просто: sComboBox1.

Последний раз редактировалось Прик; 10.02.2014 в 02:49.
Прик вне форума Ответить с цитированием
Старый 10.02.2014, 02:45   #18
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Когда перед именем компонента мы ставим переменную класса, в котором этот компонент находится, это неправильно. В нашем случае это Form1.sComboBox1.
у меня все это дело находится в потоке, поток в Unit2, поэтому приставка Form1 в моем случае - обязательная


и да, я всегда приставку Form использую, пока что вроде как проблем ни с чем не замечал...

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

я так понял вы про это
Код:
procedure TForm1.sComboBox2Select(Sender: TObject);
теперь я понял о чем вы, приму во внимание, спасибо

Последний раз редактировалось FleXik; 10.02.2014 в 02:52.
FleXik вне форума Ответить с цитированием
Старый 10.02.2014, 02:53   #19
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

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

Цитата:
вы про что?
Да про самую первоначальную задачу.
Когда количество элементов в комбобоксе 2 меняется в зависимости от значения ItemIndex в комбобоксе 1.
(см. свой пост #16)

Последний раз редактировалось Прик; 10.02.2014 в 02:58.
Прик вне форума Ответить с цитированием
Старый 10.02.2014, 02:56   #20
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
От дурных привычек следует избавляться.
Обязательно придет время когда эта привычка "выстрелит".
да, спасибо, я принял во внимание, теперь буду всегда использовать так как вы посоветовали как делать правильно, еще раз спасибо за помощь, case of реально очень выручает.



----------
Прик, вы про это (приставку Form1 потом везде где лишняя - уберу)???
Код:
procedure TForm1.sComboBox1Select(Sender: TObject);
begin
  s:='';

  if Form1.sComboBox1.ItemIndex=1 then
  begin
    Form1.sComboBox2.Clear;
    Form1.sComboBox2.Items.Add('');
    Form1.sComboBox2.Items.Add('Один');
    Form1.sComboBox2.Items.Add('Два');
    Form1.sComboBox2.Items.Add('Три');
  end;

  if Form1.sComboBox1.ItemIndex=2 then
  begin
    Form1.sComboBox2.Clear;
    Form1.sComboBox2.Items.Add('');
    Form1.sComboBox2.Items.Add('Четыре');
    Form1.sComboBox2.Items.Add('Пять');
    Form1.sComboBox2.Items.Add('Шесть');
    Form1.sComboBox2.Items.Add('Семь');
  end;

  if Form1.sComboBox1.ItemIndex=3 then
  begin
    Form1.sComboBox2.Clear;
    Form1.sComboBox2.Items.Add('');
    Form1.sComboBox2.Items.Add('Восемь');
    Form1.sComboBox2.Items.Add('Девять');
  end;

end;

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод ветвей и границ для задачи "Багдадский вор" Zavoorchik Помощь студентам 0 01.05.2012 12:04
двумерный массив. вывести все строки, содержащие хотя бы один "0"(ноль) (написать через функцию в Delphi) BLADIMIR Помощь студентам 4 07.09.2011 21:24
"Индекс вне границ массива". Строки. (Проблема еще не решена) Broken Angel Помощь студентам 5 18.01.2011 21:33
C# ошибка:"Индекс находился вне границ массива" potap88 Помощь студентам 16 18.04.2010 15:50
"Слепить" несколько документов в один Diego__ Microsoft Office Word 2 13.02.2010 19:10