1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Подскажите пожалуйста, как можно выровнять текст по ширине в Memo используя для этого вставку дополнительных пробелов между словами? То есть пробелы надо вставлять только тогда когда строка меньше текущей ширины Memo, а если строка больше то не уместившиеся часть строки переносится на новую (WordWrap выставлен в "true") И еще такой вопрос: как задать параметры абзаца в Memo для указанной строки? К примеру для первой строки код следующий:
int Value = StrToInt(OKRightDlg->CSpinEdit2->Text);
for(int i=0;i<Value;i++){
Memo1->SelStart = 0;
Memo1->SelText=" ";
}
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; // все строки обработаны, удаляем канву, чтоб не было утечки памяти
}
Учти, если знаки препинания отделены от слова пробелом, они будут считаться отдельным словом, и пробелы будут добавляться между ними тоже!!!