Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 2 039

/ вопрос открыт /

Здравствуйте! Подскажите как сделать следующее:
Поиск построчно в memo, если первое слово соответствует нужному значению, то копируется вся строка, единственый момент: даже не первое слово а символы(допустим первые 4, а дальше может идти что угодно)

SLAVIKI Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: SLAVIKI (статус: Посетитель)
Вопрос отправлен: 3 ноября 2008, 02:00
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, SLAVIKI!
Если только надо брать для проверки N-е количество символов с первой позиции, например 4, то в примере от Vetalion надо изменить условие:

if copy(Form1.Memo1.Lines[i], 1, 4) = Substr then begin
// совпала, значит копируем
end;

P.S. Желаю удачи.

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 3 ноября 2008, 16:18


Мини-форум вопроса

Всего сообщений: 30; последнее сообщение — 5 ноября 2008, 01:42; участников в обсуждении: 5.

Страницы: [1] [2] [Следующая »]

Vetalion

Vetalion (статус: Посетитель), 3 ноября 2008, 08:55 [#1]:

var
i: Integer;
begin
for i := 0 to Form1.Memo1.Lines.Count - 1 do
if Pos(Substr, Form1.Memo1.Lines[i]) <> 0 then ;
// Копируем строку
end;
SLAVIKI

SLAVIKI (статус: Посетитель), 3 ноября 2008, 15:54 [#2]:

тоже самое дело через POS, не получалось...сейчас получилось:) Спасибо огромное!
SLAVIKI

SLAVIKI (статус: Посетитель), 3 ноября 2008, 17:02 [#3]:

Спасибо всем за оперативную помощь! Еще один маленький момент:
глюки с stringgrid, gr:= stringgrid1.Rowcount+1;

stringgrid1.cells[0,gr]:=memo2.lines.text;
чтобы не использовать for i:=0 и тд, иначе перегруз функций идет, если отдельно процедурой делать (т.к. лист обрабоки большой, программа перескакивает через некоторые значения, либо вылетает местами).
Собственно вопрос: как после поиска добавить в новую ячейку в stringgrid данные из memo?(stringgrid, gr:= stringgrid1.Rowcount+1;

stringgrid1.cells[0,gr]:=memo2.lines.text;) не всегда коректно работает, есть пробелы и тд.
Вадим К

Вадим К (статус: Академик), 3 ноября 2008, 17:21 [#4]:

А как вообще такая конструкция работает?
в качестве второго индекса может быть число в диапазоне [0..stringgrid1.Rowcount-1]

А большие процедуры надо разбивать на маленькие. Нормальная процедура должна влазить на экран (норма - 30 строк) и иметь не больше 3 вложенных друг в друга циклов (даже лучше не больше 2).
Если так писать, то многие ошибки просто не возникают.
Галочка "подтверждения прочтения" - вселенское зло.
SLAVIKI

SLAVIKI (статус: Посетитель), 3 ноября 2008, 17:39 [#5]:

begin


for l:=0 to Listbox1.Count - 1 do
begin memo1.Clear;
s:=listbox1.items[l];



sHTMLFile := s;
Strl := TStringList.Create; StringGrid1.RowCount:=StringGrid1.RowCount+1;
gr:=StringGrid1.RowCount;
try
Strl.LoadFromFile(sHTMLFile); memo1.clear;
Idoc := CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
try
IDoc.designMode := 'on';
while IDoc.readyState <> 'complete' do
Application.ProcessMessages;
v := VarArrayCreate([0, 0], VarVariant);
v[0] := Strl.Text;
IDoc.Write(PSafeArray(System.TVarData(v).VArray));
IDoc.designMode := 'off';
while IDoc.readyState <> 'complete' do
Application.ProcessMessages;
Memo1.Lines.Text := IDoc.body.innerText; memo2.Clear;
begin

for i := 0 to Form1.Memo1.Lines.Count - 1 do begin


if Pos('test1', Form1.Memo1.Lines[i]) <> 0 then
Memo2.Lines.Add(Memo1.Lines.Strings[i]);
if Pos('test2', Form1.Memo1.Lines[i]) <> 0 then begin
Memo2.Lines.Add(Memo1.Lines.Strings[i]);
Memo2.Lines.Add(Memo1.Lines.Strings[i+1]);
Memo2.Lines.Add(Memo1.Lines.Strings[i+2]);

gr:= stringgrid1.Rowcount+1;

stringgrid1.cells[0,gr]:=memo2.lines.text;
listbox1.items.Delete(l); вот это все у меня не очень стабильно работает:)
Вадим К

Вадим К (статус: Академик), 3 ноября 2008, 17:49 [#6]:

А мы телепаты и по куску кода умеем ставить диагноз?
я могу только один поставить - автору сего опуса срочно идти в школу и доучиваться писать.
Во первых - кусок кода, неполный кусок. во вторых, непонятно, что это и к чему.
Галочка "подтверждения прочтения" - вселенское зло.
SLAVIKI

SLAVIKI (статус: Посетитель), 3 ноября 2008, 18:00 [#7]:

есть куча файлов, путь к файлам в listbox, программа сначала переводит файлик(убирая теги и тд, если они есть) затем отображает обработанный текст в memo1 потом из memo1 дергается пару строк и сохраняется в stringgrid в конце всего все сохранятся в excel
Вадим К

Вадим К (статус: Академик), 3 ноября 2008, 18:05 [#8]:

длинный процесс. настоятельно рекомендую подумать и разделить на несколько частей, и избавиться от визуальных компонентов в промежуточных иттерациях.
Галочка "подтверждения прочтения" - вселенское зло.
SLAVIKI

SLAVIKI (статус: Посетитель), 3 ноября 2008, 18:06 [#9]:

procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Clear;memo2.Clear;
listbox1.Items.LoadFromFile('c:\1.txt');
stringgrid1.rowcount:=0;
end;

procedure TForm1.Button3Click(Sender: TObject);
var xl:variant;
IDoc: IHTMLDocument2;
Strl: TStringList;
sHTMLFile,s: string;
v: Variant;
Links: IHTMLElementCollection;
i,m,g,mem,l: Integer;
Link: IHTMLAnchorElement;

j : integer;
buf: string;
se: string;
ses: string;
begin


for l:=0 to Listbox1.Count - 1 do
begin memo1.Clear;
s:=listbox1.items[l];



sHTMLFile := s;
Strl := TStringList.Create; StringGrid1.RowCount:=StringGrid1.RowCount+1;

try
Strl.LoadFromFile(sHTMLFile); memo1.clear;
Idoc := CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
try
IDoc.designMode := 'on';
while IDoc.readyState <> 'complete' do
Application.ProcessMessages;
v := VarArrayCreate([0, 0], VarVariant);
v[0] := Strl.Text;
IDoc.Write(PSafeArray(System.TVarData(v).VArray));
IDoc.designMode := 'off';
while IDoc.readyState <> 'complete' do
Application.ProcessMessages;
Memo1.Lines.Text := IDoc.body.innerText; memo2.Clear;
begin

for i := 0 to Form1.Memo1.Lines.Count - 1 do begin


if Pos('test', Form1.Memo1.Lines[i]) <> 0 then
Memo2.Lines.Add(Memo1.Lines.Strings[i]);
if Pos('test2', Form1.Memo1.Lines[i]) <> 0 then begin
Memo2.Lines.Add(Memo1.Lines.Strings[i]);
Memo2.Lines.Add(Memo1.Lines.Strings[i+1]);
Memo2.Lines.Add(Memo1.Lines.Strings[i+2]);

gr:= stringgrid1.Rowcount+1;

stringgrid1.cells[0,gr]:=memo2.lines.text;
listbox1.items.Delete(l);








end; end; end;

finally IDoc := nil;

end;
finally Strl.Free;
end; end; SaveAsExcelFile(stringGrid1, 'c:\1.xls')
end;


вот полный код
SLAVIKI

SLAVIKI (статус: Посетитель), 3 ноября 2008, 18:08 [#10]:

как мне грамотно разделить? по процедурам делил, не стабильно все, т.е через раз работает, если фалов около 1000 в листе....процентов 40 не совсем правильно обрабатывается
Вадим К

Вадим К (статус: Академик), 3 ноября 2008, 18:08 [#11]:

о, ужас. Такой код, ещё и в FormCreate. Обращение к некоторым компонентам в таком случае может быть непредсказуемым. Некоторые компоненты могут быть не готовы к работе
А код - тихий ужас. Полностью нечитабельный.
Галочка "подтверждения прочтения" - вселенское зло.
SLAVIKI

SLAVIKI (статус: Посетитель), 3 ноября 2008, 18:12 [#12]:

в form.create это просто показать...что когда все загружено че надо делать....а так у меня через другие вызовы все грузится....сам понимаю что ужас....взываю о помощи..как это все разбить грамотно?
Вадим К

Вадим К (статус: Академик), 3 ноября 2008, 18:14 [#13]:

логически. каждая процедура должна делать своё маленькое дело.
Галочка "подтверждения прочтения" - вселенское зло.
SLAVIKI

SLAVIKI (статус: Посетитель), 3 ноября 2008, 18:16 [#14]:

так и делал, НО..видимо не правильно...в итоге опять все вместе слил в одну кнопку:).....может кто-нибудь тот большой код на процедурки разбить? у меня как-то не получается работоспособно все это сделать, огрехи про которые я писал и перескоки случаются.
Вадим К

Вадим К (статус: Академик), 3 ноября 2008, 18:18 [#15]:

Я сейчас точно не буду писать. Смысла нет. Надо самостоятельно тренироваться.
Галочка "подтверждения прочтения" - вселенское зло.
SLAVIKI

SLAVIKI (статус: Посетитель), 3 ноября 2008, 18:23 [#16]:

я разобью и сброшу код чуть позже....
Dron

Dron (статус: Студент), 3 ноября 2008, 21:25 [#17]:

Цитата:

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, SLAVIKI!
Если только надо брать для проверки N-е количество символов с первой позиции, например 4, то в примере от Vetalion надо изменить условие:

if copy(Form1.Memo1.Lines[i], 4, 1) = Substr then begin
// совпала, значит копируем
end;

Цитата:

SLAVIKI:
Вариант тоже работает! Спасибо!


Странно. SLAVIKI, а вы проверяли? :-) Работать будет, но неправильно. Copy(S,4,1) - это то же самое, что S[4]. Первые 4 символа - Copy(S,1,4).

Ничего личного, просто выдали себя, что не проверяли :-)
С уважением.
SLAVIKI

SLAVIKI (статус: Посетитель), 4 ноября 2008, 01:46 [#18]:

не то что не проверял, просто условие в посл. момент поменялось:)...в итоге получился...код, который сбросил ранее...
SLAVIKI

SLAVIKI (статус: Посетитель), 4 ноября 2008, 01:47 [#19]:

ни фига не получается грамотно разбить ту часть кода......просто кроме этого еще очень много другого кода, который вылизал и работает...а на этот уже сил не хватает...в какой то ступор вошел...и топчусь на месте...
Feniks

Feniks (статус: Бакалавр), 4 ноября 2008, 09:38 [#20]:

Dron, от опечаток никто не застрахован. Ну попутал местами цифры. Ничего военного нет. Главное сама идея. К тому же функция описана в Хелпе. Даже эксперты могут допустить описку ;-)

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 16 августа 2017, 20:09
Выполнено за 0.04 сек.
Рейтинг@Mail.ru