Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.05.2009, 00:49
Aндрей Aндрей вне форума
Прохожий
 
Регистрация: 16.02.2009
Адрес: Брянск
Сообщения: 34
Репутация: 10
По умолчанию Укорачивание имени

Мне в программе нужно укоротить путь до папки (использую TShellTreeView). Так вот, пробовал тренироваться на эдитах:
Edit1.Text:= TShellTreeView.Path;
Код:
function ShortFileName(const FileName: string): string;
var aTmp: array[0..255] of Char;
begin
  if not DirectoryExists(FileName)  //FileExists(FileName)
    then Result:=''
    else if GetShortPathName(PChar(FileName), aTmp, Sizeof(aTmp)-1) = 0
      then Result:= FileName
      else Result:= StrPas (aTmp);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Edit2.Text:=(ShortFileName(Edit1.Text));
end;
Почему-то он возвращает в Edit2 пустое значение.. Подскажите что ни так?
Ответить с цитированием
  #2  
Старый 19.05.2009, 08:51
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Да вроде бы работает Ваша функция :
Код:
function ShortFileName(const FileName: string): string;
var
  aTmp: array[0..255] of Char;
begin
  if not FileExists(FileName) then begin
     Result:='';
  end
  else begin
     if GetShortPathName(PChar(FileName), aTmp, Sizeof(aTmp)) = 0 then begin
        Result:= FileName;
     end
     else begin
        Result:= StrPas (aTmp);
     end;
  end;
end;

На входе :
D:\Мои документы\Санитарные_правила_и_нормы\СанПиН-2_2_4_1294-03.2003-06-15\СанПиН-2_2_4_1294-03-20030615.htm

На выходе :
D:\МОИДОК~1\САНИТА~1\САНПИН~2.200\САНПИН~1.HTM
Ответить с цитированием
  #3  
Старый 19.05.2009, 13:59
Aндрей Aндрей вне форума
Прохожий
 
Регистрация: 16.02.2009
Адрес: Брянск
Сообщения: 34
Репутация: 10
По умолчанию

Как я понял, обязательно должен существовать файл, к которому указывается путь. А можно как-нидуть сделать, чтобы просто путь укарачивался?
Например:
D:\Мои документы\Санитарные_правила_и_нормы\СанПиН-2_2_4_1294-03.2003-06-15\

Последний раз редактировалось Aндрей, 19.05.2009 в 16:28.
Ответить с цитированием
  #4  
Старый 19.05.2009, 14:00
Aндрей Aндрей вне форума
Прохожий
 
Регистрация: 16.02.2009
Адрес: Брянск
Сообщения: 34
Репутация: 10
По умолчанию

У меня просто в программе указывается путь к файлу, который еще не существует

Последний раз редактировалось Aндрей, 19.05.2009 в 14:07.
Ответить с цитированием
  #5  
Старый 19.05.2009, 19:17
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

А разве здесь не подойдет ExtractFilePath(...) ?
Ответить с цитированием
  #6  
Старый 19.05.2009, 19:18
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Элементарно, Ватсон:
Код:
function ShortFileName(const FileName: string): string;
var
  aTmp: array[0..255] of Char;
begin
 if GetShortPathName(PChar(FileName), aTmp, Sizeof(aTmp)) = 0 then begin
      Result:= FileName;
   end
   else begin
      Result:= StrPas (aTmp);
   end;
end;
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #7  
Старый 19.05.2009, 19:25
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Вот так тоже сработало :
Код:
function GetShortFileName(fnFull : string): string;
var
  aTmp: array[0..255] of Char;
begin
  Result:='';
  //if FileExists(fnFull) then begin
     if GetShortPathName(PChar(fnFull), aTmp, Sizeof(aTmp)) = 0 then begin
        Result:= fnFull;
     end
     else begin
        Result:= StrPas(aTmp);
     end;
  //end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetShortFileName('D:\Мои документы\Санитарные_правила_и_нормы\СанПиН-2_2_4_1294-03.2003-06-15\'));
end;

На выходе :
D:\МОИДОК~1\САНИТА~1\САНПИН~2.200\
Ответить с цитированием
  #8  
Старый 19.05.2009, 19:28
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Мир тесен - пересеклись в едином мнении и почти одновременно ...
Что-то в этом есть
:-)
Ответить с цитированием
  #9  
Старый 19.05.2009, 22:33
Aндрей Aндрей вне форума
Прохожий
 
Регистрация: 16.02.2009
Адрес: Брянск
Сообщения: 34
Репутация: 10
По умолчанию

Большое большое спасибо!
Ответить с цитированием
  #10  
Старый 20.05.2009, 12:37
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Есть функции API, которые сами ставят многоточие. Вот пример. Я, правда, не совсем знаком с хэндлами и у меня получился немного больший по размеру шрифт, но кто-нибудь вам подскажет.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  dc: HDC;
  Rect: TRect;
  S:    String;
begin
  S:= 'D:\Мои документы\Санитарные_правила_и_нормы\СанПиН-2_2_4_1294-03.2003-06-15\';
  dc:=GetWindowDC(Edit1.Handle);
  Rect:= Edit1.ClientRect;
  DrawText(dc,
    PAnsiChar(S),
    Length(S),
    Rect,
    DT_PATH_ELLIPSIS);  //    DT_END_ELLIPSIS
  ReleaseDC(Edit1.Handle,dc);
end;
Флаг DT_PATH_ELLIPSIS ставит многоточие в середине (правило в справке), а флаг DT_END_ELLIPSIS - в конце.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:49.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter