Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TObjectList


Страницы:   1 2

Елвис ©   (2008-04-09 14:51:00) 

скопировать все Items из одного TObjectList в другой, но не указатели

var
 OL1, OL2: TObjectList;

begin
 OL2.Clear;
 for i := 0 to OL1.Count do
   OL2.Add(OL1.Items[i]);

в этом случае добавляются указатели на Items первого списка. Надо что-то такое:

var
 OL1, OL2: TObjectList;
 a: TItemType;
begin
 OL2.Clear;
 for i := 0 to OL1.Count do
 begin  
   a := TItemType.Create;
   a.Caption := TItemType(OL1.Items[i].Caption);
   ... здесь переприсвоить свойства a.свойство := OL1.Items[i].свойсво
   OL2.Add(a);
 end;

но тогда получается некрасивый вариант. должна быть лучшая реализация


Елвис   (2008-04-09 16:25:00) [1]

Всем спасибо, разобрался. Без "временных переменных" и клонирования


clickmaker   (2008-04-09 16:04:00) [2]


> [22] Елвис   (09.04.08 15:54)

так при сохранении из ListBoxSort, если поля для сортировки были перемешаны, просто присвоить SortIndex := i
Потом при восстановлении они уже в нужном порядке будут


Anatoly Podgoretsky   (2008-04-09 15:59:00) [3]


> скопировать все Items из одного TObjectList в другой, но
> не указатели

А что же, если он ничего кроме указателей не хранит.
Ну насчет Assign уже подсказали, еще посмотри AssignTo


Елвис   (2008-04-09 15:54:00) [4]

можна задать свойтво SortIndex, если -1 нет сортировки, но так думаю реализация интерфейса будет еще трудней и интуитивно непонятней


Елвис   (2008-04-09 15:52:00) [5]


> в принципе, можно обойтись одним списком, если добавить
> свойство Sort: boolean

нет, потому что важен еще и порядок сортировки, т.е. сначала по етому полю, потом по этому и т.д.


Елвис   (2008-04-09 15:51:00) [6]


> clickmaker ©   (09.04.08 15:44) [17]

Согласен, это избавит от необходимости внутренней переменной, хотя даже может и больше пользы будет )


clickmaker   (2008-04-09 15:49:00) [7]


> [18] Елвис   (09.04.08 15:47)

в принципе, можно обойтись одним списком, если добавить свойство Sort: boolean


Елвис   (2008-04-09 15:47:00) [8]

Есть список объектов TMyList

1. Отобразить еге в ListBox-e
2. Поизменять, подобавлять, посовать, поудалять -- проделать все это с ListBox-ом
3. Сохранить ListBox в TMyList так, чтоб можно было возвратится и выполнить шаг 1

Появилась идея делать все ето не с ListBox. а напрямую с MyVizard.SortList и при каждом изменении обновлять состояние контролов.

Иду пробовать


clickmaker   (2008-04-09 15:44:00) [9]

погодь... зачем так сложно
есть FieldList, есть SortList

заполнение на шаге, где 2 списка можно делать так

for i := 0 to FieldList.Count-1 do begin
 if (SortList.IndexOf(FieldList[i]) > -1) then
   ListBoxSort.Items.AddObject(..., FieldList[i])
else
   ListBoxFields.Items.AddObject(..., FieldList[i]);
end;


Елвис   (2008-04-09 15:35:00) [10]

Попробую объяснить идею всего мастера. При переходе на следующий шаг исполняются 2 функции: сохранение параметров предыдущего шага и отображение параметров шага на который переходим, т.е. если переходим на второй, то сохраняем первый и отображаем параметры второго.

Сохранение первого шага
1.сохраняем то что нужно в первом

2. Очищаем временный объэкт TempList: TObjectList;
3. Присвоиваэм ему список полей TempList.Assign(MyVizard.FieldList);

Отображение параметров второго шага
1. ListBoxFields.Assign(TempList);
2. ListBoxSort.Assign(MyVizard.SortList)
здесь при нажатии на кнопки влево-вправо записи из ListBoxFields переносятся в ListBoxSort и наоборот

Сохранение второго шага
1. MyVizard.SortList.Clear
2. for i := 0 to ListBoxSort.Count - 1 do
    MyVizard.SortList.Add(ListBoxSort.Items.Objects[i]);

При первом прохождениивсе в порядке, так как MyVizard.SortList пустой и ListBoxSort содержит указатели на MyVizard.FieldList, а вот если сделать шаг назад, а потом вперед, т.е. выполнить "Отображение параметров второго шага" и "Сохранение второго шага", то получается, что ListBoxSort содержит указатели на MyVizard.SortList и MyVizard.FieldList. А в процедуре сохранения очищается список
1. MyVizard.SortList.Clear
и получается что он ничем не заполнится
2. for i := 0 to ListBoxSort.Count - 1 do
    MyVizard.SortList.Add(ListBoxSort.Items.Objects[i]);


Извиняюсь если не смого нормально объяснить


Kolan   (2008-04-09 15:21:00) [11]

> круто!

Мне самому понравилось :)

ЗЫ
 Клоны конечно не нужны, как раз тебе надо именно указатели запомнить как в [0].


Сергей М.   (2008-04-09 15:15:00) [12]


> нужно предвидеть возможность возвращения на один шаг назад


И для этого требуется создавать клоны объектов ?


DVM   (2008-04-09 15:12:00) [13]


> Идея сделать мастер (визард) для експорта.

классы для этого клонировать не нужно.


DVM   (2008-04-09 15:10:00) [14]


> нафига?
> никто не запрещает свой метод написать.

Я имел в виду, что мало ли что у него там за экземпляры классов в списке. Может у него там что стандартное из VCL, не имеющее метода Assign.

> А вот имеет:
> TMyObj = class
>  procedure Assign(AMyObj: TMyObj);
> end;

круто!


clickmaker   (2008-04-09 15:09:00) [15]


> На втором нужно из этого списка пелей перенести в другой
> список поля по которых будет производится сортировка

а зачем для этого нужно клонирование?


Елвис   (2008-04-09 15:08:00) [16]


> Зачем это понадобилось?

Идея сделать мастер (визард) для експорта. На первом шаге выбираем поля для експорта - TCheckListBox-ом. На втором нужно из этого списка пелей перенести в другой список поля по которых будет производится сортировка, т.е. "Dual list box", причем играет еще роль последовательность сортировки. Сложность заключается в том что нужно предвидеть возможность возвращения на один шаг назад


> Kolan ©   (09.04.08 14:56) [3]

так я и собирался делать


Palladin   (2008-04-09 15:07:00) [17]

Лучше сделать метод  Function Clone:TMyClass, бо, клонирование и копирование свойств разные вещи...


clickmaker   (2008-04-09 15:05:00) [18]


> Т.е. создать потомков от уже существующих классов

нафига?
никто не запрещает свой метод написать.
Если наследоваться от TPersistent, так там все одно надо переписывать AssignTo


Kolan   (2008-04-09 15:05:00) [19]

> Т.е. создать потомков от уже существующих классов.

Зачем?

Вот объект не имеет метод Assign.
TMyObj = class
end;


А вот имеет:
TMyObj = class
 procedure Assign(AMyObj: TMyObj);
end;


DVM   (2008-04-09 15:03:00) [20]


> Kolan ©   (09.04.08 15:02) [5]

Т.е. создать потомков от уже существующих классов.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо