Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2010, 15:43   #1
coolle
Пользователь
 
Регистрация: 29.06.2010
Сообщений: 38
По умолчанию Копирование строк из Memo1 в Memo2.

Здравствуйте!
Нужно копировать все строки из мемо1 в мемо2, но проверять нет ли такой же строки уже в мемо2, тоесть копировать в мемо2 только то, что там ещё нет.
Помогите пожалуста.
coolle вне форума Ответить с цитированием
Старый 15.11.2010, 15:49   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну классическим методом - циклом.
А проверять поможет метод TMemo.Lines.IndexOf(Строка), который вернет -1 если такой строки нет в Мемо.
Смекаешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.11.2010, 15:55   #3
coolle
Пользователь
 
Регистрация: 29.06.2010
Сообщений: 38
По умолчанию

Код:
var
 a,b:integer;
 con:boolean;
begin
for a:=0 to memo1.Lines.Count-1 do
begin
con:=false;
for b:=0 to memo2.lines.count-1 do
 begin
 if memo1.lines.Strings[a]=memo2.Lines.Strings[b] then con:=true;
 end;
if not con then memo2.Lines.Add(memo1.lines.Strings[a]);
end;
end;;
Вот рабочий код )))
Всем спасибо!

Последний раз редактировалось coolle; 15.11.2010 в 16:15.
coolle вне форума Ответить с цитированием
Старый 15.11.2010, 17:39   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

С отсортированным списком можно уложиться в 3 строки
Код:
StringList1.Sorted := true;
StringList1.Duplicates := dupIgnore;
StringList1.AddStrings(StringList2);
пыщь
JTG вне форума Ответить с цитированием
Старый 16.11.2010, 09:15   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
С отсортированным списком можно уложиться в 3 строки
Как ни странно, но не с отсортированным, используя алгоритм, который сразу предложил Stilet, тоже в три строчки

Код:
  for i:=0 to Memo1.Lines.Count-1 do
    if Memo2.Lines.IndexOf( Memo1.Lines[i] )< 0 then
      Memo2.Lines.Append( Memo1.Lines[i] );
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.11.2010, 18:20   #6
coolle
Пользователь
 
Регистрация: 29.06.2010
Сообщений: 38
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Как ни странно, но не с отсортированным, используя алгоритм, который сразу предложил Stilet, тоже в три строчки

Код:
  for i:=0 to Memo1.Lines.Count-1 do
    if Memo2.Lines.IndexOf( Memo1.Lines[i] )< 0 then
      Memo2.Lines.Append( Memo1.Lines[i] );
Программа при переборе 660к строк, виснет... С кодом который я выше написал почти сразу, а с тем что Вы написали перебирает какоето время и тоже виснет. Почему?
coolle вне форума Ответить с цитированием
Старый 16.11.2010, 19:23   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Потому что это дофига строк и контрол после каждого изменения перерисовывается. Можно попробовать

Код:
Memo2.Lines.BeginUpdate;

  for i:=0 to Memo1.Lines.Count-1 do
    if Memo2.Lines.IndexOf( Memo1.Lines[i] )< 0 then
      Memo2.Lines.Append( Memo1.Lines[i] );

Memo2.Lines.EndUpdate;
пыщь
JTG вне форума Ответить с цитированием
Старый 16.11.2010, 19:26   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Где-то я слышал про ограничение в 64Кб для мемо, или что-то путаю?
Arigato вне форума Ответить с цитированием
Старый 16.11.2010, 19:59   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Arigato
Цитата:
Note: Under Win 9x, there is a limit of 64k of text for this control.

У автора 98-ка?
Цитата:
Потому что это дофига строк и контрол после каждого изменения перерисовывается. Можно попробовать
А еще лучше вогнать из в отдельно созданные объекты TStringList
Код:
  for i:=0 to M1.Count-1 do
    if M2.IndexOf( M1[i] )< 0 then
      M2.Append( M1[i] );
Где m1,m2 - корректно созданные TStringList и
Код:
m1.Text:=Memo1.Lines.Text;
m2.Text:=Memo2.Lines.Text;
Ну и соответственно назад перегонять после цикла.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.11.2010, 20:58   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А еще лучше вогнать из в отдельно созданные объекты TStringList
угу.
достоточно одного. Memo1 не изменяется, можно его и оставить.
а вот обработку вести не в Memo2, а в созданном TStringList
примерно так:
Код:
var TS : TStringList;
...
begin

    TS := TStringList.Create;
    TS.Text := Memo2.Lines.Text;

  for i:=0 to Memo1.Lines.Count-1 do
    if TS.IndexOf( Memo1.Lines[i] )< 0 then
         TS.Append( Memo1.Lines[i] );

  Memo2.Lines.Text  := TS;

  FreeAndNil(TS);
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод данных в двоичной системе(Bin) находящиеся в memo1 в шестнадцатиричную(Hex) в поле memo2 alenkov Общие вопросы Delphi 1 31.10.2010 00:32
копирование строк kakawkin Microsoft Office Access 2 24.06.2010 01:22
Передача данных из Memo1 в Memo2 DeKot Общие вопросы Delphi 8 26.11.2008 15:55
отправить содержимое Memo1 на Memo2, по нажатии enter Патрон Общие вопросы Delphi 2 08.03.2008 07:18
Копирование строк Mikola Общие вопросы Delphi 8 21.09.2007 17:21