Копирование объектов TStringList

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
alien308
новенький
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

Копирование объектов TStringList

Сообщение alien308 »

С ужосом узнал что нет копирования объектов. Всё ручками? Где гуманизм :twisted:
Или всё таки ныне можно скопировать?
Как правильно копировать отсортированный TStringList? Сначала построчно в не отсортированную копию, а потом поставить Sorted в True или сразу фигачить в отсортированную копию? При установке Sorted в True сортировка происходит автоматически или надо ручками вызывать?
Последний раз редактировалось alien308 07.11.2017 21:17:35, всего редактировалось 1 раз.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

С ужосом узнал что нет копирования объектов
а это как? контекстное меню и пунктик. Дык и он, вроде, ручками надо :)))
всё таки ныне можно скопировать?
а ранее значит не было?

Наследование - слышал... много чего ещё слышал. А вот что вы имеете в виду под копированием? Этого не понял.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Может это
Component1.Assign(Component2) ???
alien308
новенький
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

Сообщение alien308 »

В си крест на крест, не к ночи помянуто, есть присваювающий конструктор. Он выполняется при присваивании и копирует содержимое одного объекта в другой. А тут при присваивании просто копируется указатель/ссылка (как правильно?), получается один объект с двумя именами. Изменяя объект с одним именем мы тут же меняем объект с другим именем. Ведь он один и тот же. А имени два. Псевдоним называется.

Добавлено спустя 5 минут 13 секунд:
Assign -- не нашёл такого метода в TStringList
Завтра очнусь в коде попробую.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

alien308 простой пример:

кидаем 3 ListBox и "чудим"

Код: Выделить всё

procedure TForm1.FormCreate(Sender: TObject);
var
  i : integer;
begin
  With ListBox1.Items do
  begin
    BeginUpdate;
    for i := 0 to 1000 do
      Add('Items - ' +inttostr(i));
    EndUpdate;
  end;
  ListBox2.Items.Assign(ListBox1.Items);
  ListBox3.Items := ListBox1.Items;
end; 

Есть нюансы. Но это не важно ведь? :)
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

alien308 писал(а):Assign -- не нашёл такого метода в TStringList

Плохо искали. Нажимаете после Вашего имени объекта класса точку "." => "a", "s"... и редактор кода Lazarus Вам подскажет
alien308
новенький
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

Сообщение alien308 »

Спасибо ответившим, BeginUpdate, EndUpdate, что делают? Всегда Add ,без них делал.
wadman
постоялец
Сообщения: 122
Зарегистрирован: 18.10.2016 14:54:28
Контактная информация:

Сообщение wadman »

alien308 писал(а):BeginUpdate, EndUpdate, что делают?

Если жамкнуть по нему мышкой с ctrl, то можно посмотреть, что они делают:

Код: Выделить всё

Procedure TStrings.BeginUpdate;

begin
   if FUpdateCount = 0 then SetUpdateState(true);
   inc(FUpdateCount);
end;



Procedure TStrings.EndUpdate;

begin
  If FUpdateCount>0 then
     Dec(FUpdateCount);
  if FUpdateCount=0 then
    SetUpdateState(False);
end;


А затем путем нехитрых поисков по коду можно увидеть, что при каждом изменении списка вызывается это:

Код: Выделить всё

procedure TStringList.Changed;

begin
  If (FUpdateCount=0) Then
   begin
   If Assigned(FOnChange) then
     FOnchange(Self);
   FPONotifyObservers(Self,ooChange,Nil);
   end;
end;

Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Вообще, эти два метода нужны чтобы набрать изменения, а потом их все разом применить. Таким образом уменьшается мерцание окна... ну и тормоза, заодно. Собственно, из названий это вполне понятно.
alien308
новенький
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

Сообщение alien308 »

Для тех кто в танке непонятно. Спасибо.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

alien308, да не за что. Точно так же поступают при любом достаточно сильном манипулировании с контекстом.
mig-31
постоялец
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Сообщение mig-31 »

Копировать можно через Assign

Код: Выделить всё

StringList2.Assign(StringList1);


При копировании должны скопироваться все свойства.
Ответить