Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.05.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.006 c
15-1206414440
Slider007
2008-03-25 06:07
2008.05.04
С днем рождения ! 25 марта 2008 вторник


15-1206439260
KSergey
2008-03-25 13:01
2008.05.04
Отрисовка курсора в Windows


2-1207744927
Снежинка
2008-04-09 16:42
2008.05.04
Запрос не получается


4-1188545444
Gear
2007-08-31 11:30
2008.05.04
Как перехватить появление в системе нового звукового устройства?


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский