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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Zithromax Side Effects Elderly
 К началу страницы 
+ Ответить 

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

 



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