Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / сортировка компонентов в Flowpanel / 13 сообщений из 13, страница 1 из 1
13.12.2021, 11:56
    #40119591
Tech N9ne
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
Доброе время суток. Пытаюсь отсортировать компоненты на flowpanel, созданные в ран тайме но, сортировка происходит не правильно, некоторые компоненты принимают правильную последовательность а некоторые нет.

на flowpanel создаю 10 обычных панелей. На каждой панеле прогрессбар (TsArcGauge, но суть одна и та же)..
пытаюсь сортировать по значению прогрессбара.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
  P: array [1 .. 100] of TsPanel;
  G: array [1 .. 100] of TsArcGauge;
....
....
var
  i, j, OldIndex: Integer;
begin
  for i := 1 to 100 do    //цикл
  begin
    if P[i] <> nil then          // только существующие панели
    begin
      for j := 1 to 100 do      //цикл
      begin
        if P[j] <> nil then     //  только существующие панели
        begin
          if G[i].Progress > G[j].Progress then  // если прогресс [i] больше чем прогресс [j]
          begin
            OldIndex := FlowPanel1.GetControlIndex(P[i]);  // берем его индекс
            FlowPanel1.SetControlIndex(P[i], OldIndex + 1);// и прибавляем +1
          end;

          if G[i].Progress < G[j].Progress then
          begin
            OldIndex := FlowPanel1.GetControlIndex(P[i]); //берем его индекс
          if OldIndex > 0 then
          begin
              FlowPanel1.SetControlIndex(P[i], OldIndex - 1);// и отнимаем -1
          end;

          end;
        end;
      end;
    end;
  end;
end;


где я накосячил? вроде логика правильная..
...
Рейтинг: 0 / 0
13.12.2021, 12:07
    #40119597
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
Это какой-то странный способ сортировки, но он немного похож на
https://www.google.com/search?q=паскаль сортировка пузырьком
...
Рейтинг: 0 / 0
13.12.2021, 17:25
    #40119691
Tech N9ne
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
wadman
Это какой-то странный способ сортировки, но он немного похож на
https://www.google.com/search?q=паскаль сортировка пузырьком

у меня сложность заключается в том что, к примеру создано панелей 1,2,3,4,5
если я удалю к примеру панель под индексом[4] (просто сделаю FreeAndNil(P[4]); )
индексация flowpanel будет 1,2,3,4, без пятёрки, то-есть сместятся.
а массив компонентов будет 1,2,3,5 без четверки.
...
Рейтинг: 0 / 0
13.12.2021, 18:47
    #40119714
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
Tech N9ne,

1) А почему не использовать динамические массивы? Тогда при удалении не будет пропусков в массивах.
2) В качестве бреда - если сначала получать значения прогрессбаров и заполнять в какой-то массив (индекс-значение), а потом, отсортировав по значениям, расположить панели так, как индексы расположились в этом массиве. Просто может ли значение прогрессбара измениться после того, как данная панель будет отсортированна.
...
Рейтинг: 0 / 0
13.12.2021, 18:51
    #40119717
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
goldmi45
1) А почему не использовать динамические массивы? Тогда при удалении не будет пропусков в массивах.
А куда они денутся?

P.S. Если использовать TList<>, то у него есть метод Sort, которому можно подсунуть произвольный Comparer
...
Рейтинг: 0 / 0
13.12.2021, 23:25
    #40119778
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
Тут изначально всё через жопу написано. Это ещё додуматься надо использовать визуальные компоненты в процессе "алгоритма" сортировки. ТС - научись разделять алгоритмическую и визуальную части. Сначала, всё вычисляешь - потом отображаешь.
...
Рейтинг: 0 / 0
14.12.2021, 07:45
    #40119813
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
_Vasilisk_
goldmi45
1) А почему не использовать динамические массивы? Тогда при удалении не будет пропусков в массивах.
А куда они денутся?

P.S. Если использовать TList<>, то у него есть метод Sort, которому можно подсунуть произвольный Comparer

Не прав был. Можно использовать TObjectList.
...
Рейтинг: 0 / 0
14.12.2021, 09:33
    #40119830
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
_Vasilisk_
goldmi45
1) А почему не использовать динамические массивы? Тогда при удалении не будет пропусков в массивах.
А куда они денутся?

P.S. Если использовать TList<>, то у него есть метод Sort, которому можно подсунуть произвольный Comparer


Хороший вариант!

