Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Стандартная функция усечения строки


Автор: Comm 24.2.2009, 20:39
Добрый вечер Всем)

Есть ли в Buildere стандартная функция усечения строки(если она не помещается на выделенный кусок канвы) с добавлением в конец строки многоточия ?

Я конечно понимаю что это не трудно написать эту функцию самому,но это оставим на случай если стандартной похожей функции нет.

Спасибо за внимание.

Автор: mrbrooks 25.2.2009, 08:42
Цитата(Comm @  24.2.2009,  20:39 Найти цитируемый пост)
Есть ли в Buildere стандартная функция усечения строки(если она не помещается на выделенный кусок канвы) с добавлением в конец строки многоточия ?

Такой не встречал. Делай руками камрад  smile 

Автор: TiKKi 25.2.2009, 09:37
Win32 API - http://msdn.microsoft.com/ru-ru/library/dd162498(en-us,VS.85).aspx

Автор: Alca 25.2.2009, 10:35
Код

StatusBar1->SimpleText = MinimizeName(asFilePath, StatusBar1->Canvas, 120);

Автор: dix75 25.2.2009, 11:07
Alca, 
чето я не понял как она работает

Код

Label1->Caption = MinimizeName("asFilePa555555555555555555555555555555555555555555555555th", Label1->Canvas, 5);


эффекта ноль

Ясно эта функция работает если есть обратные слэши в строке :(

Автор: Alca 25.2.2009, 11:13
Делай руками камрад  smile 
Что-то вроде этого:
Код

//---------------------------------------------------------------------------
std::string sMinimizeFileName(const std::string &csStr, const unsigned int cuiMaxLen) {    
    //-------------------------------------
    //CHECK
    if (true == csStr.empty()) {
        return std::string("");
    }

    //-------------------------------------
    //JOB
    std::string sRes("");
    std::string sTildaDotExt      = "~." + sExtractFileExt(csStr);
    size_t      uiTildaDotExtSize = sTildaDotExt.size();

    if (csStr.size() > cuiMaxLen) {
        if (cuiMaxLen < uiTildaDotExtSize) {
            sRes = csStr.substr(0, cuiMaxLen);
        } else {
            sRes = csStr.substr(0, cuiMaxLen - uiTildaDotExtSize) + sTildaDotExt;
        }
    } else {
        sRes = csStr;
    }

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

Автор: dix75 25.2.2009, 11:27
Alca, 
это понятно, спасибо.
а если просто строку обрезать, она не обязательно слэш содержит, а?

Автор: Alca 25.2.2009, 11:28
Код

AnsiString asStr = "11111111111";
asStr.SetLength(5);

Автор: dix75 25.2.2009, 11:45
Alca, 
так это размер нуна знать

Автор: Alca 25.2.2009, 11:57
Посмотри исходники MinimizeName. И сделай по аналогии.

Автор: dix75 25.2.2009, 11:58
так работает
Код

Label1->Caption =  WrapText("5555555555555555555555th", "...\r\n",TSysCharSet(' '),3);


так нет
Код

Label1->Caption =  WrapText("5555555555555555555555th", "...\r\n",TSysCharSet(' '), Label1->Caption.Length());


почему?

Автор: Alca 25.2.2009, 11:58
Подрихтуй под себя, вот исходник MinimizeName:
Код

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;

Автор: dix75 25.2.2009, 12:08
Alca, 
спасибо у меня своя версия есть.
я думал что существует какая нить в билдере

Автор: TiKKi 25.2.2009, 13:22
Я Вам удивляюсь!
Код

RECT  sbRect = { 0, 0, StatusBar1->Width/4, StatusBar1->Height };
DrawText( StatusBar1->Canvas->Handle, AnsiString( "Много-много-много-много-много текста" ).c_str(), -1, &sbRect, DT_END_ELLIPSIS | DT_SINGLELINE );

Это в качестве примера, чтобы было все нормально необходимо координаты подобрать.

Автор: Comm 25.2.2009, 13:22
Всем спасибо,будем колдовать)

Автор: dix75 11.3.2009, 21:20
TiKKi, 

Да ничерта она не работает

Автор: TiKKi 12.3.2009, 01:13
Цитата(dix75 @ 11.3.2009,  21:20)
TiKKi, 

Да ничерта она не работает

Работает!
Вот из твоего ответа ничерта не понятно, что делаешь, что она не работает.

Автор: Comm 12.3.2009, 03:22
А я пишу эту функцию со вставкой Ассемблера =) незнаю стоит ли оно того или нет...но все же.

Автор: dix75 12.3.2009, 09:18
TiKKi, 
Она аботает если в тексте есть какие-либо символы дающие возможность переноса строки типа "много-много-много текста". Здесь обрезается строка без проблем.
Но в тексте "8888888888888888888888888888888888888" ничего не произойдет.

Добавлено через 1 минуту и 5 секунд
Comm, 
Не понял.
Тогда в твою функцию необходимо передавать строку в стиле С.
Пример кода можно?

Автор: TiKKi 12.3.2009, 10:11
Цитата(dix75 @ 12.3.2009,  09:18)
TiKKi, 
Она аботает если в тексте есть какие-либо символы дающие возможность переноса строки типа "много-много-много текста". Здесь обрезается строка без проблем.
Но в тексте "8888888888888888888888888888888888888" ничего не произойдет.

Ошибаешься!
Код

RECT  sbRect = { 0, 0, StatusBar1->Width, StatusBar1->Height };
DrawText( StatusBar1->Canvas->Handle, AnsiString( "88888888888888888888888888888888888888888888888888" ).c_str(), -1, &sbRect, DT_END_ELLIPSIS | DT_SINGLELINE );

Кинь на форму статус бар, а это в OnResize формы вставь и поиграйся с размером формы.

Автор: Comm 12.3.2009, 13:37
dix75,ф-я. DrawText 100% работает
Код

  RECT  sbRect = { 0, 0, StatusBar1->Width, StatusBar1->Height };
   StatusBar1->Canvas->Brush->Color=StatusBar1->Color;
   DrawText( StatusBar1->Canvas->Handle, AnsiString( "88888888888888888888888888888888888888888888888888" ).c_str(), -1, &sbRect, DT_END_ELLIPSIS | DT_SINGLELINE );

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)