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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2013, 15:17   #1
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
Вопрос найти нужную строку в RichEdit

Доброе время суток!
Собственно Есть неопределённый текст в RichEdit сколько строк до например "Перечень неполадок:" неизвестно.
И сколько будет перечислено до "Выполнить в срок:" тоже неизвестно.
Нужно сохранить если дописано все строки между "Перечень неполадок:" и "Выполнить в срок:".
Честно не знаю как это осуществить(((
Помогите пожалуйста!
Заранее благодарен!
С уважением,
Volkogriz!
Не количеством плюсов измеряется репутация человека...!
Volkogriz вне форума Ответить с цитированием
Старый 28.07.2013, 15:23   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Эмм функциями Copy, Pos найти и скопировать нужный кусок кода.
Человек_Борща вне форума Ответить с цитированием
Старый 01.08.2013, 12:09   #3
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

ооо помогите пожалуйста найти ошибку:
Рабочий кодик:
Код:
procedure TForm1.btn1Click(Sender: TObject);
var
  Ftext:TStringlist;
  strt,endp,sysfldn:Integer;
begin
  Ftext:=TStringlist.Create;
  dlgOpencrt.FilterIndex:=3;
  if dlgOpencrt.Execute then
  begin
    mmo1.Lines.LoadFromFile(dlgOpencrt.FileName);
    //lstlbls.Items.Text:=FieldsFromFile(mmo1.Lines);
    Ftext.Text:=mmo1.Lines.Text;
    strt:=0;
    while posex('<field name="',Ftext.Text,strt)>1 do
      begin
        strt:=posex('<field name="', Ftext.Text,strt)+13;
        endp:=posex('"', Ftext.Text, strt);
        lstlbls.Items.Add(copy(Ftext.Text,strt,endp-strt));
        Application.ProcessMessages;
      end;
  end;
  Ftext.Free;
end;
Не работает:
Код:
function FieldsFromFile (Inputtext:TStrings):string;
const
  fldn      :string = '<field name="';
  sysf      :string = 'sysfields';
  dscr      :string = 'descr="';
  fldntype  :string = 'type="';

var
  strt,endp,sysfldn:Integer;
  outtext:TStringList;
begin
  try
      outtext:=TStringList.Create;
      {if posex(sysf,text.Text)<>0 then
        sysfldn:=posex(sysf, text.Text);
      if posex('/'+sysf,text.Text)<>0 then
        strt:=posex('/'+sysf, text.Text);}

      while posex(fldn,Inputtext.Text,strt)>1 do
      begin
        strt:=posex(fldn, Inputtext.Text,strt)+13;
        endp:=posex('"', Inputtext.Text, strt);
        outtext.Add(copy(Inputtext.Text,strt,endp-strt));
        Application.ProcessMessages;
      end;
  finally
    result:=outtext.Text;
    outtext.Free;
  end;
end;
IvaniuS вне форума Ответить с цитированием
Старый 01.08.2013, 14:24   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
strt:=posex(fldn, Inputtext.Text,strt)+13;
Может из-за магии с числами и не находит. Что за магическое 13? Вы уверены что оно всегда справедливо для текста?
Человек_Борща вне форума Ответить с цитированием
Старый 01.08.2013, 14:51   #5
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

да символов в <field name=" ровно 13, потому начинаю копировать от "равно"
IvaniuS вне форума Ответить с цитированием
Старый 02.08.2013, 17:06   #6
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Код:
function FieldsFromFile (Inputtext:TStrings):string;
const
  fldn      :string = '<field name="';
  sysf      :string = 'sysfields';
 { dscr      :string = 'descr="';
  fldntype  :string = 'type="';
  FIRM_NAME   :string = 'Назва підприємства' ;
  FIRM_EDRPOU :string = 'ЄДРПОУ' ;
  FIRM_KVED   :string = 'Квед' ;
  FIRM_KVEDNM :string = 'Вид економічної діяльності' ;
  FIRM_BUH    :string = 'Головний бухгалтер' ;
  FIRM_ADR    :string = 'Адреса' ;
  FIRM_RUK    :string = 'Керівник' ; }

var
  strt,endp,sysfldn:Integer;
  outtext:TStringList;
begin
  try
      outtext:=TStringList.Create;
      strt:=0;
      if posex(sysf,Inputtext.Text)<>0 then
        strt:=posex(sysf, Inputtext.Text);
      if posex('/'+sysf,Inputtext.Text)<>0 then
        sysfldn:=posex('/'+sysf, Inputtext.Text);
      while posex(fldn,Inputtext.Text,strt)<>0 do
      begin
        strt:=posex(fldn, Inputtext.Text,strt)+13;
        endp:=posex('"', Inputtext.Text, strt);
        outtext.Add(copy(Inputtext.Text,strt,endp-strt));
        //application.ProcessMessages;
      end;
  finally
    result:=outtext.Text;
    outtext.Free;
  end;
end;
вот что получилось, но работает ОООООООЧЕНь медленно, в 2-3 раза быстрее делать, если просто в кнопке написать тот же код.... что мне не ясно..

Последний раз редактировалось IvaniuS; 03.08.2013 в 00:21.
IvaniuS вне форума Ответить с цитированием
Старый 02.08.2013, 18:28   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

IvaniuS, вы экономите на тексте.
Занесите его во временную переменную. Далее алгоритм прост:
Нашли
Вырезали все лишнее
Просто взяли результат
Ищем снова

Код:
const
 cStart='FieldName="';
 cEnd='"';
var
 p:Integer;
 s:string;
begin
 s:=InputStr;
 p:=1;
 repeat 
 p:=Pos('FieldName="',s);
 if (p > 0) then
 begin
   Delete(s,1,p+Length(cStart)-1);
   MyRESULTStringsList.Add(Copy(s,1,Pos(cEnd,s)-1));
 end;
 until p > 0;
end;
Такой метод куда быстрее.
Да и возможностей больше, можно привести все в 1 регистр и триммировать, и шансов реально найти что-то станет на 25% больше.
Человек_Борща вне форума Ответить с цитированием
Старый 03.08.2013, 00:10   #8
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

а разве POS работает быстрее POSEx, просто я думал я там сразу знаю позицию в тексте с коорой начать искать, и это не требует выше описанного т.е. удаление всего что до. Спасибо за совет значит все-таки напишу то что задумывал изначально, там на самом деле парсинг XML файла в нем есть 3-5 параметров:
1)Имя т.е. название переменной
2)тип его флоат, интегер или булевой
3)описние на русском какие данные вводить в переменную
4)обязательно ли это поле
5)системное ли это поле
ВСЕ в 1 строке подряд открыто и закрыто <> как полагается оформлено и т.д.,
это я сделал уже давно с помощью предыдущей программы, но теперь нужно сделать такой свой тип который бы все это объединял и мог номально выводить, но я не знаю подобного компонента (визуального) куда без труда можно все это впихнуть т.к. нужно одновременно и выводить и считывать т.е. такая своеобразная длинная строка где Label + Edit и они свзяны...
Нашел старый проект просмотрел и понял что нужно разбрирать тоже с помощью ХМЛДокумент, как и собирал, с помощью TValueListEditor буду выводить, получиться достаточно простой массив 5 х Кол-во элементов

