|
Вопрос # 2 039/ вопрос открыт / |
|
Здравствуйте! Подскажите как сделать следующее:
Поиск построчно в memo, если первое слово соответствует нужному значению, то копируется вся строка, единственый момент: даже не первое слово а символы(допустим первые 4, а дальше может идти что угодно)
 |
Вопрос задал: 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 (статус: Посетитель), 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 (статус: Посетитель), 3 ноября 2008, 15:54 [#2]:
тоже самое дело через POS, не получалось...сейчас получилось Спасибо огромное!
|
|
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 (статус: Посетитель), 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 (статус: Посетитель), 3 ноября 2008, 18:00 [#7]:
есть куча файлов, путь к файлам в listbox, программа сначала переводит файлик(убирая теги и тд, если они есть) затем отображает обработанный текст в memo1 потом из memo1 дергается пару строк и сохраняется в stringgrid в конце всего все сохранятся в excel
|
|
Вадим К (статус: Академик), 3 ноября 2008, 18:05 [#8]:
длинный процесс. настоятельно рекомендую подумать и разделить на несколько частей, и избавиться от визуальных компонентов в промежуточных иттерациях.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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 (статус: Посетитель), 3 ноября 2008, 18:08 [#10]:
как мне грамотно разделить? по процедурам делил, не стабильно все, т.е через раз работает, если фалов около 1000 в листе....процентов 40 не совсем правильно обрабатывается
|
|
Вадим К (статус: Академик), 3 ноября 2008, 18:08 [#11]:
о, ужас. Такой код, ещё и в FormCreate. Обращение к некоторым компонентам в таком случае может быть непредсказуемым. Некоторые компоненты могут быть не готовы к работе
А код - тихий ужас. Полностью нечитабельный.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
SLAVIKI (статус: Посетитель), 3 ноября 2008, 18:12 [#12]:
в form.create это просто показать...что когда все загружено че надо делать....а так у меня через другие вызовы все грузится....сам понимаю что ужас....взываю о помощи..как это все разбить грамотно?
|
|
Вадим К (статус: Академик), 3 ноября 2008, 18:14 [#13]:
логически. каждая процедура должна делать своё маленькое дело.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
SLAVIKI (статус: Посетитель), 3 ноября 2008, 18:16 [#14]:
так и делал, НО..видимо не правильно...в итоге опять все вместе слил в одну кнопку .....может кто-нибудь тот большой код на процедурки разбить? у меня как-то не получается работоспособно все это сделать, огрехи про которые я писал и перескоки случаются.
|
|
Вадим К (статус: Академик), 3 ноября 2008, 18:18 [#15]:
Я сейчас точно не буду писать. Смысла нет. Надо самостоятельно тренироваться.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
SLAVIKI (статус: Посетитель), 3 ноября 2008, 18:23 [#16]:
я разобью и сброшу код чуть позже....
|
|
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 (статус: Посетитель), 4 ноября 2008, 01:46 [#18]:
не то что не проверял, просто условие в посл. момент поменялось ...в итоге получился...код, который сбросил ранее...
|
|
SLAVIKI (статус: Посетитель), 4 ноября 2008, 01:47 [#19]:
ни фига не получается грамотно разбить ту часть кода......просто кроме этого еще очень много другого кода, который вылизал и работает...а на этот уже сил не хватает...в какой то ступор вошел...и топчусь на месте...
|
|
Feniks (статус: Бакалавр), 4 ноября 2008, 09:38 [#20]:
Dron, от опечаток никто не застрахован. Ну попутал местами цифры. Ничего военного нет. Главное сама идея. К тому же функция описана в Хелпе. Даже эксперты могут допустить описку
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|