powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / сортировка компонентов в Flowpanel
13 сообщений из 13, страница 1 из 1
сортировка компонентов в Flowpanel
    #40119591
Фотография Tech N9ne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток. Пытаюсь отсортировать компоненты на 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
сортировка компонентов в Flowpanel
    #40119597
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это какой-то странный способ сортировки, но он немного похож на
https://www.google.com/search?q=паскаль сортировка пузырьком
...
Рейтинг: 0 / 0
сортировка компонентов в Flowpanel
    #40119691
Фотография Tech N9ne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
сортировка компонентов в Flowpanel
    #40119714
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9ne,

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

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

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

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

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


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

Есть также вариант обойтись без Comparer: добавить элементы в список TStringList (с помощью TStringList.AddObject) и отсортировать с помощью метода TStringList.Sort. В этом случае сортировка выполняется в алфавитном порядке (но нужно формировать строки таким образом, чтобы их потом можно было отсортировать, например, вместо 1 указывать 001, чтобы было фиксированное кол-во символов).
...
Рейтинг: 0 / 0
сортировка компонентов в Flowpanel
    #40119858
Фотография Tech N9ne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
сортировка компонентов в Flowpanel
    #40119901
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9ne,

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


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


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

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


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