Конференция "KOL" » Версия 3.10 [Delphi]
 
  • Vladimir Kladov © (13.02.11 19:32) [0]
    Новости от 13 феврала 2011 (KOL & MCK v3.10)

    [+]  MCK: добавлено свойство TKOLForm.AssignTextToControls (если установить в False, то свойства Caption, Text, и другие, текстовое значение которое присваивается в коде, сгенерированном MCK, не присваивается или присваивается пустая строка - может использоваться для экономии кода в случае, когда этот текст все равно устанавливается своим кодом, например, с целью локализации на конкретный язык, с помощью собственного локализатора). Для TKOLCombobox и TKOLListBox добавлены свойства AlwaysAssignItems, значение которого true позволяет игнорировать эту установку для всей формы - в отношении элементов списка.  VK

    [-]  MCK: множество исправлений для FormCompact.  VK

    [*]  TControl.Tabulate (asm версия) изменен.  VK
  • Jon © (14.02.11 02:19) [1]
    Error in KOL_ASM.inc - it breaks Tabulate when the SHIFT key is down (reverse order).
  • Jon © (14.02.11 02:29) [2]
    Add the following lines in bold to KOL_ASM.inc:


    function Tabulate2Control( Self_: PControl; Key: DWORD; checkOnly: Boolean ): Boolean;
    ...
           PUSH     VK_SHIFT    // LINE 8641
           CALL     GetKeyState
           CWDE
           XCHG EDX, EAX
           POP      EDX
    ....

  • Jon © (14.02.11 02:51) [3]
    Sorry - my fix was incorrect. This is the correct one:


           JNZ      @@test_flag    // LINE 8638

           PUSH     ECX
           PUSH     EAX
           PUSH     VK_SHIFT
           CALL     GetKeyState
           CWDE
           XCHG EDX, EAX
           POP      EAX
           POP      ECX

           TEST     EAX, EAX



    I don't know assembler so it may not be right - but it works.
    Can anyone provide some useful documents for learning asm?
  • Vladimir Kladov © (14.02.11 04:37) [4]
    This was a very big problem on my computer due a hardware trouble with 255 key code. I remembered why there was -1 in a list of keys in asm version, but I just had to fix this for a moment. I suppose that there are no many people now use SHIFT+TAB, thank you that you catch this. I'll think how to solve the problem to the next update.
  • Vladimir Kladov © (14.02.11 05:43) [5]
    One thing. It may be very strange, but in my case anyway only GetAsyncKeyState works now. In step-by-step debugger, GetKeyState works too. Strange.

    And certainly, MOV EDX, ECX before calling Tabulate2Next is forgotten.
  • Vladimir Kladov © (14.02.11 08:43) [6]
    OK now I see that GetKeyState returns short int. And now see your CWDE instruction. Fixed version will be in the evening.
  • QAZ (14.02.11 12:49) [7]
    а можно еще сделать чтобы возможность чеканутости кнопок тулбара определялась в мск отдельным свойством а не самой чеканутостью
    иначе приходица их чекать в дизайне а потом расчекивать при запуске програмы
    надеюсь понятно объяснил...
  • Jon © (14.02.11 13:14) [8]

    > This was a very big problem on my computer due a hardware trouble with 255 key code.


    Ah, the problem that you reported here:  WM_KEYUP 255 (http://pda.delphimaster.net/?id=1284277474&n=10)

    I recently saw a similar problem. The computer had a rootkit. Maybe you do too. I found and fixed it with RootRepeal (http://rootrepeal.googlepages.com/).


    > I suppose that there are no many people now use SHIFT+TAB


    Really? I use the keyboard all of the time so the SHIFT+TAB issue was a big one for me.

    I would love to see KOL natively handle CTRL+TAB for TabControl, it would save using the keyboard hook workaround.
  • Vladimir Kladov © (14.02.11 15:39) [9]
    Last time I repaired it just reinstalling all the drivers. So I think this is not a rootkit. Hm, this rootrepeal seems not working on Wn 7: DeviceIO Error.

    I use the keyboard all of the time but me and many people I saw use mouse more often then keyboard (to switch between controls). And they are right, in some cases it seems the only method to switch between controls (e.g. in Delphi Run|Parameters it is very hard to select a combobox with parameters and clear it with a keyboard only). If there are a lot of controls it could be faster to get a mouse and click a certain one then to press the Tab key and wait until it becomes focused.

    I always try to simplify using the keyboard in my programs (if I publish it or use it often), but other developers seems not do that so. So controls have strange TabOrder and switching via keyboard becomes hard.

    2QAZ ДА, это можно, наверное. Самому хотелось. В принципе, на уровне KOL это было решено, надо было передать префикс, не помню какой. Гляну сегодня.
  • Vladimir Kladov © (14.02.11 16:41) [10]
    2QAZ: начал смотреть и "вспомнил": давно уже есть, надо только выставить radioGroup <> 0. Главное ведь что, и в прошлый раз так "вспомнил", и использовал, и опять забыл. Сейчас добавлю свойство Checkable с выдачей подсказки. Чтобы уже не забыть.
  • Vladimir Kladov © (14.02.11 17:11) [11]
    3.11 is on the site.
  • Jon © (14.02.11 21:21) [12]
    I compared MCK 3.10 with MCK 3.11 - the zip contents are identical except for mirror.pas line 22 (VERSION 3.1x). Did you omit the changes or a changed file?

    Hm, this rootrepeal seems not working on Win 7: DeviceIO Error.


    32bit or 64bit? There is a beta that I can send to you.
  • Vladimir Kladov © (15.02.11 04:41) [13]
    This is so because I changed mckCtrls.pas but forget to pack it. Now I reuploaded mck.zip. Anyway it does not contain anything serious except a joking message in response to attemt to change new property Checkable for toolbar button.

    x86. I have no any reason to use 64 bit Windows now and in near future several years.
  • QAZ (15.02.11 11:24) [14]

    > давно уже есть, надо только выставить radioGroup <> 0.

    это получаеца група зависимых переключателей
    а если нужно все кнопки с независимым чек\расчеком тогда несрост полный
  • Vladimir Kladov © (15.02.11 17:37) [15]
    Каждой отдельную радиогруппу и все.

    А про выравнивание по вертикали никто что-то не пожаловался. Я первый заметил. Сегодня выложу поправочку.
  • Awkward © (15.02.11 17:50) [16]
    Извините, я не совсем понял, у меня мозги кипят или реально ошибка.
    Пытаюсь сделать в программе ResetEvent(idx_fOnClick) = всё ок
    но как только совершаю клик после этого - вылетает с ошибкой.
    смотрю код:

    procedure TControl.ResetEvent(idx: Integer);
    begin TMethod( EV.MethodEvents[idx] ).Code := DummyProcTable[ InitEventsTable[ idx ] ];
         TMethod( EV.MethodEvents[idx] ).Data := nil;
    end;



    InitEventsTable дает (idummy123   + idummy123_0 shl 4) = (0+ 2 shl 4) = 16(!)
    но DummyProcTable: array[ 0..11 ] of Pointer (!!!)

    т.е. получается, что происходит выход за границы таблицы.
    т.е. "shl 4" в формуле выше, получается, ненужно?
  • Vladimir Kladov © (15.02.11 18:54) [17]
    По-моему, там у меня маскирования индекса не хватает. Сейчас посмотрю получше.
  • Vladimir Kladov © (15.02.11 19:05) [18]
    Точно, оно самое. Выложил обновление.

    Код ResetEvent проверял, но до того, как "придумал" в том же байте индекса в InitEventsTable хранить индекс для второй группы внутренних обработчиков. Сейчас добавил маску, проверил, работает.

    Правильный код:
    procedure TControl.ResetEvent(idx: Integer);
    begin TMethod( EV.MethodEvents[idx] ).Code := DummyProcTable[ InitEventsTable[ idx ] and $F ];
         TMethod( EV.MethodEvents[idx] ).Data := nil;



    (подчеркнутое добавлено)

    Версия 3.12+ на сайте. Сейчас описание изменений поправлю.
  • Jon © (16.02.11 05:10) [19]
    With KOL v3.12+ there is an error using both TextAlign and VerticalAlign together:


    program Test;

    uses KOL;

    procedure MouseDoubleClick(Dummy: Pointer; Sender: PControl; var Mouse: TMouseEventData);
    begin
     ShowMessage('OK!');
    end;

    procedure MouseDownDrag(Dummy: Pointer; Sender: PControl; var Mouse: TMouseEventData);
    begin
     Sender.{Form}Parent{Form}.DragStart;
    end;

    begin
     Applet := NewForm(Applet,'');
     with NewLabel(Applet,'Drag then double click')^ do
     begin
       SetAlign(caClient);
       TextAlign := taCenter;   // <-- ERROR!
       VerticalAlign := vaTop;  // <-- ERROR!
       Color := clRed;
       OnMouseDown := TOnMouse(MakeMethod(nil,@MouseDownDrag));
       OnMouseDblClk := TOnMouse(MakeMethod(nil,@MouseDoubleClick));
     end;
     Run(Applet);
    end.



    The events are never triggered. Comment one or both error lines and it works.
  • Vladimir Kladov © (16.02.11 15:44) [20]
    KOL_asm.inc, line 8909:         AND      DH, $F3
    instead of AND DH, CL

    I'll upload the fix soon.
  • Santa (16.02.11 17:12) [21]
    Не понятен случай в следующем коде:


    var
     Panel:TKOLPanel;
     ComboBox:TKOLComboBox;
    begin
       Panel:=NewPanel(Page,esSolid).SetAlign(caTop).SetBorder(0).SetSize(0,28);
     ComboBox:=NewComboBox(Panel,[coNoIntegralHeight,coOwnerDrawFixed]).SetAlign(caLe ft);
    //  ComboBox.Color:=TColor(clWindow);
    //  ComboBox.Add('Тест');
    end
    ...



    Если ракоментировать хоть одну строку, то  ComboBox не отображается, хотя код аналогичен формируемому *.inc-файлу MCK-компонентом.
    Delphi 7, XP SP3, как в PAS, так и ASM-версиях.
  • Santa (16.02.11 17:41) [22]
    Извиняюсь, разобрался.
    Только не совсем понятен момент, почему после минимизации формы и востановления под компонентом ComboBox остается какой-то глюк прорисовки?
  • Santa (16.02.11 17:45) [23]
    Глюк остается из-за свойства

    Align:=caLeft


    Видно он перерисовывается и уменьшается. Можно ли это пофиксить?
  • Vladimir Kladov © (16.02.11 18:49) [24]
    Нет. Комбобокс нельзя выравнивать влево, вправо и по клиенту. Положите его на отдельную панель с выравниванием caTop, панель выравнивайте как требуется.

    Надо будет хотя бы в MCK предупреждения добавить.
  • Jon © (16.02.11 20:47) [25]
    Problem with StrRepeat when UNICODE_CTRLS is defined:


    program Test;

    uses KOL;

    begin
     Applet := NewForm(nil, '');
     NewLabel(Applet,StrRepeat('.',20));
     Run(Applet);
    end.



    I suggest this change to KOL.PAS:


    function StrRepeat( const S: KOLString; Count: Integer ): KOLString;
    var I, L: Integer;
    begin
     L := Length( S );
     SetLength( Result, L * Count );
     for I := 0 to Count-1 do
       Move( S[ 1 ], Result[ 1 + I * L ], L * Sizeof( KOLChar ) );
    end;

  • Vladimir Kladov © (17.02.11 16:47) [26]
    3.14 is on the site. I also added an asm version for this function (and for WStrRepeat). Even for UNICODE_CTRLS, there is a partial asm version there (for the most inner loop which is implemented with a single assembler instruction).
  • QAZ (19.02.11 14:15) [27]
    незнаю как здесь, но в версии какой пользуюсь метод Close зачемто сделан через Postmessage !!!

    procedure TControl.Close;
    begin
     PostMessage( Handle, WM_CLOSE, 0, 0 );
    end;


    что может стать причиной вылетов изза уже отсуттвующих объектов
    например если так:

    procedure TForm1.KOLForm1Close(Sender: PObj; var Accept: Boolean);
    begin
    Accept:=good;
    Form4.Form.Close; //закрываем доп форму
    //освобождаем всяко разно
    ..................
    end;


    Form4 закроеца только после уничтожения Form1 и всего что в очереди
    а там и всевозможные глюки при доступе из Form4.Close к уже освобожденым в Form1.Close  ресурсах например

    вобщем надо на sendmessage заменить :)
  • Vladimir Kladov © (19.02.11 14:47) [28]
    //освобождаем всяко разно
    ..................



    Освобождать всяко-разно надо в OnDestroy, а не в OnClose. В OnClose имеет смысел инициировать остановку потоков, выполнить какие-то предварительные действия. Вообще, основное назначение - ответить на Accept.

    А вот если сейчас сделать как вы предлагаете, а не так, как спокон веков было, то тут же полезут странности в уже разработанных приложениях, если их пересобрать. Например, могут возникнуть дедлоки с потоками, которые в момент завершения будут пытаться выполнить что-нибудь через Synchronize.
  • QAZ (19.02.11 15:07) [29]

    > Освобождать всяко-разно надо в OnDestroy, а не в OnClose.
    >  В OnClose имеет смысел инициировать остановку потоков,
    > выполнить какие-то предварительные действия. Вообще, основное
    > назначение - ответить на Accept.

    так я так и делаю, нетак выразился просто ,но факт в том что очередь до form4 доходит только после close и Destroy главной формы
    те в любом случае я дочернии формы должен сначала закрыть вручную
    хотя по нормальному сам кол при закрытии главной формы должен сначала автоматом закрывать все дочерние формы
    незнай у кого как,но уменя слово "close" ассоциируеца с НЕМЕДЛЕННЫМ закрытием иначе название должно быть типа "closequery"
  • Vladimir Kladov © (19.02.11 16:53) [30]
    Perform( WM_CLOSE сами можете сделать. Дочерних форм не бывает, это условность. Если бы формы действительно были дочерними, обработчик Windows по умолчанию первый разослал бы WM_CLOSE всем дочерним. Мало ли какие у кого ассоциации: в Windows WM_CLOSE выполняет роль запроса к коду, можно ли сейчас закрыть окно, см. MSDN::

    An application can prompt the user for confirmation, prior to destroying a window, by processing the WM_CLOSE message and calling the DestroyWindow function only if the user confirms the choice.

    By default, the DefWindowProc function calls the DestroyWindow function to destroy the window.




    Реально закрывает форму WM_DESTROY, от него уже нельзя отказаться.
  • Dufa © (19.02.11 17:59) [31]
    Как раз насчет OnDestroy и хочу написать.. он перестал работать собсно.. Делаю пустой проект, назнчаю обработчику следующий код:

    procedure TForm1.KOLFormDestroy(Sender: PObj);
    begin
     MsgOK('KOLFormDestroy');
    end;



    при закрытии мессаджа нету
  • Dufa © (19.02.11 18:21) [32]
    Посмотрел в хистори... в версии 3.0.Y в процедуре TerminateExecution в конце был App.RefDec; потом он закомментился зачем то.. если раскомментить - работает
  • QAZ (19.02.11 19:12) [33]
    to Vladimir Kladov
    это понятно что понятия понятиями,но темнеменее PostMessage это негодица однозначно
    то что возможны косяки в старых прогах, так это скорей врятли,потому что те кто использовал вызовы типа Form.Close всетаки были уверены что им надо ее закрыть\запросить закрытие именно сейчас,а не когда очередь дойдет и нужные объекты уже освобождены
    каждый апгрейд самого кола несет в себе столько исправлений в софте, что Form.Close просто ничто по сравнению с этим

    т.е. я не спорю для чего нужно close или Destroy и что когда и для чего вызывать
    я против конкретно PostMessage ибо здесь она источник неуловимых косяков, и должна использоваца в особых специфических случаях
  • Vladimir Kladov © (19.02.11 19:13) [34]
    Действительно, не работает. Закомментарил - помню, что было лишним. Теперь так уже не кажется. RefInc же вначале есть, должен быть и RefDec. Free тот же RefDec, меня видимо смутило, что их два подряд. Сейчас буду исправлять "как было".

    Да, это самый правильный вариант. Если дестроить объект, связанный с окном, в WM_NCDESTROY, бяка получается. Объектам надо дать пожить, пока не грохнется вся форма, как минимум.
  • Vladimir Kladov © (19.02.11 19:28) [35]
    Все, обновление уже на сайте, я пока новости заполняю.
  • Vladimir Kladov © (20.02.11 09:55) [36]
    Если что, на сайте 3.14159.
    Заметил ошибку с асм-версией в тулбаре - вместо тултипов грязь отображалась, поправил.
  • Thaddy © (20.02.11 11:46) [37]
    next version will be:
    3.141592
    and then, of course:
    3.1415926
    3.14159265
    3.141592653
    3.1415926535
    3.14159265358
    3.141592653589
    3.1415926535897
    3.14159265358979
    3.141592653589793

    Good system!, we will never run out of numbers ;-)
  • Vladimir Kladov © (20.02.11 21:00) [38]
    Версия 3.141592 на сайте :)
    (компилируемость с Delphi2, Delphi3 поправлена, до кучи соптимизирована асм-версия WndProcTreeView и еще чего-то не помню чего.
  • Vladimir Kladov © (21.02.11 17:37) [39]
    Версия 3.1415926 на сайте ;)
    Исправил работу с датой и временем, переделал на работу через функции API (но они работают с 1601 года), на случай необходимости использовать собственный прежний код KOL для правильного представления более ранних дат, введен символ условной компиляции DATE0_0001. Так же, поправлен FormCompact для фреймов, на больших проектах MCK с формами из большого числа контролов вполне прилично откусывает (особенно, если форм несколько). Еще всякие мелкие поправки. Для любителей: компилируемость с Delphi2, Delphi3. Если используете в UNICODE-проектах toolbar и treeview, проверьте, пожалуйста, работу асм-версий. Если что, сообщайте. Я пока что выложил Column Commander 0.4b с полнофункциональным поиском, но даже еще не протестировал все комбинации параметров (их много).
  • Dufa © (21.02.11 18:27) [40]
    Версия конечно зачёт :D
    Есть два пожелания:

    1) В функции Str2Extended заменить:

       '.': if not Pt then Pt := TRUE else break;


    на

       '.', ',': if not Pt then Pt := TRUE else break;



    Чтобы работало вот такое:

     MsgOK(Extended2Str(KOL.Str2Extended('0.1')));
     MsgOK(Extended2Str(KOL.Str2Extended('0,1')));



    2) Чтобы не падало вот такое:
    StrSatisfy('stoka', '');



    Добавить проверку на пустую маску
  • Vladimir Kladov © (21.02.11 18:44) [41]
    Хорошо, KOL 3.14159265, MCK не менялся. У меня работает, не сломалось :).
    Когда версию зафиксирую, буду ссылаться как на версию "пи" (стабильно).
  • Vladimir Kladov © (21.02.11 18:52) [42]
    У меня на сайте лежит старый достаточно уже Zoomer, он сделан с Grush (режим dual). Можете его запстить - упадет или нет, на той же машине? Просто интересно. Вдруг дело все-таки в версии KOL, и тогда что-то было устойчивее.
  • user (24.02.11 01:28) [43]
    А где можно найти файл с утилтиами KOLUtils06.pas ?
  • Jon © (24.02.11 03:26) [44]

    > А где можно найти файл с утилтиами KOLUtils06.pas ?


    http://files.mail.ru/UA2GBZ
  • awkward © (24.02.11 16:07) [45]
    Кстати.... скачал последнюю версию KOL.
    Delphi 7 компилирует "на ура"
    Delphi 5 выдает ошибку
    kol.pas(26878) Fatal: Internal error: C1093

    Может, тут и не сама библиотека виновата..... но все же. Что это может быть? версия от 20го февраля компилировалась нормально.
  • awkward © (24.02.11 16:34) [46]
    дополню: если определить {$DEFINE DATE0_0001}
    компиляция в пятой дельфи проходит нормально
  • user (24.02.11 17:53) [47]
  • Vladimir Kladov © (24.02.11 18:14) [48]
    Я пока выложил именно такое исправление: для Delphi5 и раньше по умолчанию старый код с DATE0_0001, с Delphi6 и выше по умолчанию новый. Неправильно TRUNC работает в D5. С теми же входными значениями выдает другие выходные. Internal error у него на преобразование в INT64. В общем, новый код намного короче, но, увы, не для старых Delphi.

    Заодно в версии на сайте исправлен ParamCount (асм-версия).
  • awkward © (24.02.11 18:41) [49]
    спасибо за пояснение, просто

    {$IFDEF _D2orD3}
               {$DEFINE DATE0_0001}
    {$ENDIF _D2orD3}

    про дельфи версий 4 и 5 - ни слова
  • Vladimir Kladov © (24.02.11 19:04) [50]
    Что-то не та версия. Я только что выложил 3.14159265358, до этого выкладывал без 8. Там было {$IFNDEF _D6orHigher}.
    Сейчас я сделал, что для D5 тоже работает, чуть-чуть больше кода требуется, байт на 80. Не умеет сразу получить int64 из числа удвоенной точности. Пришлось лишние операции делать. Так что сейчас в том месте {$IFnDEF _D5orHigher}
  • Jon © (24.02.11 20:59) [51]
    KOL.pas has exceeded 2MB - I remember that there were some issues with the file size of .pas files, should we be concerned?
  • Vladimir Kladov © (24.02.11 21:22) [52]
    Problem is only in setting breakpoints after 65535th line but this is a problem for Delphi 5 and earlier. May be D6 too, but there are no problems in D7. In D5, if do not stop after that line it works ok.

    Next time I'll move some new asm code to kol_asm to make smaller lines in pascal part.
  • Dufa © (25.02.11 09:47) [53]
    Вот такая штука тут всплыла.. Если использовать Extended2Str (а так же несколько других функций в PAS версиях) то к коду добавляется мусор из за


    Assert( Result[ 1 ] = '0', 'error!' );



    Предлагаю все ассерты экранировать {$IFDEF DEBUG} ... {$ENDIF}
  • SPeller © (25.02.11 17:53) [54]
    Номера версий конечно оригинальные ))))
  • Vladimir Kladov © (25.02.11 20:18) [55]
    Этот Assert вообще закомментарю. Не помню, зачем я его оставил. Может, просто забыл. Но вообще, все ассерты убираются одним крыжиком в опциях проекта. Они как бы для этого и пишутся, чтобы их можно было этим крыжиком включать или выключать. Это уже как бы {$IFDEF}.
  • Vladimir Kladov © (26.02.11 08:51) [56]
    На сайте KOL 3.141592653589. В принципе, ничего особенного не менял, только вынес ассемблерные части в KOL_asm.inc и KOL_ASM_NOUNICODE.inc (новый), чтобы опять втиснуться в прокрустовы 65535 строк. Очень не хотелось плодить еще один inc-файл, так как усложняется поиск различий методом льва в коробке, теперь надо синхронные правки делать уже в 3х файлах, но видимо уже ничего не поделаешь). Теперь есть резерв в 4000 строк.

    С ассертами я все-таки сделал как Dufa предложил. Оно обычно ни на что по-сути не влияет, а кому-то может понадобится такая штука, чтобы в KOL все assert'ы выключить, а прочие оставить. Сразу не подумал о такой возможности, извиняюсь.

    Ждем еще неделю, и фиксируем Пи-версию.
  • Dufa © (26.02.11 15:06) [57]
    Ассерты нормально теперь, а про галочку кстати совсем забыл..

    В Str2Extended потеряли:
       '.', ',': if not Pt then Pt := TRUE else break;



    Локальная асм версия DateTime2SystemTime приводит к падению.. не разбирался почему. ПАС версия работает.

    И напомните какие функции относятся к ASM_NOUNICODE или наоборот к ASM_UNICODE
  • Vladimir Kladov © (26.02.11 16:16) [58]
    Исправил, 7 на конце.

    Всегда не-UNICODE. Ассемблеря я для UNICODE делал для очень небольшого числа функций, в них используется просто {$IFDEF ASM_VERSION}. Если {$IFDEF ASM_UNICODE}, это значит, что асм отключится для UNICODE_CTRLS для этой функции. Вообще, в начале файла написано kol_asm_nounicode.inc
  • Dufa © (26.02.11 17:29) [59]
    Вот теперь нормалек. С nounicode вроде разобрался, от наличия многих инк начинаешь запутываться уже..

    Еще такое предложение: в DefFont изменить Name: 'Tahoma' (для уникода уже он стоит UNICODE_CTRLS); и Height: -11;
    Вроде дефолтный шрифт и дефолтный размер..
  • Vladimir Kladov © (26.02.11 18:04) [60]
    Говорили уже. Дефолтный шрифт - это тот, который по умолчанию дает Windows окну, если ему не назначать шрифт вообще. Вообще-то, это шрифт System.

    В TKOLProject можно поставить сейчас любой шрифт по умолчанию. Так в чем неприятность от того, что умолчание совпадает с тем, что дает окну система?
  • Dy1 (01.03.11 19:27) [61]
    версия кола 3.1415926535897  При установке:

    [DCC Error] mirror.pas(13076): E2010 Incompatible types: 'Char' and 'AnsiChar'
    [DCC Fatal Error] mckActionListEditor.pas(67): F2063 Could not compile used unit 'mirror'
    [Pascal Warning] mirror.pas(5295): W1057 Implicit string cast from 'ShortString' to 'string'
    [Pascal Warning] mirror.pas(5301): W1057 Implicit string cast from 'ShortString' to 'string'
    [Pascal Warning] mirror.pas(10819): W1057 Implicit string cast from 'ShortString' to 'string'
    [Pascal Warning] mirror.pas(10825): W1057 Implicit string cast from 'ShortString' to 'string'
    [Pascal Error] mirror.pas(13076): E2010 Incompatible types: 'Char' and 'AnsiChar'
    [Pascal Warning] mirror.pas(13078): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
    [Pascal Warning] mirror.pas(13080): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
    [Pascal Hint] mirror.pas(184): H2219 Private symbol 'FCallingOnAdd' declared but never used
    [Pascal Hint] mirror.pas(766): H2219 Private symbol 'FGetShowHint' declared but never used
    [Pascal Hint] mirror.pas(770): H2219 Private symbol 'FFormCompact' declared but never used
    [Pascal Hint] mirror.pas(1601): H2219 Private symbol 'AllItemsAreOwnerDraw' declared but never used
    [Pascal Hint] mirror.pas(2864): H2219 Private symbol 'FLinked' declared but never used
    [Pascal Hint] mirror.pas(2885): H2219 Private symbol 'ResolveLinks' declared but never used
    [Pascal Hint] mirror.pas(2886): H2219 Private symbol 'FindComponentByPath' declared but never used
    [Pascal Hint] mirror.pas(2887): H2219 Private symbol 'GetComponentFullPath' declared but never used
    [Pascal Hint] mirror.pas(2888): H2219 Private symbol 'UpdateLinkedComponent' declared but never used
    [Pascal Hint] mirror.pas(2889): H2219 Private symbol 'UpdateLinkedComponents' declared but never used
    [Pascal Fatal Error] mirror.pas(1): F2092 Program or unit 'mirror' recursively uses itself
    [Pascal Fatal Error] mirror.pas(1): F2092 Program or unit 'mirror' recursively uses itself
  • Dy1 (01.03.11 22:42) [62]
    забыл сказать что это в Д2009
  • Vladimir Kladov © (02.03.11 15:30) [63]
    Обновил mck.zip.
  • Dy1 (02.03.11 22:46) [64]
    Не знаю где спросить авторов сторонних компонент

    Существуют ли компоненты KOLBlockCiphers и kolhash для Д2009? Пишет "попытка обращения к неверному адресу", первой строчкой правильный путь на папку с bpl

    Ну, и другие компоненты.
  • Dy1 (02.03.11 23:57) [65]
    помогите пожалуйста. кол вроде бы подключается, но проект компилируется размером полтора мегабайта.
    http://dy.cdrrhq.ru/90.rar

    KOLBlockCiphers установил, а для хешей не могу найти модули
  • Dy1 (03.03.11 07:49) [66]
    извиняюсь, нашёл причину - отладка включилась (не сохранилось её отключение). Остался последний вопрос - о необходимых компонентах.
  • Jon © (03.03.11 15:01) [67]
  • Dy1 (03.03.11 18:01) [68]
    спасибо
  • New_Old (10.03.11 19:34) [69]
    В конце агуста прошлого года закончил проект с использованиеем
    KolEcmKistEdit с Kol v2.9*. D5, WinXP
    В начале марта вернулся к этому проекту для его модернизации
    (Kol версия от 26 февраля.)
    Трансляция прежнего проекта не прошла.
    Ошибка: Incompatible types: TMsg и tagMsg
      в командах AttachProc(WndProcxxx)
    если эти команды закоментировать теряется вся обработка
    в KolEcmKistEdit
    Подскажите, где искать ошибки?
  • Vladimir Kladov © (10.03.11 19:48) [70]
    function Proc( Sender: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
    begin
       Result := FALSE;
    end;

    procedure TForm1.Button1Click(Sender: PObj);
    begin
       Button2.AttachProc( Proc );
    end;




    Компилируется и работает. Покажите участок кода, который не компилируется.
  • Vladimir Kladov © (10.03.11 19:50) [71]
    Да, вот еще что. Проверьте, что в uses у Вас KOL идет ПОСЛЕ Windows, а не ДО.
  • Dy1 (19.03.11 14:08) [72]
    Вин7, Делфи 2009, KOL 3.1415926535897 (с МСК)
     На форму положил мемо. С UNICODE_CTRLS заголовок формы "Fo" и в мемо выводится часть строки. Без опции норм, сейчас потестирую на предмет юникодоглюков. Отображение в юникоде в мемо получится проверить на днях.
     В дизайне заголовок формы в любом случае отображается нормально.
  • Dy1 (19.03.11 15:17) [73]
    без юникода не катит
  • Dy1 (19.03.11 16:06) [74]
    видимо при преобразовании где-то в библиотечке длина строки меняется не на 2, а на 1 байт
  • Dy1 (19.03.11 16:22) [75]
    форма не берёт шрифт по-умолчанию. Необходимо вручную перещёлкивать FontDefault
  • Dy1 (24.03.11 11:08) [76]
    Так что с [72] ?  Никто юникод не использует что ли???
  • Дмитрий К © (24.03.11 11:56) [77]

    > Dy1   (24.03.11 11:08) [76]

    Используй PAS_VERSION, либо в asm-версии TControl.SetCaption замени System.@WStrAsg на System.@UStrAsg
  • Dy1 (24.03.11 23:12) [78]
    там не только caption, но и прочие компоненты. MEMO, например
  • Vladimir Kladov © (26.03.11 07:48) [79]

    > Так что с [72] ?  Никто юникод не использует что ли???

    Я не использую (не могу использовать) D2009. Могу только компилировать из командной строки в Delphi XE (его я оставил для тестирования). Попробуйте в Delphi5...Delphi7. Насколько мне известно, все MCK (и не MCK) проекты должны иметь опцию UNICODE_CTRLS, собрать ANSI версию там просто невозможно. String перманентно забанен и стал UnicodeString (или что-то в этом роде). Опции обратной совместимости не предусмотрено.
  • Dy1 (26.03.11 18:47) [80]
    в пас версии вроде норм, глубоко не тестировал. В асме что-то не совсем так
  • Dy1 (27.03.11 19:27) [81]
    не действует символ компиляции {$DEFINE DATE0_1601}, {$DEFINE DATE0_0001} выкл.

    всегда считает с нулевого года.

    Включены:
    {$DEFINE TLIST_FAST}
    {$DEFINE NOT_USE_RICHEDIT}
    {$DEFINE DEBUG}
    {$DEFINE CRASH_DEBUG}
    {$DEFINE DEBUG_GDIOBJECTS}
    {$DEFINE CHK_BITBLT}
    {$DEFINE DEBUG_OBJKIND}
    {$DEFINE NO_DEFAULT_BUTTON_BOLD}
    {$DEFINE TIMER_APPLETWND}
    {$DEFINE STOPTIMER_AFTER_APPLETTERMINATED}
    {$DEFINE STOP_WNDPROCTRANSPARENT_AFTER_APPLETTERMINATED}
    {$DEFINE KEY_PREVIEW}
    {$DEFINE ESC_CLOSE_DIALOGS}
    {$DEFINE ALL_BUTTONS_RESPOND_TO_ENTER}
    {$DEFINE CLICK_DEFAULT_CANCEL_BTN_DIRECTLY}
    {$DEFINE DEFAULT_CANCEL_BTN_EXCLUSIVE}
  • Vladimir Kladov © (28.03.11 15:51) [82]
    Оно так и должно считать. 1601 для того, чтобы использовать более короткий код и функции API для превода из DateTime в SystemTime и наоборот, но они работают корректно только с 1 января 1601 года.
  • Dy1 (03.04.11 18:46) [83]
    Вин7, Делфи 2009, KOL 3.1415926535897  с МСК, опции и свойства ансишные.

    1) AV на строчке в проекте:   Memo1.Text := lst.Text;
    Если добавлять по строкам, то работает.

    2) Не работают методы PStrList-а  LoadFromFile и SaveFromFile, вылетов нет.
  • Dy1 (03.04.11 18:50) [84]
    "по строкам" т.е. через Add
  • Vladimir Kladov © (03.04.11 21:10) [85]
    Какие такие ансишные, в 2009? Там только unicode_ctrls, другое работать не будет.
  • Dy1 (03.04.11 23:00) [86]
    err.pas, строка 552
    {$IFDEF UNICODE_CTRLS} WStrCopy {$ELSE} StrCopy {$ENDIF}( Fmt, SException );
    не может самостоятельно выбрать функцию, ругается.
    Пробовал прописывать {$DEFINE UNICODE_CTRLS} в dpr, не помогает. Работает только если указать в самом err.

    Чем отличается NewStrList от NewKOLStrList ? Т.е. зачем так было сделано?
  • Vladimir Kladov © (04.04.11 15:34) [87]
    Вообще, символы компиляции в старых Delphi (до D7) прописывались в свойствах проекта. Думаю, в новых так же, просто интерфейс а-ля Visual C++/C#/... Посмотрите где там символы прописываются.

    KOLStrList следует использовать в проекте, если он может компилироваться и с unicode_ctrls и без, и в зависимости от опции работает как StrList или WStrList. StrList бывает нужен в unicode-проекте для работы с ansi-строками, WStrList - в ansi-программе, наоборот с unicode-строками. Если в строках есть #0 как символы, оба они бесполезны.
  • Dy1 (04.04.11 19:12) [88]
    1) там у меня KOL_MCK;EXTERNAL_DEFINES
    спасибо
  • Vladimir Kladov © (09.04.11 06:14) [89]
    External_defines.inc вставляются и должны восприниматься в самом KOL.pas, в KOL_add.pas и вроде бы всё. Т.е. UNICODE_CTRLS все-таки надо в свойствах проекта. Есть некоторое количество дополнительных компонент, которые понимают UNICODE_CTRLS, но EXTERNAL_DEFINES только сам KOL и KOLadd.
  • Dy1 (09.04.11 17:12) [90]
    ну так ведь запись в dpr на модули проекта тоже не действует
  • Vladimir Kladov © (10.04.11 07:50) [91]
    Запись чего-либо ({$DEFINE }) в файл dpr действует только на сам dpr, так же и запись в pas-файл - только на сам этот pas-файл, так всегда было. Исключения касаются общих директив типа {$APPTYPE }, но и не факт, что их надо именно в dpr-файл помещать, это тоже без разницы - можно в любом pas-файле проекта.
  • Thaddy © (27.04.11 09:19) [92]
    Vladimir,

    Is there a good reason why you disabled field TControl.fCollectUpdRgn in Kol.pas ?
    It is needed for current  KolHiLightEdit. Can you re-enable it? (I did already in my copy) I am using hilightedit in my KolIde project.  If I rewrite the code to use only Tcontrol.fUpdRgn it becomes slow.
  • Vladimir Kladov © (28.04.11 18:37) [93]
    But it was not used actually (2.94++) and occured only in disabled asm-version of WndProcPaint. It is better to remove it from KOLHilightEdit, supposing it is always = 0.
  • Thaddy © (29.04.11 11:21) [94]
    Ok.
  • Dufa © (03.05.11 12:24) [95]
    Такой вот момент всплыл...


    function TStrList.IndexOfName_NoCase(AName: Ansistring): Integer;
    ...
    /// WTF?? Dufa            while (p^ <> #0) and (p^ <= ' ') do inc( p );
    ...



    вот зачем нужна эта строка?
  • Thaddy © (04.05.11 08:54) [96]
    If you mean the next line references a fNameDelimiter and this line effectively means you can not use a space or tab as a name delimiter, you are correct.
    Otherwise this is an optimized - basically standard - way to skip non-printable characters in AsciiZ strings.
  • Dufa © (05.05.11 18:24) [97]
    Зачем нужна такая оптимизация? Это скорее не оптимизация, а фишка для пропуска пробелов и не печатных символов.. Но я не считаю, что она нужна. ПЛЮС в IndexOfName - этой фишки уже нету!
  • QAZ (24.05.11 14:23) [98]
    не знаю как сейчас, но в старой версии
    при щелчке правой мыши(и только ей) по хидеру лисвиева в режиме таблицы срабатывает onclick хотя по логике для него есть oncolumnclick
  • Jon © (24.05.11 15:18) [99]
    I found that there is a problem with RightClick when using a ListView.
    This program will demonstrate the error (KOL v3.14159265358979):


    program Test;

    uses KOL;

    procedure ColumnClick(Dummy: Pointer; Sender: PControl; Idx: Integer);
    begin
     if Sender.RightClick then
       MsgOK(Sender.LVColText[Idx]);
    end;

    begin
     Applet := NewForm(nil, 'Test');
     with NewListView(Applet, lvsDetail, [], nil, nil, nil)^ do
     begin
       LVColAdd('Col1', taLeft, 80);
       LVColAdd('Col2', taLeft, 80);
       LVColAdd('Col3', taLeft, 80);
       OnColumnClick := TOnLVColumnClick(MakeMethod(nil, @ColumnClick));
     end;
     Run(Applet);
    end.

  • Vladimir Kladov © (26.05.11 20:27) [100]
    LVN_COLUMNCLICK is fired by the system only in responce to left mouse click on column header.

    program Test;

    uses
     KOL;

     {$I KOLDEF.inc}

    procedure ColumnClick(Dummy: Pointer; Sender: PControl; Idx: Integer);
    begin
    //if Sender.RightClick then
      MsgOK(Sender.LVColText[Idx]);
    end;

    procedure Click1(Dummy: Pointer; Sender: PControl);
    begin
    if Sender.RightClick then
      MsgOK('Click right')
    else
      MsgOK('Click left');
    end;

    begin
    Applet := NewForm(nil, 'Test');
    with NewListView(Applet, lvsDetail, [], nil, nil, nil)^ do
    begin
      LVColAdd('Col1', taLeft, 80);
      LVColAdd('Col2', taLeft, 80);
      LVColAdd('Col3', taLeft, 80);
      OnColumnClick := TOnLVColumnClick(MakeMethod(nil, @ColumnClick));
      OnClick := TOnEvent(MakeMethod(nil, @Click1));
    end;
    Run(Applet);
    end.

  • Jon © (26.05.11 21:53) [101]

    > LVN_COLUMNCLICK is fired by the system only in
    > responce to left mouse click on column header.


    Understood - thank you very much.
  • Ken © (27.05.11 11:04) [102]
    You can handle right click on column header by yourself.

    uses KOL, Windows, Types;

    procedure Click1(Dummy: Pointer; Sender: PControl);
    var
     P: TPoint;
     hChildWnd: HWND;
     WndClass: string;
     hdhti: TLVHitTestInfo;
    begin
     if Sender.RightClick then begin
       P := Point(LoWord(GetMessagePos), HiWord(GetMessagePos));
       ScreenToClient(Sender.Handle, P);
       hChildWnd := ChildWindowFromPoint(Sender.Handle, P);
       if (hChildWnd <> 0) and (hChildWnd <> Sender.Handle) then begin
         SetLength(WndClass, 80);
         SetLength(WndClass, GetClassName(hChildWnd, PChar(WndClass), Length(WndClass)));
         if WndClass = 'SysHeader32' then begin
           hdhti.pt := P;
           if SendMessage(hChildWnd, HDM_HITTEST, 1, Longint(@hdhti)) >= 0 then
             MsgOK('Click right ' + Sender.LVColText[hdhti.iItem]);
         end;
       end;
     end
     else
       MsgOK('Click left');
    end;
  • QAZ (27.05.11 22:47) [103]
    что то, видимо народ, не понял что я имел в виду в [98]
    правая мышь на заголовке вызывает ONCLICK !!! в котором обрабатываются клики по итемам, и событиям от заголовка там делать нечего
  • Vladimir Kladov © (28.05.11 06:00) [104]
    Вот сюда

    function WndProcCommonNotify( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
    var NMhdr: PNMHdr;
    begin
     Result := False;
     if Msg.message = WM_NOTIFY then
     begin
       NMHdr := Pointer( Msg.lParam );
       case NMHdr.code of
         NM_RCLICK,
         NM_CLICK:  {$IFDEF NIL_EVENTS}
                    if assigned( Self_.EV.fOnClick ) then
                    {$ENDIF}
                    begin
                       {$IFDEF USE_FLAGS}
                           if   NMHdr.code = NM_RCLICK then
                                include( Self_.fFlagsG6, G6_RightClick )
                           else exclude( Self_.fFlagsG6, G6_RightClick );
                       {$ELSE} Self_.fRightClick := NMHdr.code=NM_RCLICK; {$ENDIF}
                       Self_.EV.fOnClick( Self_ );
                    end;
         NM_KILLFOCUS: {$IFDEF NIL_EVENTS}
                       if  assigned( Self_.EV.fOnLeave ) then
                       {$ENDIF}
                           Self_.EV.fOnLeave( Self_ );
         NM_RETURN,
         NM_SETFOCUS: {$IFDEF NIL_EVENTS}
                      if  assigned( Self_.EV.fOnEnter ) then
                      {$ENDIF}
                         Self_.EV.fOnEnter( Self_ );
       end;
     end;
    end;



    приходит сообщение от Windows WM_NOTIFY с кодом NM_CLICK, дальше что?
  • QAZ (28.05.11 13:13) [105]
    а я почем знаю, левый то почемуто не приходит в onclick,а приходит в ОnColumnClick, значит не в винде дело
  • Vladimir Kladov © (30.05.11 20:25) [106]
    В том и дело, что от винды как раз и не приходит левый клик. А что приходит, то и отдает код.
  • QAZ (30.05.11 22:58) [107]
    ну согласитесь не логично, что клик по заголовку идет в клик по итему
    в той же vcl под онклик подразумеваются именно левые клики а для правого клика по заголовку создается отдельное событие OnColumnRightClick (именно оттуда Ken [102] скопировал код)
    и никакой путаницы
  • Vladimir Kladov © (31.05.11 16:28) [108]
    Да, в VCL groupbox вообще в переопределенной процедуре Paint перерисовывался кодом из VCL. Нет, можно добавить какую-нибудь проверку, например, что WM_NOTIFY пришел для самого окна listview. Но я против такого подхода. Еще раз: кому не нравится, свой обработчик WM_NOTIFY навешивается очень просто. Если что-то делается часто, оформляется процедурой. Всяко проще, чем в VCL, где нет возможности без определения наследника легко прицепиться к обработчику. Там есть только SetWindowLong,  что простым способом назвать трудно. У нас есть OnMessage, AttachProc(Ex) - доработки со стороны без проблем. Базовая версия должна быть минималистская. Не абсолютно всех интересует, где был клик правой кнопкой мыши.
  • Santa (21.06.11 15:15) [109]
    при установленных CenterOnScreen=true и WindowsState=wsMaximized форма при запуске оставляет небольшой зазор сверху, хотя в дальнейшем при переводе в нормальный режим, а затем опять в максимальный режим такого нет. Очень похоже что форма сначала распахивается на весь экран, а потом равняется по центру экрана и присутствие панели задач заставляет образоваться зазор. Походу надо селать наоборот, сначала выровнять по центру экрана, а затем распахнуть.

    P.S. Delphi 7, Windows XP, версия библиотеки скачена 21.06.2011
  • Santa (23.06.11 13:08) [110]
    Еще одно непонятное поведение ListView. В книге и описаниях компонента сказано, что можно редактировать только одну первую колонку, но вопрос не в этом.
     При заполнении данными и попытке редактировать первую колонку по окончании ввода данных приложение валится с ошибкой "acсess violation 0x00000000 ...". Однако достаточно сделать обработчик события OnEndEditLVItem (можно туда ничего не вписывать, или что бы не пропал во время компиляции вписать коментарии), как приложение начинает работать как положено без всяких ошибок.

    P.S. Delphi 7, Windows XP, версия библиотеки скачена 21.06.2011
  • Thaddy © (24.06.11 22:32) [111]
  • Santa (27.06.11 11:38) [112]
    Замечен глюк с Toolbar, при разделении кнопок на группы("-"  в Caption свойствах кнопки). После сохранения проекта, закрытия и открытия его повторно, группы востанавливаются неверно, "-" располагается в напротив совсем других кнопок.
  • Santa (29.06.11 11:44) [113]
    В Toolbar в свойство Caption надо вставить хотя бы пробелы, что бы после открытия "-" (separator) востановились правильно.
  • Santa (07.07.11 09:25) [114]
    При FormCompact=true и наличии на форме ListView, вызов формы валит приложение.
  • QAZ (23.07.11 17:52) [115]
    Free_And_Nil работает некоректно, не освобождает объекты
    по крайней мере связанные с интерфейсами (TInterfacedComponent)
    метод free с последующим := nil норм
  • AndreyRus © (23.07.11 21:37) [116]

    > Free_And_Nil работает некоректно, не освобождает объектыпо
    > крайней мере связанные с интерфейсами (TInterfacedComponent)метод
    > free с последующим := nil норм


    Ага, тоже уже довольно давно заметил.
 
Конференция "KOL" » Версия 3.10 [Delphi]
Есть новые Нет новых   [120347   +16][b:0.001][p:0.006]