2013-12-19 1 views
-1

откату с помощью Delphi XE-5 FireMonkey мобильногоинкрементный строка

У меня есть строка (путь), который выглядит следующим образом

host domain and node here\\something1\\something2\\something3\\something4\\something5 

Мне нужна функция, которая удаляет каждую часть с каждым вызовом. например, когда вызвать функцию в первый раз, он не будет удалить «\ something5» оставив строку как

something1\\something2\\something3\\something4

function CountOccurences(const SubText: string; 
          const Text: string): Integer; 
begin 
    if (SubText = '') OR (Text = '') OR (Pos(SubText, Text) = 0) then 
    Result := 0 
    else 
    Result := (Length(Text) - Length(StringReplace(Text, SubText, '', [rfReplaceAll]))) div Length(subtext); 
end; {Robert Frank} 

function IncrementalBackOff(aPath: String): String; 
var 
    I: Integer; 
    Found: Boolean; 
begin 
    result:= aPath; 
    if (CountOccurences('\\', result) > 1) then 
    begin 
    for I:= Length(result) downto 1 do 
    begin 
    if (result[I] <> '\') then 
    Delete(result, I, 1) 
    else 
    begin 
    Delete(result, I, 1); 
    Delete(result, I-1, 1); 
    end; 
    end; 
    end; 
end; 

ПРИМЕЧАНИЕ: Мне нужно всегда держать первый участок (т.е. никогда удалить '\\' something1

host domain and node here\\something1 

Таким образом, функция должна вернуть строку remainng каждый раз

+2

У вас действительно есть двойная обратная косая черта? Считаете ли вы использование функции split? –

+0

[LastDelimiter] (http://docwiki.embarcadero.com/Libraries/XE5/en/System.SysUtils.LastDelimiter) будет работать здесь хорошо. –

ответ

3

Это не самая короткая версия, но она все еще довольно короткая и довольно читаемая:

function ReducePath(const Path: string): string; 
var 
    i: Integer; 
begin 
    result := Path; 
    if PosEx('\\', Path, Pos('\\', Path) + 2) = 0 then Exit; 
    for i := Length(result) - 1 downto 1 do 
    if Copy(result, i, 2) = '\\' then 
    begin 
     Delete(result, i, Length(result)); 
     break; 
    end; 
end; 

Более короткий код, но неэффективна:

function ReducePath(const Path: string): string; 
begin 
    result := Path; 
    if PosEx('\\', Path, Pos('\\', Path) + 2) = 0 then Exit; 
    Result := Copy(Result, 1, Length(Result) - Pos('\\', ReverseString(Result)) - 1); 
end; 
+0

Интересно, спасибо за ответ! Позвольте мне попробовать это. – JakeSays

+0

@sholmes: [Вы уверены?] (Http://docwiki.embarcadero.com/Libraries/XE5/en/System.StrUtils.PosEx) –

+0

Извините, мобильная (android) разработка всегда ошибается, пока вы ее не скомпилируете - мой плохой – JakeSays

1

RTL имеет ExtractFileDir() функцию для этой точной цели. Существует также ExtractFilePath(), хотя он оставляет цельный разделитель неповрежденным, тогда как ExtractFileDir() удаляет его.

+0

Это не поможет, но 'ExtractFileDir' будет делать. «Путь» всегда включает разделитель конечных путей. Если это не каталог или файл –

+0

Обе эти функции удаляют только одну обратную косую черту. @Remy, вы читаете это как C++ с экранированными обратными косыми чертами? –