Есть также вариант обойтись без Comparer: добавить элементы в список TStringList (с помощью TStringList.AddObject) и отсортировать с помощью метода TStringList.Sort. В этом случае сортировка выполняется в алфавитном порядке (но нужно формировать строки таким образом, чтобы их потом можно было отсортировать, например, вместо 1 указывать 001, чтобы было фиксированное кол-во символов).
...
Рейтинг: 0 / 0
14.12.2021, 10:49
    #40119858
Tech N9ne
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
  P: array [1 .. 100] of TsPanel;
  G: array [1 .. 100] of TsArcGauge;
  Arr: array [1 .. 100] of Integer; // временный массив в котором сортирую пузырьком
...
...
var
  i, j, tempValue, temp, Size: Integer;

begin
for i := 1 to 100 do // добавляю в массив значения прогрессбаров
  begin
    if P[i] <> nil then
    begin
      Arr[i] := G[i].Progress;
    end;
  end;
{===========================}
  Size := FlowPanel1.ControlCount; // определяю количество панелей на flowpanel. 
  for i := 1 to Size - 1 do// сортирую пузырём. 
  begin
    for j := 1 to Size - i do
    begin
      if Arr[j] > Arr[j + 1] then
      begin
        temp := Arr[j];
        Arr[j] := Arr[j + 1];
        Arr[j + 1] := temp;
      end;
    end;
  end;
{===========================}
  for i := 1 to Size do
  begin
    sMemo1.Lines.add(IntToStr(Arr[i])); // убеждаюсь в том, что массив отсортирован правильно
  end;
{===========================}
  for i := 1 to Size do 
  begin
    if P[i] <> nil then 
    begin
      for j := 1 to 100 do
      begin
        if P[j] <> nil then
        begin
          if G[j].Progress = Arr[i] then // если прогресс существующего прогрессбара совпадает со значением массива
          begin
            FlowPanel1.SetControlIndex(P[j], i); // присваиваю панели индекс i
          end;
        end;
      end;
    end;
  end;
end;



сортировка в самом массиве происходит правильно, я вывожу массив в мемо, что бы убедится что сортировка правильная.
но вот расположение панелей не совсем правильное, точнее та панель с прогрессбаром который имеет самое большое значение, встает предпоследним а не последним.
Если нажимать кнопку сортировки несколько раз подряд, то панель с этим прогрессбаром, каждую сортировку перепрыгивает через 1, и доберается до номера 1, то бишь всплывает как пузырь.

если кто не понял:
1,2,3,5,4 - первая сортировка, пятёрка не на своем месте
1,2,5,3,4 - вторая сортировка
1,5,2,3,4 - третья и тд, пока 5 не встанет на место 1.

раз сортировка пузырем самого массива проходит правильно, то проблема в этом куске кода:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  for i := 1 to Size do 
  begin
    if P[i] <> nil then 
    begin
      for j := 1 to 100 do
      begin
        if P[j] <> nil then
        begin
          if G[j].Progress = Arr[i] then // если прогресс существующего прогрессбара совпадает со значением массива
          begin
            FlowPanel1.SetControlIndex(P[j], i); // присваиваю панели индекс i
          end;
        end;
      end;
    end;
  end;


Но опять же, не могу понять что не так сделал.
...
Рейтинг: 0 / 0
14.12.2021, 12:40
    #40119901
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
Tech N9ne,

несколько ошибок:
1)
Код: pascal
1.
Size := FlowPanel1.ControlCount;


может не быть равным количеству значащих элементов в массиве P (к примеру, удалили панель)
2) выведете значения прогрессов до перемещения, но после сортировки. Возможно, значение прогрессов в массиве Arr отличаются от фактических. Поэтому нужно знать не просто значение прогресса, но и индекс в массиве для этого прогресса.
3)
Код: pascal
1.
if G[j].Progress = Arr[i] then // если прогресс существующего прогрессбара совпадает со значением массива


А если не совпадает, что тогда?
...
Рейтинг: 0 / 0
14.12.2021, 13:10
    #40119913
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
Здесь плохо всё, от использования неинициализированных локальных переменных, до сортировки пузырьком. Последний раз я её использовал будучи студентом, когда сам её "изобрёл" в рамках лабораторной рвботы.
Возьми TList<TsPanel>, отсортируй через делегат, пробегись по полученному и выставь последовательно индексы.
...
Рейтинг: 0 / 0
14.12.2021, 13:17
    #40119918
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
Tech N9ne,

а зачем Вы два массива создаете?
...
Рейтинг: 0 / 0
16.12.2021, 04:58
    #40120463
Tech N9ne
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка компонентов в Flowpanel
решил тем что после удаления панели, сдвигаю массив влево
потом сортирую пузырём.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / сортировка компонентов в Flowpanel / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]