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

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

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

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

Сообщение alien308 » 07.11.2017 22:09:51

С ужосом узнал что нет копирования объектов. Всё ручками? Где гуманизм :twisted:
Или всё таки ныне можно скопировать?
Как правильно копировать отсортированный TStringList? Сначала построчно в не отсортированную копию, а потом поставить Sorted в True или сразу фигачить в отсортированную копию? При установке Sorted в True сортировка происходит автоматически или надо ручками вызывать?
Последний раз редактировалось alien308 07.11.2017 22:17:35, всего редактировалось 1 раз.
alien308
новенький
 
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

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

Сообщение pupsik » 07.11.2017 22:17:01

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

Наследование - слышал... много чего ещё слышал. А вот что вы имеете в виду под копированием? Этого не понял.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение Ichthyander » 07.11.2017 22:20:10

Может это
Component1.Assign(Component2) ???
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение alien308 » 07.11.2017 22:26:36

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

Добавлено спустя 5 минут 13 секунд:
Assign -- не нашёл такого метода в TStringList
Завтра очнусь в коде попробую.
alien308
новенький
 
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

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

Сообщение pupsik » 07.11.2017 22:46:37

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; 

Есть нюансы. Но это не важно ведь? :)
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение Ichthyander » 08.11.2017 10:57:33

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

Плохо искали. Нажимаете после Вашего имени объекта класса точку "." => "a", "s"... и редактор кода Lazarus Вам подскажет
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение alien308 » 08.11.2017 11:12:49

Спасибо ответившим, BeginUpdate, EndUpdate, что делают? Всегда Add ,без них делал.
alien308
новенький
 
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

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

Сообщение wadman » 08.11.2017 11:39:55

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;

wadman
постоялец
 
Сообщения: 122
Зарегистрирован: 18.10.2016 15:54:28

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

Сообщение Лекс Айрин » 08.11.2017 11:44:39

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

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

Сообщение alien308 » 08.11.2017 11:58:28

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

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

Сообщение Лекс Айрин » 08.11.2017 12:17:08

alien308, да не за что. Точно так же поступают при любом достаточно сильном манипулировании с контекстом.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение mig-31 » 08.11.2017 16:54:21

Копировать можно через Assign
Код: Выделить всё
StringList2.Assign(StringList1);


При копировании должны скопироваться все свойства.
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

Рейтинг@Mail.ru