Последний раз редактировалось IvaniuS; 03.08.2013 в 01:00.
IvaniuS вне форума Ответить с цитированием
Старый 03.08.2013, 00:43   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
т.е. такая своеобразная длинная строка где Label + Edit и они свзяны...
Ещё с Delphi 5 существует
TLabeledEdit называется. Поищите на Additional закладке.

А ещё для чтения/записи XML существует куча компонентов/классов.
Человек_Борща вне форума Ответить с цитированием
Старый 03.08.2013, 13:17   #10
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

все получилось, теперь код выполняется за милисекунды и обошлось мне все с помощью MSXML в 2 цикла 1 ValueListEditor и 1 TXMLDocument:
Код:
procedure TForm3.Button2Click(Sender: TObject);
var
  sysnode,tablenode:IXMLNode;
  i:integer;
begin
   sysnode:=xmldoc.DocumentElement.ChildNodes.Nodes[0];
   tablenode:=xmldoc.DocumentElement.ChildNodes.Nodes[1];
   for I := 0 to sysnode.ChildNodes.Count - 1 do
      vle.InsertRow(VarToStr(sysnode.ChildNodes[i].Attributes['name']),VarToStr(sysnode.ChildNodes[i].Attributes['name']),true);
   for I := 0 to tablenode.ChildNodes.Count - 1 do
      vle.InsertRow(VarToStr(tablenode.ChildNodes[i].Attributes['descr']),VarToStr(tablenode.ChildNodes[i].Attributes['name']),true);
 end;
IvaniuS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что бы C# цеплял нужную строку из HTML dr.dimm C# (си шарп) 5 24.09.2011 11:05
Добавление текста в нужную строку Memo Lauri Общие вопросы Delphi 1 08.08.2010 14:35
Вставить запись в нужную строку и колонку Inbox БД в Delphi 1 19.02.2009 19:50
Как добавить нужную строку в memo Volkogriz Общие вопросы Delphi 5 02.12.2008 22:38
Как найти нужную строку в ListBox? DelphiKettle Помощь студентам 2 05.09.2007 22:02