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; // все строки обработаны, удаляем канву, чтоб не было утечки памяти }
Учти, если знаки препинания отделены от слова пробелом, они будут считаться отдельным словом, и пробелы будут добавляться между ними тоже!!!