Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.04;
Скачать: CL | DM;

Вниз

TObjectList   Найти похожие ветки 

 
Елвис   (2008-04-09 14:51) [0]

скопировать все 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 14:54) [1]

Т.е. вопрос сводится к "как клонировать объект" ?


 
DVM ©   (2008-04-09 14:54) [2]


> должна быть лучшая реализация

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


 
Kolan ©   (2008-04-09 14:56) [3]

> должна быть лучшая реализация

Надо в классе экземпляры которого ты храниш в TObjectList сделать метод Assign. В этот Assign и надо поместить «переприсвоить свойства a.свойство := OL1.Items[i].свойсво».

Тогда цикл будет такой.
for i := 0 to OL1.Count do
begin  
  a := TItemType.Create;
  a.Assign(OL1.Items[i])
  OL2.Add(a);
end;


ЗЫ
И еще попроси кого-нибудь оторвать тебе руки за названия переменных.


 
DVM ©   (2008-04-09 15:00) [4]


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

а если объект не имеет метода Assign?


 
Kolan ©   (2008-04-09 15:02) [5]

> а если объект не имеет метода Assign?

Читай [3]
Надо в классе экземпляры которого ты храниш в TObjectList сделать метод Assign.


 
DVM ©   (2008-04-09 15:03) [6]


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

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


 
Kolan ©   (2008-04-09 15:05) [7]

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

Зачем?

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


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


 
clickmaker ©   (2008-04-09 15:05) [8]


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

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


 
Palladin ©   (2008-04-09 15:07) [9]

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


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


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

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


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

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


 
clickmaker ©   (2008-04-09 15:09) [11]


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

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


 
DVM ©   (2008-04-09 15:10) [12]


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

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

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

круто!


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


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

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


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


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


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


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

> круто!

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

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


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

Попробую объяснить идею всего мастера. При переходе на следующий шаг исполняются 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]);


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


 
clickmaker ©   (2008-04-09 15:44) [17]

погодь... зачем так сложно
есть 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:47) [18]

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

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

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

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


 
clickmaker ©   (2008-04-09 15:49) [19]


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

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


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


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

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


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


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

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


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

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


 
Anatoly Podgoretsky ©   (2008-04-09 15:59) [23]


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

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


 
clickmaker ©   (2008-04-09 16:04) [24]


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2008.05.04;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.017 c
2-1207761012
Dark
2008-04-09 21:10
2008.05.04
PageControl


2-1207675052
gefest80
2008-04-08 21:17
2008.05.04
звук


2-1207744045
Снежинка
2008-04-09 16:27
2008.05.04
Пароль


2-1207637311
bagos
2008-04-08 10:48
2008.05.04
findcomponent в потоке


2-1207560786
Ri2008
2008-04-07 13:33
2008.05.04
Странная ошибка