Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевести с Delphi на С++, используя std::string 
V
    Опции темы
Alca
Дата 27.3.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Перевести с Delphi на С++, используя std::string (без AnsiString).
Только надо, чтоб текст писался в строку а не на канву.
Код

//---------------------------------------------------------------------------
procedure CutFirstDirectory(var S: TFileName);
var
  Root: Boolean;
  P: Integer;
begin
  if S = '\' then
    S := ''
  else
  begin
    if S[1] = '\' then
    begin
      Root := True;
      Delete(S, 1, 1);
    end
    else
      Root := False;
    if S[1] = '.' then
      Delete(S, 1, 4);
    P := AnsiPos('\',S);
    if P <> 0 then
    begin
      Delete(S, 1, P);
      S := '...\' + S;
    end
    else
      S := '';
    if Root then
      S := '\' + S;
  end;
end;
//---------------------------------------------------------------------------
function MinimizeName(const Filename: TFileName; Canvas: TCanvas;  MaxLen: Integer): TFileName;
var
  Drive: TFileName;
  Dir: TFileName;
  Name: TFileName;
begin
  Result := FileName;
  Dir := ExtractFilePath(Result);
  Name := ExtractFileName(Result);

  if (Length(Dir) >= 2) and (Dir[2] = ':') then
  begin
    Drive := Copy(Dir, 1, 2);
    Delete(Dir, 1, 2);
  end
  else
    Drive := '';
  while ((Dir <> '') or (Drive <> '')) and (Canvas.TextWidth(Result) > MaxLen) do
  begin
    if Dir = '\...\' then
    begin
      Drive := '';
      Dir := '...\';
    end
    else if Dir = '' then
      Drive := ''
    else
      CutFirstDirectory(Dir);
    Result := Drive + Dir + Name;
  end;
end;
//---------------------------------------------------------------------------


Вот что у меня получилось:
Код

#include <stdio.h>
#include <stdlib.h>
#include <string> 
#include <windows.h>
#include <fstream>
#include <string>
#include <iostream>
#include <stdio.h>
//---------------------------------------------------------------------------
using namespace std; 
//---------------------------------------------------------------------------
std::string sCutFirstDirectory(const std::string &csS) {
    std::string S;
    S.assign(csS);    
    
    bool bRoot;
    size_t  P;

    if ("\\" == S) {
        S.clear();
    } else {
        if (S[0] == '\\') {
            bRoot = true;
            //удаляем с 1(0) позиции 1 символ
            //Delete(S, 1, 1);
            S.erase(0, 1);
        } else {
            bRoot = false;
        }

        if ('.' == S[0]) {
            //Delete(S, 1, 4);
            S.erase(0, 4);
        }


        //P = AnsiPos("\\", S); 
        P = S.find_first_of("\\");


        if (- 1 != P) {
            //Delete(S, 1, P); - c позиции 1(0) P символов
            S.erase(0, P);
            S = "...\\" + S;
        } else {
            S.clear();
        }


        if (bRoot) {
            S = "\\" + S;
        }
    }

    return S;
}
//---------------------------------------------------------------------------
std::string MinimizeName(const std::string &csFilePath, /*TCanvas*/int Canvas, int MaxLen) {
    std::string sRes;    
    std::string sDrive;
    std::string sDir;
    std::string sName;

    
    sRes = csFilePath;
    
    TCHAR szDrive[MAX_PATH];    ZeroMemory(szDrive, sizeof(szDrive));
    TCHAR szDir  [MAX_PATH];    ZeroMemory(szDir,   sizeof(szDir));
    TCHAR szName [MAX_PATH];    ZeroMemory(szName,  sizeof(szName));
    TCHAR szExt  [MAX_PATH];    ZeroMemory(szExt,   sizeof(szExt));
    _splitpath(csFilePath.c_str(), szDrive, szDir, szName, szExt);    
    
    sDrive = std::string(szDrive);
    sDir   = std::string(szDrive) + std::string(szDir);
    sName  = std::string(szName)  + std::string(szExt);
    
  //while ((Dir <> '') or (Drive <> '')) and (Canvas.TextWidth(Result) > MaxLen) do
    while (((!sDir.empty()) || (!sDrive.empty())) && (/*не уверен!!!*/sRes.size() > MaxLen)) {  cout << sRes.size() << endl;
        if ("\\...\\" == sDir ) {
            sDrive.clear();
            sDir = "...\\";
        } else if (sDir.empty()) {
            sDrive.clear();
        } else {
            sRes = sCutFirstDirectory(sDir);    cout << sRes.size() << endl;      
        }

        sRes = sDrive + sDir + sName;
    }

    return sRes;
}
//---------------------------------------------------------------------------

Чета не пашет.....  smile 
В while-е ушло в бесконечный цикл...

Это сообщение отредактировал(а) Alca - 27.3.2009, 18:01


--------------------
PM WWW ICQ Skype Jabber   Вверх
Rififi
Дата 27.3.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



Опиши что делает функция...
PM MAIL   Вверх
Alca
Дата 27.3.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Цитата

MinimizeName

Shortens a fully qualified path name so that it can be drawn with a specified length limit.

Unit

FileCtrl

Category

file name utilities

extern PACKAGE AnsiString __fastcall MinimizeName(constAnsiString Filename, Graphics::
TCanvas* Canvas, int MaxLen);

Description

Use MinimizeName to obtain a version of a file name and path that can be drawn on a limited size drawing surface. MinimizeName replaces directories in the path portion of the file name with dots until the resulting name fits the specified number of pixels in length.

MinimizeName returns the shortened name.

Filename is the fully qualified path name that (possibly) needs to be shortened.

Canvas is the drawing surface on which the resulting name is to be rendered. It is used to determine font metrics.

MaxLen is the length, in pixels, available for drawing the file name on the canvas.



--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 27.3.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Цитата

Функция MinimizeName (
const FileName: TFileName;
Canvas: TCanvas;
MaxLen: Integer ): TFileName;

Данная функция поддерживается только в Delphi 4

Модуль: FileCtrl

type TFileName = type string;

Описание
Функция проверяет, умещается ли имя файла FileName в размер MaxLen холста Canvas при выводе на экран. Если имя файла при выводе на холст не умещается в заданный размер, то функция заменяет часть пути многоточием.

Пример
Код

var
   S: string;
begin
   with Image1 do

begin
Width:= 140;
Height:=100;
S:= 'С:\DIR1\DIR2\DIR3\DIR4\DIR5\DIR6\myfile.zzz';
S:= MinimizeName(S, Canvas, Width);
{То, что должна вывести функция ---> S:= 'С:\...\DIR5\DIR6\myfile.zzz' }
Canvas.TextOut(0, 0, S);
end;

end;



Добавлено через 2 минуты и 56 секунд
Вывод длинного имени файла на экран, в виде c:\...\file.txt


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 28.3.2009, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Код

while (<условие>) do begin
    //...
end;

Это типа:
Код

while (<условие>)  {
    //...
}

???


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.