Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Функция преобразования длинного пути в короткий [D7]


Koan ©   (2005-06-05 15:36:00) 

Здравствуйте,
 Интересует функция(стандартная или API) делающая:

"C:\Program Files\Delphi\DDrop\TargetDemo\main.pas"
"C:\Program Files\..\main.pas"


Если нет то сам напишу. Интерисует именно готовая.


BiN   (2005-06-06 09:20:00) [1]


Koan   (05.06.05 15:36)

Здравствуйте,
Интересует функция(стандартная или API) делающая:


PathCompactPath(Ex) из shlwapi.dll


Abessalom   (2005-06-05 18:43:00) [2]


> Kolan ©   (05.06.05 18:25) [15]

Ну,)


Kolan   (2005-06-05 18:25:00) [3]


> Abessalom   (05.06.05 18:15) [13]


> все что нужно сделать, это передать его ClientRect

Всё теперь понял. Отлично работает. :)


Abessalom   (2005-06-05 18:20:00) [4]


> ExtractRelativePath

Извлекает относительный путь к файлу

Caption := ExtractRelativePath(Application.ExeName, ExtractFileDir(ExtractFileDir(Application.ExeName)))


Abessalom   (2005-06-05 18:15:00) [5]


> Зачем DrawText если надо просто строку преобразовать

Эта функция именно преобразует строку.

 SetRect(R, 10, 10, 150, 25);

и будет тебе счастье в виде C:\Program Files\..\main.pas. Жаль на форуме нельзя скриншот показать. Параметр R просто нужно правильно трактовать. Если, например, тебе нужно отобразить этот текст в каком-либо элементе управления, все что нужно сделать, это передать его ClientRect в качестве R + DC его канвы в функцию - она определит разрывы (/.../) строки с учетом отображения текста на конкретном DC с конкретными параметрами текста. Чем больше ширина прямоугольника, тем меньше вырежет и наоборот. Результаты надо анализировать хоть чуть.

Однако если тебе желательно просто вырезать кусок (не представляю цели отличной от той, для чего предназначена D..T..), тогда все верно, каждому своя проблема.

Щисливаго праграминья


Kolan   (2005-06-05 17:02:00) [6]

Вроде работает

function TForm1.GetDotShortFilePath(FilePath: string): string;
var
 DelimetersCount, SecondDelimeter: Integer;
 I: Integer;
begin
 DelimetersCount := 0;
 SecondDelimeter := 0;
 for I := 1 to Length(FilePath) do
 begin
   if FilePath[I] = '\' then
     DelimetersCount := DelimetersCount + 1;

   if (DelimetersCount = 2) and (SecondDelimeter = 0) then
     SecondDelimeter := I;

   if DelimetersCount >= 3 then
     Break;
 end;

 if DelimetersCount >= 3 then
 begin
   Result := Copy(FilePath, 1, SecondDelimeter) + '..\' + ExtractFileName(FilePath);
 end
 else
   Result := FilePath;
end;


А что делает
ExtractRelativePath
Что-то непонял.


begin...end   (2005-06-05 16:10:00) [7]

> Kolan ©   (05.06.05 16:08) [10]

Тогда самому писать.


Kolan   (2005-06-05 16:08:00) [8]

Ну как я понял это не совсем то. Зачем DrawText если надо просто строку преобразовать.

Ктомуже результат:

E:\...\Project1.exe

Опять не совсем то.


begin...end   (2005-06-05 16:04:00) [9]

> Koan   (05.06.05 16:00) [7]

> А к чему это вы?

Это я к [4].


Koan   (2005-06-05 16:02:00) [10]

Koan = Kolan


Koan   (2005-06-05 16:00:00) [11]


> Это нужно для последующего вывода сокращённого пути на канву?


Не очень понял вопрос. По идее нет наверно. Просто из строки

S := 'E:\My_Practice\Delphi\ShortFilePath\Project1.exe'

Хочу получить

S1 := 'E:\My_Practice\..\Project1.exe

А к чему это вы?


Abessalom   (2005-06-05 15:58:00) [12]

Т.е. необходим комментарий. Ф-я DrawText форматирует строку Р, в соответствии с параметром DT_MODIFYSTRING or DT_PATH_ELLIPSIS. Параметр DT_CALCRECT предотрващает вывод на канву. Результат формально установлен для Caption := P;


rOOse   (2005-06-05 15:57:00) [13]

сам пиши


Abessalom   (2005-06-05 15:56:00) [14]

var
 P: PChar;
 R: TRect;
begin
 P := AllocMem(Length(s) + 1);
 StrCopy(P, PChar(s));
 SetRect(R, 10, 10, 100, 25);
 DrawText(Canvas.Handle, P, Length(s), R,
   DT_SINGLELINE or DT_CALCRECT or DT_LEFT or DT_MODIFYSTRING or DT_PATH_ELLIPSIS);
 Caption := P;
 FreeMem(P);
end;


begin...end   (2005-06-05 15:55:00) [15]

> Koan

Это нужно для последующего вывода сокращённого пути на канву?


Koan   (2005-06-05 15:52:00) [16]

Не совсем то. Вот что она сделала:
E:\My_Practice\Delphi\ShortFilePath\Project1.exe
E:\MY_PRA~1\Delphi\SHORTF~1\Project1.exe

Хотелось бы
E:\My_Practice\..\Project1.exe


rOOse   (2005-06-05 15:43:00) [17]

GetShortPathName


Наверх

Титульная страница Поиск, карта сайта Написать письмо