Перевести с 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; } //---------------------------------------------------------------------------
|
Чета не пашет..... В while-е ушло в бесконечный цикл... Это сообщение отредактировал(а) Alca - 27.3.2009, 18:01
|