| 
| 
 | Вопрос # 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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |