Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Из Дельфи в Билдер !!!

26K
28 сентября 2008 года
dufifa
56 / / 21.08.2008
Здарова усе!!
У меня такая вот проблема.Имеется код на Дельфи:
Код:
uses
   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;

Первое - это мне нужно срочняк перевести его на Си язык, но перевожу его так:
Код:
void LineSpacing (TRichEdit *RichEdit,Byte LineSpacing)
{
   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.Кто знает Дельфи и Си - помогите пожалуйста новичку!!
1
28 сентября 2008 года
kot_
7.3K / / 20.01.2000
1.Во первых - какакя ошибка появляется?
2.Во вторых вместо FillChar можно использовать memset например.
3.Byte - такого типа нет в С++ - есть char
4.Если вы объявляете указатель на структуру - его нужно инициализировать (или использовать как объект) т.е. или:
 
Код:
PARAFORMAT2 *pf = new PARAFORMAT2;
pf->cbSize = sizeof(*pf);
...//и далее

либо
 
Код:
PARAFORMAT2 pf;
pf.cbSize = sizeof(pf);
...//и т.д.

5. Зачем здесь этот код? Вы ведь передаете в функцию конкретный контрол.
 
Код:
int Index = Form1->PageControl->ActivePageIndex;
26K
29 сентября 2008 года
dufifa
56 / / 21.08.2008
Да уже нет никакой ошибки:
Я всё исправил на следующий код:
Цитата:

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;
}


//-------------
Никаких ошибок нет, однако код свою задачу не выполняет. Теоритически я думал он будут задовать межстроковое расстояние - а он, пустой звук нажатия кнопки.
Может я опять что-то не так делаю??

1
29 сентября 2008 года
kot_
7.3K / / 20.01.2000
Цитата: dufifa
Да уже нет никакой ошибки:
Я всё исправил на следующий код:

//-------------
Никаких ошибок нет, однако код свою задачу не выполняет. Теоритически я думал он будут задовать межстроковое расстояние - а он, пустой звук нажатия кнопки.
Может я опять что-то не так делаю??


Опять не то делаешь.
Во первых прочитай хотябы здесь - подробно расписаны все параметры.
Для того что бы установить ширину промежутка код должен выглядеть так:

 
Код:
RichEdit1->SelectAll();
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;

установит тройной промежуток для выделенного фрагмента. Т.е. что бы применилось ко всему - надо выделить весь текст.
26K
29 сентября 2008 года
dufifa
56 / / 21.08.2008
Ура!!Получилось.Спасибо...и сайт классный, нужно почитать!Вот ,вправду незнаю, будет ли эта вышесказанная х..рь не ко всему тексту а к выделенному тексту т.е. параграфу применяться???
1
29 сентября 2008 года
kot_
7.3K / / 20.01.2000
Цитата: dufifa
Ура!!Получилось.Спасибо...и сайт классный, нужно почитать!Вот ,вправду незнаю, будет ли эта вышесказанная х..рь не ко всему тексту а к выделенному тексту т.е. параграфу применяться???


можно и к параграфу. Мне просто было проще выделить весь текст. :)

40K
29 сентября 2008 года
Walain
17 / / 23.08.2008
А как сделать так, что это с текстом в буфере происходило?
1
30 сентября 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Walain
А как сделать так, что это с текстом в буфере происходило?


"скажите, а где у вас это?" (с) Рабинович
Что это? Где происходило? Какое отношение имеет буфер обмена к обсуждаемой теме - хз. Разве что копировать туда полностью все управляющие теги РТФ

1
30 сентября 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Anton Chik
заведи дополнительно невидимый ричедит, работай с ним, а в свой тока результаты выводи... ну и, соответственно, не забывай про обратную связь)


ну и каким образом это вам поможет? Или сообщения оставляем по принципу - лишь бы сказать?
Форматирование применяется к конкретному контролу или хранится в конкретном документе - с использованием конкретных управляющих структур. Хоть вы сто невидимых контролов заведите.

26K
30 сентября 2008 года
dufifa
56 / / 21.08.2008
да и не сильно нужно это по сути дела....немного времени поубавит...немного. А невидимый RichEdit в данной задачи действительно не поможет...Если хотите, то чуть выше сделайте кнопочку или ComboBox со списком задания междустрочного расстояния...и полезно и мучаться не надо....(бесполезно мучаться не надо)....
1
01 октября 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Anton Chik
... ясно понятно я не имел в виду какие-то выигрыши в скорости... и не думаю что Walain под буфером подразумевал что-то подобное... все знают как долго порой ворочаются визуальные компоненты... сам сталкивался и выглядит при больших объемах инфы всё это не совсем красиво...

поэтому скрыть от юзера эти визуальные шевеления и показать в это время табличку "please wait..." является неплохим шагом... делать невидимым на время просчета основной RichEdit как-то глупо, а вот в дополнительном невидимом само то имхо...

если вопрос стоял о повышении скорости, то стоит отказаться от инструментария ричедита, ворочать текст ручками и тока результат опять же выводить в ричедит...


вы вобще читали тему в которую вы пишите? Какие просчеты? Причем тут скорость?

7.4K
02 ноября 2009 года
T...H
159 / / 28.12.2008
надо узнать межстроковое расстояние.
Вариант теста 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:

Цитата:
TParaFormat2 *pf2 = new TParaFormat2;
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 расстояния были разными.
Что делать? И как узнать это рассояние в пикселях ?

288
03 ноября 2009 года
nikitozz
1.2K / / 09.03.2007
Ну вообще-то
Цитата:

Return Value
This message returns the value of the dwMask member of the PARAFORMAT structure.



Вообщем чтобы получить интервал, тебе нужно после вызова SendMessage с EM_GETPARAFORMAT, проверять поля bLineSpacingRule и dyLineSpacing структуры PARAFORMAT.

7.4K
03 ноября 2009 года
T...H
159 / / 28.12.2008
И там и там получаем NULL, пример одного из кода:
Цитата:
TParaFormat2 *pf2 = new TParaFormat2;
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);


:) ??

288
03 ноября 2009 года
nikitozz
1.2K / / 09.03.2007
Получать значения надо после вызова SendMessage, а не до.
 
Код:
SendMessage(R1->Handle,EM_GETPARAFORMAT,NULL,(LPARAM)pf2);
unsigned char l = pf2->bLineSpacingRule;
7.4K
03 ноября 2009 года
T...H
159 / / 28.12.2008
Всё равно NULL )) :(
288
04 ноября 2009 года
nikitozz
1.2K / / 09.03.2007
Держи рабочий код
 
Код:
TParaFormat2 * pf2 = new TParaFormat2;
    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);
7.4K
04 ноября 2009 года
T...H
159 / / 28.12.2008
Спасибо большое за пример работы с printf, но у меня в ShowMessage и там и там 0 ))) Может в Vista библиотеки другие, в часности Richedit ?
7.4K
04 ноября 2009 года
T...H
159 / / 28.12.2008
Лана, вот код:
Цитата:
TParaFormat2 * pf2 = new TParaFormat2;
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 пунктов. Пока буду работать с этим, но было бы круто, если бы всё-таки получилося нормально выщитывать... :(

288
04 ноября 2009 года
nikitozz
1.2K / / 09.03.2007
Ну собственно все правильно. Скорее всего в первом случае у тебя показывает нули просто потому, что в параграфе межстрочный интервал стоит одинарный.
7.4K
04 ноября 2009 года
T...H
159 / / 28.12.2008
Да, но если выставлять pf2->bLineSpacingRule >2 то ваще ничего не меняется!!! Тока если 1 или 2 - тогда ваще много... :(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог