Из Дельфи в Билдер !!!
У меня такая вот проблема.Имеется код на Дельфи:
RichEdit;
procedure RE_SetLineSpacing(ARichEdit: TRichEdit; lineSpacing: Byte);
var
pf2: ParaFormat2;
begin
FillChar(pf2, SizeOf(pf2), 0);
pf2.cbSize := SizeOf(PARAFORMAT2);
pf2.dwMask := PFM_LINESPACING;
pf2.bLineSpacingRule := lineSpacing;
SendMessage(ARichEdit.Handle, EM_SETPARAFORMAT, 0, Longint(@pf2));
end;
//Example: Setlinespacing to 1:
procedure TForm1.Button1Click(Sender: TObject);
begin
RE_SetLineSpacing(RichEdit1, 1);
end;
Первое - это мне нужно срочняк перевести его на Си язык, но перевожу его так:
{
int Index = Form1->PageControl->ActivePageIndex;
PARAFORMAT2 *pf2;
memset(pf2, sizeof(pf2), 0);
pf2->cbSize = sizeof(PARAFORMAT2);
pf2->dwMask = PFM_LINESPACING;
pf2->bLineSpacingRule = LineSpacing;
SendMessage(RichEdit->Handle, EM_SETPARAFORMAT, 0, Longint(&pf2));
}
Использую так:
LineSpacing(Memos[Index], 1);//---Где мемос - RichEdit
Знаю, что что-то делаю не так, ведь при использовании кода выскакивает какой-то Еррор. Самое главное - я не могу найти достойную замену функции
FillChar.Кто знает Дельфи и Си - помогите пожалуйста новичку!!
2.Во вторых вместо FillChar можно использовать memset например.
3.Byte - такого типа нет в С++ - есть char
4.Если вы объявляете указатель на структуру - его нужно инициализировать (или использовать как объект) т.е. или:
pf->cbSize = sizeof(*pf);
...//и далее
либо
pf.cbSize = sizeof(pf);
...//и т.д.
5. Зачем здесь этот код? Вы ведь передаете в функцию конкретный контрол.
Я всё исправил на следующий код:
void LineSpacing (TRichEdit *RichEdit,char LineSpacing)
{
PARAFORMAT2 *pf2 = new(PARAFORMAT2);
memset(pf2, 0, sizeof(PARAFORMAT2));
pf2->cbSize = sizeof(PARAFORMAT2);
pf2->dwMask = PFM_LINESPACING;
pf2->bLineSpacingRule = LineSpacing;
SendMessage(RichEdit->Handle, EM_SETPARAFORMAT, 0, pf2);
delete pf2;
}
//-------------
Никаких ошибок нет, однако код свою задачу не выполняет. Теоритически я думал он будут задовать межстроковое расстояние - а он, пустой звук нажатия кнопки.
Может я опять что-то не так делаю??
Я всё исправил на следующий код:
//-------------
Никаких ошибок нет, однако код свою задачу не выполняет. Теоритически я думал он будут задовать межстроковое расстояние - а он, пустой звук нажатия кнопки.
Может я опять что-то не так делаю??
Опять не то делаешь.
Во первых прочитай хотябы здесь - подробно расписаны все параметры.
Для того что бы установить ширину промежутка код должен выглядеть так:
PARAFORMAT2 *pf2 = new(PARAFORMAT2);
memset(pf2, 0, sizeof(PARAFORMAT2));
pf2->cbSize = sizeof(PARAFORMAT2);
pf2->dwMask = PFM_LINESPACING;
pf2->bLineSpacingRule = 5;
pf2->dyLineSpacing = 60;
SendMessage(RichEdit1->Handle, EM_SETPARAFORMAT, 0, (LPARAM)pf2);
delete pf2;
установит тройной промежуток для выделенного фрагмента. Т.е. что бы применилось ко всему - надо выделить весь текст.
можно и к параграфу. Мне просто было проще выделить весь текст. :)
"скажите, а где у вас это?" (с) Рабинович
Что это? Где происходило? Какое отношение имеет буфер обмена к обсуждаемой теме - хз. Разве что копировать туда полностью все управляющие теги РТФ
ну и каким образом это вам поможет? Или сообщения оставляем по принципу - лишь бы сказать?
Форматирование применяется к конкретному контролу или хранится в конкретном документе - с использованием конкретных управляющих структур. Хоть вы сто невидимых контролов заведите.
поэтому скрыть от юзера эти визуальные шевеления и показать в это время табличку "please wait..." является неплохим шагом... делать невидимым на время просчета основной RichEdit как-то глупо, а вот в дополнительном невидимом само то имхо...
если вопрос стоял о повышении скорости, то стоит отказаться от инструментария ричедита, ворочать текст ручками и тока результат опять же выводить в ричедит...
вы вобще читали тему в которую вы пишите? Какие просчеты? Причем тут скорость?
Вариант теста 1:
Byte LinS;
LinS = 1;
TParaFormat2 *pf2 = new TParaFormat2;
memset(pf2,0,sizeof(PARAFORMAT2));
pf2->cbSize = sizeof(PARAFORMAT2);
pf2->dwMask = PFM_LINESPACING;
pf2->bLineSpacingRule = LinS;
SendMessage(R1->Handle,EM_SETPARAFORMAT,NULL,(LPARAM)pf2);
Byte f = SendMessage(R1->Handle,EM_GETPARAFORMAT,NULL,(LPARAM)pf2);
ShowMessage(f);
Результат - "255"
Тест 2:
memset(pf2,0,sizeof(PARAFORMAT2));
pf2->cbSize = sizeof(PARAFORMAT2);
pf2->dwMask = PFM_LINESPACING;
Byte f = SendMessage(R1->Handle,EM_GETPARAFORMAT,NULL,(LPARAM)pf2);
ShowMessage(f);
Результат теста: 255
Вывод: не может быть, т.к. в коде 1 и 2 расстояния были разными.
Что делать? И как узнать это рассояние в пикселях ?
Return Value
This message returns the value of the dwMask member of the PARAFORMAT structure.
Вообщем чтобы получить интервал, тебе нужно после вызова SendMessage с EM_GETPARAFORMAT, проверять поля bLineSpacingRule и dyLineSpacing структуры PARAFORMAT.
memset(pf2,0,sizeof(PARAFORMAT2));
pf2->cbSize = sizeof(PARAFORMAT2);
pf2->dwMask = PFM_LINESPACING;
unsigned char l = pf2->bLineSpacingRule;
SendMessage(R1->Handle,EM_GETPARAFORMAT,NULL,(LPARAM)pf2);
ShowMessage(l);
:) ??
unsigned char l = pf2->bLineSpacingRule;
memset( pf2, 0, sizeof(PARAFORMAT2) );
pf2->cbSize = sizeof(PARAFORMAT2);
pf2->dwMask = PFM_LINESPACING | PFM_SPACEAFTER;
SendMessage(RichEdit1->Handle, EM_GETPARAFORMAT, NULL, (LPARAM)pf2);
AnsiString strResult("");
strResult.sprintf("bLineSpacingRule %d, dyLineSpacing %d",
static_cast<int>(pf2->bLineSpacingRule), pf2->dyLineSpacing);
ShowMessage(strResult);
memset( pf2, 0, sizeof(PARAFORMAT2) );
pf2->cbSize = sizeof(PARAFORMAT2);
pf2->dwMask = PFM_LINESPACING | PFM_SPACEAFTER;
pf2->bLineSpacingRule =1 ;
SendMessage(R1->Handle, EM_SETPARAFORMAT, NULL, (LPARAM)pf2);
SendMessage(R1->Handle, EM_GETPARAFORMAT, NULL, (LPARAM)pf2);
AnsiString strResult("");
strResult.sprintf("bLineSpacingRule %d, dyLineSpacing %d",
static_cast<int>(pf2->bLineSpacingRule), pf2->dyLineSpacing);
ShowMessage(strResult);
// puncts/0.75
При установке pf2->bLineSpacingRule =1 ; Расстояние становится по выщитанным данным 12 пунктов. Пока буду работать с этим, но было бы круто, если бы всё-таки получилося нормально выщитывать... :(