Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Обрезание имени файла по длине


Автор: ___Nikolay
WEB-сайт: http://delphiworld.narod.ru

// Обрезание имени файла по длине
function CutFoldersFromFileName(s: string; iLength: integer): string;
var
  bm: TBitmap;
  sResult: string;
  iStrLen: integer;

  // Поменять порядок символов в строке
  function ChangeLettersOrder(s: string): string;
  var
    sResult: string;
    i: integer;
  begin
    sResult := '';
    if Trim(s) <> '' then
      for i := Length(s) downto 1 do
        sResult := sResult + s[i];
    Result := sResult;
  end;

  // Количество вхождений символа в строку
  function SymbolEntersCount(ch: char; s: string; bCaseInsensitive: boolean): integer;
  var
    i, iResult: integer;
    cSymbol: char;

    function LoCase(ch: char): char;
    begin
      if (ch in ['A'..'Z', 'А'..'Я']) then
        result := chr(ord(ch) + 32)
      else
        result := ch;
    end;

  begin
    iResult := 0;
    if bCaseInsensitive then
      ch := LoCase(ch);
    if s <> '' then
      for i := 1 to Length(s) do
      begin
        cSymbol := s[i];
        if bCaseInsensitive then
          cSymbol := LoCase(cSymbol);
        if cSymbol = ch then
          inc(iResult);
      end;
    Result := iResult;
  end;

  // Удалить имя последнего каталога из полного имени файла
  function DeleteLastFolderFromFileName(sFileName: string): string;
  var
    sResult, sFName: string;
  begin
    sResult := sFileName;
    if Pos('\...\', sResult) <> 0 then
      Delete(sResult, Pos('\...\', sResult), 4);
    if SymbolEntersCount('\', sResult, false) < 2 then
    begin
      Result := sFileName;
      exit;
    end;
    sResult := ChangeLettersOrder(sResult);
    sFName := ChangeLettersOrder(Copy(sResult, 1, Pos('\', sResult) - 1)); // Взяли имя файла
    Delete(sResult, 1, Pos('\', sResult)); // Удалили имя файла
    Delete(sResult, 1, Pos('\', sResult)); // Удалили имя каталог перед именем файла
    sResult := ChangeLettersOrder(sResult) + '\...\' + sFName;
    Result := sResult;
  end;

begin
  Result := s;
  if (Trim(s) = '') or (SymbolEntersCount('\', s, false) < 2) then
    exit;

  sResult := s;
  bm := TBitmap.Create;
  bm.Width := 100;
  bm.Height := 100;
  iStrLen := bm.Canvas.TextWidth(sResult);
  while iStrLen > iLength do
  begin
    sResult := DeleteLastFolderFromFileName(sResult);
    iStrLen := bm.Canvas.TextWidth(sResult);
    if SymbolEntersCount('\', sResult, false) < 3 then
      break;
  end;
  bm.Free;
  Result := sResult;
end;
Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay