Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

puporev
Статус: Профессор
Рейтинг: 25
∙ повысить рейтинг »
Лысков Игорь Витальевич
Статус: Мастер-Эксперт
Рейтинг: 0
∙ повысить рейтинг »
Асмик Гаряка
Статус: Советник
Рейтинг: 0
∙ повысить рейтинг »

Pascal / Delphi / Lazarus

Номер выпуска:1889
Дата выхода:27.07.2021, 00:15
Администратор рассылки:Зенченко Константин Николаевич (Старший модератор)
Подписчиков / экспертов:7 / 38
Вопросов / ответов:3 / 11

Консультация # 31727: Здравствуйте! Подскажите, пожалуйста, как решить проблему: есть текстовый файл и Memo. Как в Memo из этого файла загрузить строки, но не все (LoadFromFile не подходит, т.к. тогда слишком много файлов - это вообще-то должны загружаться описания для книг), а, например, с 3 по 5ую, для другого итема - с 5 по 7. Как это реализовать?...
Консультация # 22994: Здравствуйте уважаемые эксперты. Допустим есть фраза "Мама мыла раму папой" Как в Edit1 - добавить Мама Как в Edit2 - добавить мыла Как в Edit3 - добавить раму папой в рассылке уже отвечали на подобный вопрос var s : string; i : integer; begin s:=\\'Borland Delphi\\'; i:=Pos(\\' \\',s...
Консультация # 122314: Доброго времени суток, уважаемые эксперты ! У меня к Вам вопрос связанный с утечкой памяти при использовании функции ShellExecute. Мной написана программка которой часто приходится вызывать внешние приложения при помощи этой функции. Всё вроде бы работает, но ... после каждого использования ShellExecute размер моей программы в памя...

Консультация # 31727:

Здравствуйте! Подскажите, пожалуйста, как решить проблему: есть текстовый файл и Memo. Как в Memo из этого файла загрузить строки, но не все (LoadFromFile не подходит, т.к. тогда слишком много файлов - это вообще-то должны загружаться описания для книг), а, например, с 3 по 5ую, для другого итема - с 5 по 7. Как это реализовать?

Дата отправки: 18.12.2005, 02:41
Вопрос задал: Ваньков Петр Семенович
Всего ответов: 5
Страница онлайн-консультации »


Консультирует nimoid:

Здравствуйте, Ваньков Петр Семенович!

При чем тут итемы, файлы? брр... Прально вопрос задавай. :)

Можно так:

Загружай файл в TStringList и бери от туда нужные строки вставляй в мемо.

