Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5

Модерирует : ShIvADeSt

ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 4

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).

Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 28-06-2009 | Исправлено: psa1974, 12:00 02-02-2010
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VMan80
    Я рад, что получилось.

    Цитата:
    в целях ускорения построения дерева каталогов, у меня новый уровень строился только при его раскрытии

    Ну а вот если бы ты это сказал с самого начала... получилось бы быстрее. Среди нас тут вроде как телепатов нету...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 11:02 29-11-2009
    snike555



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974
     

    Цитата:
    snike555  
     
    Цитата:
    функция AnsiStrLIComp - юникод аналог кто-нибудь подскажет
     
    ничего военного, взято из Дельфи 2010, смотри за #  

     
    Не попнял, где смотреть?

    Всего записей: 380 | Зарегистр. 02-10-2009 | Отправлено: 15:21 29-11-2009
    ppkp

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    snike555
    Нажмите в интересующем Вас сообщении на "Редактировать"

    Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 15:47 29-11-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    snike555
    на всякий случае еще вот объявление используемой внутри функции AnsiStrLIComp функции CompareStringW:

    Код:
     
    function CompareStringW(Locale: LCID; dwCmpFlags: DWORD; lpString1: PWideChar;
      cchCount1: Integer; lpString2: PWideChar; cchCount2: Integer): Integer; stdcall;

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 17:29 29-11-2009
    snike555



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974

    Цитата:
    на всякий случае еще вот объявление используемой внутри функции AnsiStrLIComp функции CompareStringW:  

     
    Спасибо, как-то не заметил что там WideChar есть, нужно будет повторно проверить почему у меня не работало.

    Всего записей: 380 | Зарегистр. 02-10-2009 | Отправлено: 19:05 29-11-2009
    MikhR

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Люди помогите с Делфи...
    в общем есть ехлибовский грид , включена опция multiSelect.
    при добавлении новой строки выделялся весь грид!  
    в Ехлиб 3.6 была исправлено следующим образом - на событие OnSelectionChanged было навешано условие SelectedRows.Clear
    и все работало.
     
    Вот на днях поставил новый ехлиб и теперь при попытке добавить строку - из этого события OnSelectionChanged  не выходит - зацикливается...
    ЗЫ помогите новичку )

    Всего записей: 9 | Зарегистр. 01-02-2007 | Отправлено: 13:50 30-11-2009
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребята, подскажите, как программным способом скроллировать TRichEdit? У меня два окна с текстами: один TRichViewEdit (Сергея Ткаченко) и второй стандартный TRichEdit. Мне нужно скроллировать по вертикали второй в зависимости от первого. Но в первом, понятно, длина по вертикали указана. Теперь мне надо скролливать второй в процентном, так сказать, соотношении от первого. То есть как-то узнать высоту по вертикали текста в TRichEdit. Как все это можно сделать?

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 14:06 30-11-2009
    ppkp

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста, где взять самый простой парсер строки.  TParser в Delphi всем хорош, но воспринимает символ '(' как разделитель, и пока победить это не удалось.

    Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 15:41 30-11-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ppkp
    Попробуй регулярные выражения. По началу трудно, но потом понимаешь, что это - сила. Можно взять TPerlRegEx
    в теме Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus, можно более простой TRegExpr, в инете полно ссылок...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 16:03 30-11-2009
    ppkp

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо, взял TRegExpr Сорокина.

    Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 18:12 30-11-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
    Скроллировать надо построчно или плавно?

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 20:41 30-11-2009
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    плавно

    так было бы лучше

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 21:04 30-11-2009
    snike555



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    а что если скролбары отдельно повесить и ими уже управлять?

    Всего записей: 380 | Зарегистр. 02-10-2009 | Отправлено: 21:12 30-11-2009
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974
    snike555
    Насколько я понимаю, тут должны использоваться винапишные функции, но я не знаю, какие.

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 22:10 30-11-2009 | Исправлено: DmitryKz, 22:11 30-11-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz

    Цитата:
    Насколько я понимаю, тут должны использоваться винапишные функции

    Ага ж и  сообщения тоже . По другому никак.

    Цитата:
    так было бы лучше

    Безусловно, плавная прокрутка - лучше, например так:

    Код:
     
    const
      EM_GETSCROLLPOS = WM_USER + 221;
      EM_SETSCROLLPOS = WM_USER + 222;
     
    procedure TForm4.Timer1Timer(Sender: TObject);
    var
      pt: TPoint;
      si: TScrollInfo;
      i: Integer;
    begin
      si.cbSize:= SizeOf(TScrollInfo);
      si.fMask:= SIF_PAGE or SIF_POS or SIF_RANGE;
      GetScrollInfo(RichEdit1.Handle, SB_VERT, si);
      if ((si.nPage > 0) and (si.nPos + si.nPage < si.nMax)) then
      // nPage - размер страницы текста  в пикселях
      // nMax - размер всего текста в пикселях
      begin
        SendMessage(RichEdit1.Handle, EM_GETSCROLLPOS, 0, LPARAM(@pt));
        pt.Y:= pt.Y+ SpinEdit1.Value;
        SendMessage(RichEdit1.Handle, EM_SETSCROLLPOS, 0, LPARAM(@pt));
      end;
    end;
     

    Но тут есть одно серьезное ограничение: высота всего прокручиваемого текста в пикселях не должна превышать 65535 пикселей.
    Кстати, в Дельфи штатно эти сообщения (EM_GETSCROLLPOS и EM_SETSCROLLPOS) не описаны видимо из-за этих ограничений.
    Ну и каретка в этом примере не перемещается...
     
    Добавлено:
    DmitryKz
    Если же скроллировать построчно, этого ограничения нет:
    // Крутим текст построчно:
        SendMessage(RichEdit1.Handle, EM_SCROLL, SB_LINEDOWN, 0);
     
    ЗЫ: Когда-то писал плагин для Akelpad, который при нажатии Ctrl+Down/Up выполняет скроллинг текста по аналогии с дельфийским редактором. Если надо, могу кинуть исходники, там все прокомментировано
     
    ЗЫ2: А вообще RichEdit - геморный элемент управления, все в нем сделано через задницу, особенно этот самый скроллинг.

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 22:47 30-11-2009 | Исправлено: psa1974, 23:07 30-11-2009
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974

    Цитата:
    Если надо, могу кинуть исходники, там все прокомментировано  

    Конечно, буду очень признателен

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 23:04 30-11-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
    Тут Ссылка и исходники и сам плагин - можно попробовать в деле (а папке Docs лежит описание)  Что касается исходников - то самое главное место - оконная процедура function NewEditProc(.......): LRESULT; stdcall; - она вызывается редактором для обработки сообщений, и тут то я все и делаю, а конкретно в вспомогательной процедуре RichEditCommonProc.  
    Редактор Akelpad существует в 2 вариантах - версия 4 с использованием своего собственного окна редактирования (надо по тексту проверять флаг bAkelEdit = true) и  версия 3 с использованием RichEdit (флаг bAkelEdit = false), это то, что как раз и надо. Просто сказал об этом, чтоб не запутаться, потому что плагин реализован для обоих вариантов Akelpad

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 23:25 30-11-2009
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 23:30 30-11-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Еще небольшое уточнение по Дельфи и RichEdit (на всякий, вдруг понадобится): сообщение  EM_SCROLLCARET описано в двух модулях:  

    • RichEdit.pas: EM_SCROLLCARET = WM_USER + 49;
    • Messages.pas: EM_SCROLLCARET = $00B7;  

    причем, как видно, по разному . Так вот, правильно оно описано только в модуле Messages.pas. если использовать описание из RichEdit.pas, то оно работать не будет. Чтоб не зависеть от порядка объявления модулей, лучше явно писать в месте использования: Messages.EM_SCROLLCARET

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 23:33 30-11-2009
    SIgor33

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как определить SID локального пользователя ПК в текстовом виде?

    Всего записей: 652 | Зарегистр. 03-03-2009 | Отправлено: 13:37 01-12-2009
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5
    ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru