IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Выравнивание текста по краям в Memo, Borland C++ Builder
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Vitaliy

Репутация: -  0  +


Подскажите пожалуйста, как можно выровнять текст по ширине в Memo используя для этого вставку дополнительных пробелов между словами?
То есть пробелы надо вставлять только тогда когда строка меньше текущей ширины Memo, а если строка больше то не уместившиеся часть строки переносится на новую (WordWrap выставлен в "true")
И еще такой вопрос: как задать параметры абзаца в Memo для указанной строки?
К примеру для первой строки код следующий:

int Value = StrToInt(OKRightDlg->CSpinEdit2->Text);
for(int i=0;i<Value;i++){
Memo1->SelStart = 0;
Memo1->SelText=" ";
}



Сообщение отредактировано: LVI -


--------------------
still alive life
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Например, вот так:

AnsiString CombineStr(TStringList *sL)
{
AnsiString s = "";
for(int i = 0; i < sL->Count; i++) {
s += sL->Strings[i];
}
return s;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TCanvas* myCanvas = new TCanvas();
myCanvas->Handle = GetDC(Memo1->Handle); // Канва для вычисления ширины строки

// проходим по всем строками Memo
for(int i_line = 0; i_line < Memo1->Lines->Count; i_line++) {
TStringList* sL = new TStringList();

// разбиваем строки на слова и сохраняем слова в TStringList-е
ExtractStrings(TSysCharSet() << ' ', TSysCharSet(), Memo1->Lines->Strings[i_line].c_str(), sL);

// Работаем дальше только, если слов больше одного !!!
if(sL->Count > 1) {
int i = 0;
AnsiString str;
// Пока длина собранной из слов с добавленными к ним пробелами строки меньше,
// чем ширина TMemo, добавляем еще один пробел к следующему по порядку слову
while(myCanvas->TextWidth((str = CombineStr(sL)) + " ") + 12 < Memo1->Width) {
sL->Strings[i] = sL->Strings[i] + " ";

// увеличиваем индекс слова, на след ю итерации пробел будет добавлен
// след. слову в списке
i += 1;

// если пришли к последнему слову, то переходим опять на первое,
// потому что после последнего добавлять пробелы не нужно...
if(i >= sL->Count - 1) i = 0;
}
// все, строку выровнена по нужной ширине, ставим ее обратно в Memo...
Memo1->Lines->Strings[i_line] = str;
}
delete sL; // список можно удалить, с этой строкой мы закончили...
}
delete myCanvas; // все строки обработаны, удаляем канву, чтоб не было утечки памяти
}
Учти, если знаки препинания отделены от слова пробелом, они будут считаться отдельным словом, и пробелы будут добавляться между ними тоже!!!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Vitaliy

Репутация: -  0  +


Спасибо большое за алгоритм volvo , все понятно и работает как нужно good.gif
p.s. если бы не ты, я наверное еще 2 недели над этой частью курсового промаялся smile.gif

Сообщение отредактировано: LVI -


--------------------
still alive life
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.11.2020 23:17
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name