• =BuckLr= (07.01.08 23:39) [0]
    Как реализовать для edit контрола? Кто-нибудь знает? Я пробовал SetWindowLong с флагами WS_EX_LEFT, WS_EX_RTLREADING, WS_EX_LEFTSCROLLBAR, WS_EX_LAYOUT_RTL, но это имеет не совсем правильный эффект - каретка находится на противоположной стороне, т.е. так как будто включен обычный режим, не справа - налево.
  • Дмитрий К © (08.01.08 00:38) [1]
    WS_EX_NOINHERITLAYOUT ?
  • Дмитрий К © (08.01.08 00:56) [2]

    > Дмитрий К ©   (08.01.08 00:38) [1]
    >
    > WS_EX_NOINHERITLAYOUT ?

    Пардон, это я не про то.
    У меня каретка отображается справа если подключить манифест.
  • =BuckLr= (08.01.08 10:34) [3]

    > У меня каретка отображается справа если подключить манифест.

    Т.е.? Если установить WS_EX_LEFT, WS_EX_RTLREADING, WS_EX_LEFTSCROLLBAR и WS_EX_LAYOUT_RTL, то при отключенном манифесте каретка будет слева, а при подключенном - справа? Но такого не должно быть! В ВСЛ работает даже без подключенного манифеста.

    И ещё. За что отвечает WS_EX_NOINHERITLAYOUT?
  • Jon © (08.01.08 15:17) [4]
    EditBox.ExStyle := EditBox.ExStyle or WS_EX_RIGHT; ?
  • =BuckLr= (08.01.08 18:13) [5]

    > EditBox.ExStyle := EditBox.ExStyle or WS_EX_RIGHT;

    I tried to do so, but it don't work for me. What about you?
  • D[u]fa (08.01.08 18:20) [6]
    =BuckLr=, только что создал МСК проект. кинул на него едитбокс выставил TextAlign на taRight и все нормально. текст справа каретка там же. Прбовал и с манифестом и без него
  • =BuckLr= (08.01.08 18:23) [7]
    В общем... Я оперирую с richedit. там это сложнее... Имеется свойство RE_TextAlign но оно применяется к области форматирования. TextAlign кажется не работает для richedit.
  • D[u]fa (08.01.08 18:38) [8]
    тож не сложно:

    procedure RE_AlignText2(RichEdit: PControl; alignment: TTextAlign);
    var
     pf2: PARAFORMAT2;
    begin
     ZeroMemory(@pf2, SizeOf(pf2));
     pf2.cbSize     := SizeOf(PARAFORMAT2);
     pf2.dwMask     := PFM_ALIGNMENT;
     pf2.wAlignment := Byte(alignment) + 1;
     RichEdit.Perform(EM_SETPARAFORMAT, 0, Integer(@pf2));
    end;

    procedure TForm1.Button1Click(Sender: PObj);
    begin
     RE_AlignText2(RichEdit1, taCenter);
    end;
  • =BuckLr= (08.01.08 18:41) [9]
    Супер! Сейчас попробую. Спасибо! Надеюсь, это будет работать...
  • D[u]fa (08.01.08 18:42) [10]
    ну я ж проверил у себя =)
  • =BuckLr= (08.01.08 19:46) [11]
    К слову, D[u]fa. Ты не знаешь случаем, какие интерфейсы и как использовать для вставки объектов. Если я буду использовать olerichedit - там нужный интерфейс имеется.
  • =BuckLr= © (08.01.08 21:20) [12]
    Спасибо, D[u]fa. Работает!
  • D[u]fa (08.01.08 21:25) [13]
    =BuckLr=, насчет интерфейс хз даже. Я кроме как картинок через RTF ничего не вставлял =)
  • =BuckLr= © (08.01.08 21:30) [14]

    > Я кроме как картинок через RTF ничего не вставлял

    Да вот я тоже :) А в сях оно есть, но только я в сях полный дЭбил
  • =BuckLr= © (08.01.08 22:06) [15]
    Возникла проблема с другой стороны - мне кажется, что не работает TRichFmtArea - raWord. Т.е. если я устанавливаю область форматирования в raWord, то не происходит никаких изменений со словами, на которых расположен курсор. По-моему, глюк KOL
  • =BuckLr= © (09.01.08 01:18) [16]
    Между тем, D[u]fa, это можно было сделать при помощи RE_TextAlign. И имеется недостаток - если сделать такой BidiMode, то всё работает. но стоит только удалить весь текст, как каретка снова становится на левый край. Чувствую, что-то нужно делать не так... По крайней мере на VCL такое можно было сделать (и я делал) перекрытием создания контрола. Блин, ну как же сделать нормальный двунаправленный режим?
  • D[u]fa (09.01.08 10:48) [17]
    мда.. я вместо того чтоб найти встроенную RE_TextAlign изобрел велосипед))

    а как удаляешь весь текст?
  • D[u]fa (09.01.08 10:49) [18]
    собсно кажись понял... если текст в риче был, а потом сделали алигн и стерли его, то он восстанавливается. попробуй так:

     RichEdit1.Clear;
     RichEdit1.RE_TextAlign := raRight;

    вроде не соскакивает обратно
  • =BuckLr= © (09.01.08 14:15) [19]
    Ну да... Правда, это костыли. Сейчас ищу способ сделать это средствами api. Ведь на VCL как-то работает...
  • D[u]fa (09.01.08 15:55) [20]
    дык а чем не нравится способ то? по моему ниче не нормального нету в нем
  • =BuckLr= © (09.01.08 21:52) [21]
    Да, пока сделал так. Но вообще я думаю что VCL делает несколько иначе - я же смотрел исходники. Ну да ладно. Похоже, кроме нас с тобой тема больше никого не интересует, так что закрываем :)
  • =BuckLr= © (09.01.08 23:27) [22]
    D[u]fa, слушай сюда :)

    Прочитал на Королевстве Делфи ответ на похожий вопрос by Vasily Mulukov:


    > К сожалению, у тебя ничего не выйдет - все расширенные свойства окон > и Би-Ди моде поддерживаются только в локализованной (Арабской) версии
    > винды.


    Так что похоже я делал всё правильно, только вот винда сама не хотела устанавливать эти стили :)
  • =BuckLr= © (09.01.08 23:28) [23]
    Хотя странно... По идее, винда должна же поддерживать всякие тайские языки... Странно это всё
  • =BuckLr= © (09.01.08 23:47) [24]
    Блин, вот как надо-то было:

    const
      PFM_ALIGNMENT                       = $00000008;
      EM_SETPARAFORMAT                    = WM_USER + 71;
    var
     Paragraph: TParaFormat2;

    begin
     FillChar(Paragraph, SizeOf(Paragraph), 0);
     Paragraph.cbSize := SizeOf(Paragraph);
     with Paragraph do
     begin
       dwMask := PFM_ALIGNMENT;
       wAlignment := Ord(raRight) + 1;
     end;
     SendMessage(MFBox.Handle, EM_SETPARAFORMAT, 0, LPARAM(@Paragraph));

     Perform(CM_BASE + 60{CM_BIDIMODECHANGED}, 0, 0);
    end;



    И всё работает! Подгляел у RxLib
  • D[u]fa (10.01.08 16:13) [25]
    т.е после CM_BASE + 60 уже неважно стер текст или нет все работает нормально?
  • =BuckLr= © (10.01.08 19:56) [26]

    > все работает нормально?

    Да! Запиши на стикере. Пригодится!
Есть новые Нет новых   [134431   +10][b:0][p:0.002]