Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Выравнивание текста по краям в Memo

Автор: LVI 11.05.2008 23:24

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


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


Автор: volvo 15.05.2008 15:47

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

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

Автор: LVI 15.05.2008 18:18

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

Автор: is neurontine commonly used with 3.10.2021 5:14

Zithromax Side Effects Elderly