Обрезание имени файла по длине
Автор: ___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;
|