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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2012, 19:17   #1
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию Как "перевернуть" алгоритм процедуру?

Есть такая вот функция
Код:
Procedure IsolateText( Const S: String; Tag1, Tag2: String; list: TStrings );
var pScan, pEnd, pTag1, pTag2: PChar; foundText: String;searchtext: String;
begin
  searchtext := Uppercase(S);
   Tag1:= Uppercase( Tag1 );
    Tag2:= Uppercase( Tag2 );
     pTag1:= PChar(Tag1);
      pTag2:= PChar(Tag2);
      pScan:= PChar(searchtext);
  repeat
  pScan:= StrPos( pScan, pTag1 );
    if pScan <> Nil then
      begin
       Inc(pScan, Length( Tag1 ));
        pEnd := StrPos( pScan, pTag2 );
        If pEnd <> Nil then
           begin
            SetString( foundText,
            Pchar(S) + (pScan- PChar(searchtext) ),
            pEnd - pScan );
            list.Add( foundText );
            pScan := pEnd + Length(tag2);
           end
       else
      pScan := Nil;
    end;
  Until pScan = Nil;
end;
Она парсит значения , которые находиться между Tag1, и Tag2, и добавляет все отпарсеное в стринглист)
Например если на сайте есть структура вроде
<name>Nick1</name>
<name>Nick2</name>
<name>Nick3</name>
то вызвав IsolateText(html_code ,'<name>', '</name>',list), у нас в листе ,будит вот это
Nick1
Nick2
Nick3

Но мне надо что бы функция начинала парсинг не сначала текста а с конца. Т.е есть у нас текст
<name>Nick1</name>
<name>Nick2</name>
<name>Nick3</name>
в результате должно получиться
Nick3
Nick2
Nick1
Как ее переделать я не знаю, т.к. не могу понять алгоритм.
Прошу помощи более опытных
bakanaev вне форума Ответить с цитированием
Старый 07.08.2012, 19:49   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вместо
list.Add( foundText );
использовать
list.Insert(0,foundText);

При условии, что list не просто TStrings, а его наследник с неабстрактным методом Insert
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 07.08.2012 в 19:52.
Аватар вне форума Ответить с цитированием
Старый 07.08.2012, 19:57   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

А что обычным циклом с обменом значений (первый с последним второй с предпоследним) никак ? Вызываете эту свою процедурку, а потом ещё таким циклом всё переворачиваете и всё. Можете всё вместе ещё в некую процедурку обернуть.

УПД. у Аватар'a решение поэлегантнее )) я просто в код даже не вчитывался ) но, думаю, для лучшей расширяемости можно добавить параметр (передать в процедуру, например, некий boolean) и в зависимости от него выбирать одно из направлений заполнения. Мой вариант, тоже в принципе так же расширяем, но основная функция будет не затронута, а проверка будет перед циклом (если true - вызывать цикл переворота).

Последний раз редактировалось phomm; 07.08.2012 в 20:02.
phomm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[2D]Физика игры как в "Worms" - алгоритм DenTiSt Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 22.06.2011 03:50
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
писал программу вылезло "попытка вызвать процедуру как функцю" объясните че не так PlayHard Паскаль, Turbo Pascal, PascalABC.NET 8 15.05.2010 00:25
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
"Перевернуть число" рекурсией Dmitry333 Помощь студентам 6 03.12.2009 14:33