На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Удаление текста между символами / Delphi/ RAD XE3+
    Ребята подскажите как решить такую задачу. Уже три дня ломаю голову и результата ноль.

    Задача: Удалить текст между данными символами включая - сами символы

    Текст до обработки:

    TEST "111111> TEST1 TEST "111111> TEST1 TEST "111111> TEST1
    TEST """111111> TEST1 TEST """111111> TEST1 TEST """111111> TEST1
    TEST """222222>> TEST2 TEST """222222>> TEST2 TEST """222222>> TEST2
    TEST """333>>> TEST3 TEST """333>>> TEST3 TEST """333>>> TEST3
    TEST "444444>>> TEST4 TEST "444444>>> TEST4 TEST "444444>>> TEST4 TEST "444444>>> TEST4
    TEST ""5555>>> TEST5 TEST ""5555>>> TEST5

    Результат, после обработки должен быть вот в таком виде:

    TEST TEST1 TEST TEST1 TEST TEST1
    TEST TEST1 TEST TEST1 TEST TEST1
    TEST TEST2 TEST TEST2 TEST TEST2
    TEST TEST3 TEST TEST3 TEST TEST3
    TEST TEST4 TEST TEST4 TEST TEST4 TEST TEST4
    TEST TEST5 TEST TEST5

    П/C: Обработка из файла и сохранение в файл.

    Я не совсем деревянный и по отдельности то знаю как сделать.
    К примеру делал вот так (Работает, но постоянно нужно подстраивать количество символов в k+3 и i+1):
    ExpandedWrap disabled
      var
      s,res: String;
      i,k: Integer;
       
      begin
      s:=Memo1.Lines.text;
       i:=pos('"""',s);
       while i<>0 do begin
        k:=pos('>>',s);
        res:=copy(s,i+1,k-i);
        delete(s,i,k+3-i);
        i:=pos('"""',s);
      delete(s,pos('"""',s),pos('>>',s)+3-pos('"""',s));
       end;
       Memo1.Lines.text:=s;
      end;

    Может у кого есть опыт по решению такой задачи. Заранее благодарен за помощь.
      Пример на псевдоязыке, который показывает как можно прочитать то что между символами "...<, причём, не важно сколько раз эти символы будут повторятся """...<< ""...<<<<< и т.д.

      ExpandedWrap disabled
        String find(String text) {
         
            start = pos("\"", text); // Получаем позицию первого символа кавычки
            end   = pos("<",text,start); // Получаем позицию первого символа < после кавычек
            
            for(int i=end;;){
                if(text[i++]!='<'){ // ищем конец последовательности символов <
                    end = start-i; // вычисляем сколько символов мы прошли с первой кавычки
                    break;
                }
            }
         
            return Copy(text, start, end); // возвращает то что попало между первой кавычкой " и последним символом <
            
        }
      Сообщение отредактировано: VisualProg -
        Надо выкусить всё, что находится между первым " и последним > - так, что ли?
        Простейший, хотя и тормознутый вариант
        ExpandedWrap disabled
          startPos := 1;
          repeat
            startPos := PosEx(s, '"', startPos);
            if startPos = 0 then Break; // не найдено '"'
            endPos := PosEx(s, '>', startPos + 1);
            if endPos = 0 then Break; // не найдено '>'
            while (endPos < Length(s)) and (s[endPos+1] = '>') do // ищем последний '>'
              Inc(endPos);
            Delete(s, startPos, endPos-startPos { ! тут проверить, возможно, надо будет +-1 } );
          until False;

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

        Добавлено
        Цитата VisualProg @
        Пример на псевдоязыке

        Я всегда подозревал, что Си это псевдоязык ))))
        Сообщение отредактировано: Fr0sT -
          Цитата Fr0sT @
          Я всегда подозревал, что Си это псевдоязык ))))

          В сях нет таких функций и строк, из делфей смутно помню Pos/Copy а как сделать пустой for(;;) не сообразил... решил сократить время :D
            VisualProg,Fr0sT, Ребята, спасибо за наставление. Буду разбираться.
              Друзья, тут все элементы отделены пробелом. Тут, мне кажется, через StringList.DelimitedText нужно действовать.
              Например так:
              ExpandedWrap disabled
                Var
                FIn,FOut:TextFile;
                SIn,SOut:String;
                Sl:TStringList;
                I:Integer;
                 
                begin
                  AssignFile(FIn,'C:\1.txt');
                  AssignFile(FOut,'C:\out.txt');
                  Reset(FIn);
                    if FileExists('C:\out.txt')  then Append(Fout) else Rewrite(FOut);
                 
                  Sl:=TStringList.Create;
                  SL.QuoteChar:=' ';
                 
                  while not EOF(Fin) do
                    begin
                      readln(FIn,SIn);
                      SL.DelimitedText:=SIn;
                      Sout:='';
                 
                        for I := 0 to SL.Count-1 do
                          begin
                            SIn:=SL[I];
                              if (SIn[1]<>'"') and (SIn[Length(SIn)]<>'>') then  SOut:=SOut + SIn+' ';
                          end;
                      Writeln(FOut,Sout);
                    end;
                 
                 
                 
                  Sl.Free;
                  CloseFile(FIn);
                  CloseFile(FOut);
                 
                end;

              для 100% совпадения с первым постом нужно последние пробелы убирать из текста
                Цитата ^D^ima @
                Например так

                Ужасно.
                  Цитата Fr0sT @
                  Ужасно.

                  Это не конструктивная критика.
                    ^D^ima, Огромное спасибо! Все работает как часики!
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0350 ]   [ 16 queries used ]   [ Generated: 28.03.24, 08:54 GMT ]