//--------------------------------------------------
var
SList: TStringList;
begin
SList := TStringList.Create;
try
SList.LoadFromFile(\'путь к файлу\');
Memo1.Lines.Add(SList.Strings[3]); // грузишь 3-ю строку в мемо
Memo1.Lines.Add(SList.Strings[4]); // грузишь 4-ю строку в мемо
finally
SList.Free;
end;
end;
//--------------------------------------------------

Можно конечн и по-другому... какие у тя файлы размером?

Консультировал: nimoid
Дата отправки: 18.12.2005, 03:25
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Вадим Исаев ака sir Henry (Мастер-Эксперт):

Здравствуйте, Ваньков Петр Семенович!
Это делается загрузкой именно строк, а не файлов:
var
f: TextFile;
s: string;
Begin
AssignFile(f, \'Имя_файла.txt\');
Reset(f);
While not Eof(f) Do
Begin
ReadLn(f, s);
{После прочтения строки, Вы ее сравниваете с шаблоном, если эта та строка, загружаете строку в мемо}
If Условие Then
Memo1.Lines.Add(s);
End;
End;
Больше никак.

Консультировал: Вадим Исаев ака sir Henry (Мастер-Эксперт)
Дата отправки: 18.12.2005, 07:33
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует REFERI:

Здравствуйте, Ваньков Петр Семенович!
Просто можно пропустить ненужные строки - т.е. выполнять над ними те же операции что и со строками которые надо вывечти, но не выводя их. Например первые 3 строки просто прочитать а 3-5 не только читать но и выводить...
Или использовать функцию Setpos - установить позицию в файле и потом читать.
Посмотрите в справке - наберите file, string или pos - найдете что вам нужно и на примере посмотрите...
Удачи!

Консультировал: REFERI
Дата отправки: 18.12.2005, 10:47
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Schmak:

Здравствуйте, Ваньков Петр Семенович!
Загружайте данные из файла не с помощью Memo1.LoadFromFile, а с помощью readln. Например, если Вам надо считать с 5 по 7 строку то сначала 4 раза читаете данные из файла, затем 3 раза читаете и выводите в Memo1 при помощи метода items.add() и закрываете файл в конце.

Консультировал: Schmak
Дата отправки: 19.12.2005, 13:00
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Ataman N. N.:

Здравствуйте, Ваньков Петр Семенович!
Открываете файл
AsignFile(f,<FileName>);
Reset(f);
while not EOF(f) do
begin
//Читаете посторочно файл
ReadLn(f,s:String);//допустим так
//Если это строка 3-5 и т.д., то
Memo.Lines.Add(s);
end;
CloseFile(f);

Консультировал: Ataman N. N.
Дата отправки: 21.12.2005, 14:45
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 22994:

Здравствуйте уважаемые эксперты.

Допустим есть фраза "Мама мыла раму папой"
Как в Edit1 - добавить Мама
Как в Edit2 - добавить мыла
Как в Edit3 - добавить раму папой

в рассылке уже отвечали на подобный вопрос

var
s : string;
i : integer;
begin
s:=\\'Borland Delphi\\';
i:=Pos(\\' \\',s);
RichEdit1.Lines.Add(Copy(s,1,i-1)); //Bordland
RichEdit2.Lines.Add(Copy(s,i+1,Length(s)-i)); //Delphi
end;

но у меня 4 слова и все мои эксперименты ни к чему не привели - помогите плиз.

Дата отправки: 04.07.2005, 06:40
Вопрос задал: source
Всего ответов: 4
Страница онлайн-консультации »


Консультирует Ерёмин Андрей:

Здравствуйте, source!
Поместите на форму 4 TEdit и TButton. Создайте обработчик нажатия кнопки. Код для него в приложении.

P.S. До чего дожили - уже людьми рамы моем... :)

Приложение:

Консультировал: Ерёмин Андрей
Дата отправки: 04.07.2005, 10:17
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Jadd:

Здравствуйте, source!
Дык в том-то и дело, что в твоем примере привязка идет к количеству слов, а не простой лексический анализ. Так вот, берем фразу и в цикле ее обрабатываем:

var
strLexema: String;
strMyString: String;
nIndex: Integer;
holder: TStringList;
begin
//допустим наша строка - тот идиотизм, который ты привел
strMyString := \'Мама мыла раму папой\';
holder := TStringList.Create;
for nIndex:=1 to Length(strMyString)-1 do
begin
//проверяем на разделители слов: пробел, запятую, точку. Остальное уж как-нибудь сам по аналогии
if (strMyStrint[nIndex] = \' \') or (strMyString[nIndex] = \',\') or (strMyString[nIndex] = \'.\') then
begin //если нашли разделитель
//убираем лишние пробелы
strLexema := Trimg(strLexema);
//сохраняем слово например в TStringList
holder.add(strLexema);
//очищаем лексему от всего и идем дальше
strLexema := \'\';
end
else
//в противном случае склеиваем лексему с текущим символом
strLexema := strLexema + strMyString[nIndex];
end;

//тут нужно проверить на последнее слово на случай, если предложение не закончено знаком пунктуации или пробелом
if (Length(strLexema) > 0) then
holder.add(strLexema);
end;
Примерно так. А затем ты можешь уже распарсеный текст поместить туда, куда хочешь. Заметь, в этом коде нету и намека на привязку к количеству слов.

Консультировал: Jadd
Дата отправки: 04.07.2005, 10:32
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует John Freeman:

Здравствуйте, source!
Не слушай сишноков - они скоро уже s1:=s2 через strcpy делать будут:
Выглядит в нормальном виде это так:
var
o,s:string;//твоя строка и временная
c:integer;
begin
s:=\'мама мыла раму\';
o:=\'\';//очищаем буффер
for c:=1 to length(s) do begin
if s[c]=\' \' then begin memo1.lines.add(o);o:=\'\'; else begin
o:=o+s[c];
end;
end;

Консультировал: John Freeman
Дата отправки: 04.07.2005, 14:55
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Вадим Исаев ака sir Henry (Мастер-Эксперт):

Здравствуйте, source!
В Дельфи есть функция Pos(), которая ищет позицию в строке того слова, которое Вы хотите. Далее, с помощью функции Copy() выдираете нужную Вам подстроку:
const
st = \'Мама мыла раму папой\';
m = \'Мама\';
l = \'мыла\';
r = \'раму папой\';
{Искомые слова не обязательно задавать в константах, можно и интерактивно, в том же Edit\'е}
var
i: integer;
Begin
{Сначала ищем позицию подстроки в заданной строке st}
i:=0;
i:=Pos(m, st);
If i>0 Then
Edit1.Text:=Copy(st, i, Length(m));
{т.е. дословно, выдрать из строки st, начиная с позиции i, количество символов определяемые длиной подстроки m}
i:=Pos(l, st);
If i>0 Then
Edit2.Text:=Copy(st, i, Length(l));
i:=Pos(r, st);
If i>0 Then
Edit3.Text:=Copy(st, i, Length(r));
End;

Консультировал: Вадим Исаев ака sir Henry (Мастер-Эксперт)
Дата отправки: 05.07.2005, 04:51
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 122314:

Доброго времени суток, уважаемые эксперты !
У меня к Вам вопрос связанный с утечкой памяти при использовании функции ShellExecute.
Мной написана программка которой часто приходится вызывать внешние приложения
при помощи этой функции. Всё вроде бы работает, но ... после каждого использования
ShellExecute размер моей программы в памяти непомерно растёт. При запуске обьём
занимаемой памяти составляет около 3 мегабайт - после запуска нескольких екзешников
бывает переваливает за 10.
Пробовал экспериментировать с параметрами передаваемыми в функцию, но существенной
экономии памяти не получил. Может кто из экспертов подскажет как с этим бороться ?
В качестве примера предлагаю следующий кусок кода (правда в своей программе OpenDialog
я не использую - путь к файлу указывается строкой) , запустите несколько исполняемых файлов
и посмотрите на размеры вашей программы в диспетчере задач.
Среда разработки Delphi 2007.
Заранее благодарен всем кто откликнется !

Дата отправки: 09.02.2008, 03:22
Вопрос задал: CEBEP
Всего ответов: 2
Страница онлайн-консультации »


Консультирует Selya:

Здравствуйте, CEBEP!
У вас нет утечки памяти. Утечка памяти - это когда при закрытии приложения используемые им ресурсы не оспобождаются. А то, что размер ваше программы в памяти растёт - это нормально.
Вообще в Delphi 2007 есть прекрасный инструмент определения утечек памяти:
Где нибудь в коде OnCreate главной формы а лучше в .dpr файле после Application.Run; пропишите такую команду

ReportMemoryLeaksOnShutdown := DebugHook <> 0;
{только Delphi2006, 2007}

В этом случае вам будет сигнализороваться об утечках памяти в программе:
var
L: TList;
begin
L := TList.Create;
{do something }
//L.Free; // типа забыли сделать Free

Ещё есть один сторонний инструмет сигнализирования утечек памяти: FastMM
http://fastmm.sourceforge.net
Если его настроить, но он может показать не только что происходит утечка памяти, но и показать где эта утечка произошла, вплоть до номера строки.

Консультировал: Selya
Дата отправки: 09.02.2008, 11:17
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует DimonSoft:

Здравствуйте, CEBEP!

Первое, что вспомнилось, когда прочитал Ваш вопрос - это тема на одном из форумов программистов. Правда, там обсуждалась утечка памяти при использовании TOpenDialog, но среди ответов были некоторые общие идеи. Я просто процитирую их...

> [1] Virgo_Style © (22.10.07 23:00)
> а ты столбик Виртуальная память смотри. Это чтоб успокоиться. А чтобы
> наоборот, возбудиться, - сверни свое приложение и разверни опять, контролируя
> те же цифры, что и в [0] %-)
На пример с динамическим созданием этого компонента следующий ответ:

> [3] Petr V.Abramov (22.10.07 23:59)
> > OpenDialog1.Free;
> менеджер памяти Borland сделает все честно, но винде память не отдаст.

.. и вот такое сравнение:

> [5] Virgo_Style © (23.10.07 08:56)
> Магазин около твоего дома получил со склада ящик пива и продает его
> потихоньку. А если б он с завода банку заказывал только тогда, когда ты
> придешь и закажешь ее - ты б от жажды умер)
>
> Так и тут. Менеджер памяти взял память и распределяет-перераспределяет
> ее "внутри" приложения, бо если за каждым байтом ходить на поклон к ОС -
> накладно выйдет.

Все вышеперечисленные высказывания остаются в силе и для использования любых других компонентов//функций и т.п., т.е. и в Вашем случае. Отсюда первый совет: попробуйте запустить Вашу программу и выполнить из неё несколько вызовов ShellExecute, наблюдая за расходом памяти. Если в какой-то момент рост объёма потребляемой памяти останавливается - значит, всё в порядке, всё объясняется особенностями работы менеджера памяти. Если рост потребления продолжается - проблема есть в Вашей программе, причём необязательно в этом конкретном участке.

И ещё одно. Следует помнить, что для обработки файлов, которые Вы передаёте через ShellExecute на открытие, используются другие приложения, в которых тоже могут происходить утечки памяти, поскольку идеального способа отлавливать такие проблемы ещё никто не нашёл, поэтому и здесь может произойти утечка, хотя, скорее всего, это будет отображаться уже в отношении запущенного Вашей программой приложения. Но вполне возможно, что и на показателях Вашей программы это как-нибудь отразится.

С уважением, DimonSoft.

Консультировал: DimonSoft
Дата отправки: 09.02.2008, 11:55
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное