Форум: "Начинающим";
Текущий архив: 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