Конференция "KOL" » Курсорные клавиши в Memo на форме внутри dll [Delphi, Windows]
 
  • Dmitry___ (12.04.07 12:23) [0]
    Привет. Что-то не пойму: почему курсорные клавиши нормально перемещают курсор в Memo, когда  Memo лежит на форме приложения, и не работают, когда Memo лежит на форме dll. Т.е. работают только клавиши вверх-вниз, а влево-вправо не обрабатываются, даже обработчик OnKeyDown не вызывается. В чём тут дело?
  • Dmitry___ (13.04.07 14:56) [1]
    Ау!

    Моржет, кто-то знает решение?
  • Dmitry___ (13.04.07 14:56) [2]
    Ау!

    Может, кто-то знает решение?
  • mdw © (13.04.07 17:54) [3]
    И не только мемо, но едит и т.д., и не только влево-вправо, но и таб. Если только Владимир не поленится разобраться с этим. Я в свое время ковырялся, но не к чему так и не пришел.
  • Dmitry___ (13.04.07 18:27) [4]
    Да, mdw, совершенно верно. Такая проблема имела место, когда я писал плагин на чистом WinAPI. Тогда я копал в цикле обработки сообщений, но ничего не добился.

    Владимир, помогите нам пожалуйста!
  • Vladimir Kladov (13.04.07 21:38) [5]
    Состряпайте минимальный пример VCL-приложение + memo в dll, как оно по-вашему будет. или достаточно бросить memo на тот пример, что есть в demo?
  • Dmitry___ (13.04.07 22:31) [6]
    ОК, Владимир, сейчас сделаю примерчик
  • Dmitry___ (13.04.07 23:35) [7]
    Так-так, выяснилились кое-какие подробности. В моём VCL-демо всё работает как надо... А в программе, для которой предназначена моя dll, возникает такая вот дурацкая проблема. Программа написана на сях. Именно в ней и проявляется эта бага с курсорными клавишами. Причём, в VCL-вариантах тех же плагинов, всё работает!

    Хорошо, ставим вопрос по другому. Кто знает\подозревает\догадывается, где тут лежат грабли? Может, и г.mdw выскажется по этому поводу? Что-то я не понимаю...
  • Vladimir Kladov (14.04.07 08:46) [8]
    Я открыл DemoModalVCLapp2KOLdll, бросил Memo, запустил. Все стрелки работают.
  • mdw © (14.04.07 10:15) [9]
    У меня была проблема со стрелками, когда KOL Panel c контролами из DLL встраивалась в VCL форму. Я так понял что проблема в конфликте двух обработчиках: Application и Applet. Правда почему вверх-вниз работают, а влево-вправо нет??
    Я тогда решил проблему использованием VCL:)).
  • Dmitry___ (14.04.07 12:09) [10]
    Блин, что же делать? Не охота как-то переделывать под VCL :( Плагин всего в пару сотен строк кода, и на KOL выходит 18 кб всего с упаковкой, а VCL раздует до 150 как минимум, и то с upx-ом... Ладно, решение буду искать по-тихоньку
  • Vladimir Kladov (14.04.07 12:47) [11]
    Наверное, вы не очень внимательно прочитали, что я написал. У вас просто что-то расходится с демой, причем существенно.
  • Dmitry___ (15.04.07 17:32) [12]
    Да нет, Владимир, я всё понял. Но дело не в этом. Я же делаю связку VCL+DLL с нуля, и всё работает. Потом гружу только что созданный и проверенный плагин в программу, для которой он предназначен, и всё возвращается к тому, с чего начали - клавиши влево-вправо не работают. Я подозреваю, что дело тут в обработке сообщений с клавиатуры, которую выполняет программа, под которой работает длл-ка. Видимо, эти сообщения уходят куда-то налево. С другой стороны, такой же плагин, написанный на VCL, работает как положено. Такая же ситуация наблюдалась, когда я писал плагин на api, я так и не понял, почему сообщения не доходят. Их просто нет, и всё. Не понимаю...
    Это я не к тому, что виноват KOL, вовсе нет, просто такая трабла уже достала порядком...
  • homm © (15.04.07 17:48) [13]
    > Такая же ситуация наблюдалась, когда я писал плагин на api

    а какая имеено, как в КОЛ или АПИ?
  • Vladimir Kladov (15.04.07 18:19) [14]
    Вообще-то, если форма из dll вызвана модально, то нужно ОЧЕНЬ постараться, чтобы перехватить сообщения из того цикла обработки сообщений, который запущен в dll. Даже сразу и не придумаешь, как такое СПЕЦИАЛЬНО устроить. Разве что хуками.
  • Vladimir Kladov (15.04.07 18:28) [15]
    Или хот-кеями, вот. Но это по меньшей мере странно, сажать хот-кей на стрелки влево-вправо. Хотя чего в жизни не бывает.

    Кстати, обратно хот-кей "отбить" можно как раз хуками. Т.к. в пределах одного приложения, то отдельная dll и глобальный хук не нужен, достаточно в пределах опять же приложения. В хуке можно замещать message на свой, при ловле в своем цикле снова возвращать его в правильное значение.
  • Dmitry___ (15.04.07 18:37) [16]

    > а какая имеено, как в КОЛ или АПИ?

    Она одна и та же - что в KOL, что в API не работают стрелочки.

    > если форма из dll вызвана модально

    Нет, там у меня форма рисуется на канве проги, т.е. прога сама вызывает из плагина процедуру, которая сама создаёт окно и прицепляет к родительскому с помощью SetParent. Окно встраивается в программу (а именно так все плагины и работают в этой программе). Затем регулярно вызывает процедуру Draw из плагина, которая перерисовывает окошко.
  • alex3 (15.04.07 22:05) [17]
    Бледнолицые любят наступать на грабли! Причем многократно.
  • Dmitry___ (15.04.07 22:17) [18]

    > Бледнолицые любят наступать на грабли! Причем многократно.

    К чему бы это, мой краснокожий брат?
  • alex3 (15.04.07 22:53) [19]
    Тут у нас, все нормально?

    function TControl.GetBoundsRect: TRect;
    var W: PControl;
       P: TPoint;
    begin
      Result := fBoundsRect;
      if fHandle <> 0 then
      begin
         GetWindowRect( fHandle, Result );
         if fIsControl or fIsMDIChild then
         begin
           W := fParent; // WindowedParent;
           if W <> nil then
           begin
             P.x := 0; P.y := 0;
             P := W.Client2Screen( P );
             OffsetRect( Result, -P.x, -P.y );
           end;
         end;
         fBoundsRect := Result;
      end;
    end;

    Какое отношение имеет  " W := fParent; // WindowedParent;", к новому, чужому, паренту?
    И зачем нам "P := W.Client2Screen( P );", координаты старого?
    Не в этом ли причина?
  • alex3 (15.04.07 23:02) [20]
    ===К чему бы это, мой краснокожий брат?
    Вопрос поднимался и раньше, я решал подобную проблему средствами АПИ.
    А заглянуть в кол, никто не хочет.
  • Dmitry___ (15.04.07 23:58) [21]

    > я решал подобную проблему средствами АПИ


    Ух ты! А не поделишься рецептом на мыло, али прямо тут? Мне тоже хоца сделать это на апи, ой как хоца!

    За подсказку спасибо, гляну...
  • Alex3 (16.04.07 14:23) [22]
    OK!
  • имя (08.08.07 20:33) [23]
    Удалено модератором
  • имя (03.10.07 11:50) [24]
    Удалено модератором
  • Dawn-yi (27.11.07 10:46) [25]
    Удалено модератором
  • Golem (30.11.07 20:35) [26]
    Удалено модератором
  • имя (12.12.07 04:10) [27]
    Удалено модератором
  • имя (12.12.07 11:34) [28]
    Удалено модератором
  • имя (12.12.07 18:10) [29]
    Удалено модератором
  • имя (25.12.07 02:36) [30]
    Удалено модератором
  • имя (10.01.08 19:18) [31]
    Удалено модератором
  • имя (21.01.08 00:24) [32]
    Удалено модератором
  • имя (28.01.08 18:01) [33]
    Удалено модератором
 
Конференция "KOL" » Курсорные клавиши в Memo на форме внутри dll [Delphi, Windows]
Есть новые Нет новых   [134431   +12][b:0][p:0.001]