Конференция "KOL" » Unicode, обрезанные caption [Delphi, Windows]
 
  • snjax © (11.11.13 11:23) [0]
    Всем привет. Столкнулся с такой проблемой:

    При компиляции с флагом UNICODE_CTRLS заголовки в форме обрезаются (например, "Fo" вместо "Form1")

    KOLMCK 3.20 и 3.18, Delphi 2010.

    Какая версия KOLMCK сейчас наиболее стабильно работает с юникодом?
  • L`Autour (11.11.13 12:03) [1]
    KOLMCK 3.20 и 3.18 - в Delphi 7 с UNICODE_CTRLS заголовки выводятся нормально.
  • snjax © (11.11.13 12:20) [2]
    В delphi7 с нативной поддержкой юникода всё плохо.
    Поэтому интересно что-нибудь из последних делфей.
  • Дмитрий К © (11.11.13 12:55) [3]
  • snjax © (11.11.13 14:23) [4]
    Проблема не только в кодировке формы, потому что следующий код

    procedure TForm1.Button1Click(Sender: PObj);
    begin
      ShowMessage(EditBox1.Text);
    end;

    Нормально работает без UNICODE_CTRLS, а c UNICODE_CTRLS падает по рантайм. Это очень похоже на то, что буффер где-то криво считается.
  • NoUser © (11.11.13 14:58) [5]
    (D2010+)

    // KOL_ASM.inc (to inlude in KOL.pas)
    // v 3.17
    ...
    procedure TControl.SetCaption( const Value: KOLString );
    asm
           PUSH    EBX
           XCHG    EBX, EAX
           LEA     EAX, [EBX].fCaption
           {$IFDEF UNICODE_CTRLS}
           CALL    System.@WStrAsg   // need replace to  
                                                 // CALL    System.@UStrAsg    
           {$ELSE}
           CALL    System.@LStrAsg
           {$ENDIF}
    ...


    и ещё вроде где-то есть похожая проблема
  • Md3r © (20.11.13 21:05) [6]
    Такая же проблема. Delphi 2010.
    Помогла опция PAS_VERSION.
  • ParanoiS (25.11.13 02:54) [7]
    Похожие проблемы есть много где в коде ASM. В частности, KOL.ParamStr. Уважаемый Владимир Кладов, очень надо подправить. PAS_VERSION, конечно, решение, но объём...
  • Vladimir Kladov © (25.11.13 19:46) [8]
    Много где - это слишком широко сказано. Хотелось бы конкретики.
    И что вы имеете в виду под проблемами?

    Я считаю так: падает, глючит - это ПРОБЛЕМА. Приходится использовать паскаль-версию - это вообще НЕ проблема (лишь бы работало).

    П.С. Я понял, что лоханулся с SetCaption (в asm-версии оно все равно пытается освободить строку через @WStrClr, а не @UStrClr). Так что это в любом случае надо поправить.

    Что с ParamStr - он как-то падает? Не то возвращает?
  • NoUser © (25.11.13 21:55) [9]

    > ParanoiS   (25.11.13 02:54) [7]



    //-------------------------------------------------------
    type
    PChars = ^TChars;
    TChars = array [0..(MaxInt div SizeOf(PChar))-1] of PChar;

    function CommandLineToArgvW(CmdLine:PChar; var Num:Integer):PChars; stdcall;

    implementation
    const
    shlapi_dll = 'Shell32.dll';

    function  CommandLineToArgvW; external shlapi_dll name 'CommandLineToArgvW';
    //-------------------------------------------------------
    var
    Ps:PChars;
    i,n: Integer;
    begin
    Ps := CommandLineToArgvW(GetCommandLine(), n);
    for i := 0 to n-1 do Writeln(Ps[i]);
    LocalFree(HLOCAL(Ps));
    end;



    > есть много где в коде ASM

    // WStrAsg -> UStrAsg
    procedure TControl.SetCaption( const Value: KOLString ); // 1x
    // WStrClr -> UStrClr
    destructor TDirList.Destroy; //1x
    destructor TIniFile.Destroy; //2x
    destructor TControl.Destroy; //1x
    destructor TTrayIcon.Destroy; //1x
    destructor TOpenSaveDialog.Destroy; //1x
    destructor TOpenDirDialog.Destroy; //1x
    // . ?

  • Thaddy © (26.11.13 15:18) [10]
    @Vladimir: It would be better to redefine - in the case of unicode and in the case of 64 bit later - to replace PAS_VERSION and PAS_ONLY with Delphi and FPC compatible RTL define PUREPASCAL. My internal version already has that, because I cannot afford newer XE3+ and only use FreePascal now. (Except for maintenance of old code)
  • Vladimir Kladov © (26.11.13 19:37) [11]
    I saw what PUREPASCAL do in system.pas. I now add a definition to kodef.inc which turns on PAS_VERSION and PAS_ONLY in KOL.pas if PUREPASCAL is defined. For me, it could be useful though to turn it off but to turn PAS_VERSION or PAS_ONLY. So I think it is better not to replace PAS_VERSION to PUREPASCAL everywhere.

    Я сейчас выкладываю версию 3210. Все @WStrXXXX для случая UNICODE_CTRLS и _Delphi2009orHigher заменены на соотвествующие @UStrXXXXX. Под xe2 компилируется, не падает. Далеко я не проверял, однако. Судя по реализации этого @UStr, должно замедлять работу при интенсивном использовании строк. Возможно, заметно замедлять.
  • ParanoiS (11.12.13 14:22) [12]
    To: Кладов. ParamStr без PAS_VERSION падает всегда в D2010. Рантайм 255. Причём, непонятно где...
  • Vladimir Kladov © (11.12.13 21:12) [13]
    Реестр почистите (говорит гугл-яндекс). Или погуглите, или в яндексе погуглите. Проверьте опции проекта. Уберите отсроченную загрузку dll, если включена.

    У меня нет D2010. У вас одного проблема?
  • ParanoiS (24.12.13 18:15) [14]
    to:VK
    :) само собой, всё это делается. Проблема явно в юникоде, так как в D7 её нет. А опции проекта - из лишнего там только PAS_VERSION
  • ParanoiS © (22.01.14 10:23) [15]
    XCHG ECX, EAX
            MOV  EDX, ESP
            MOV  EAX, EDI
    >>    CALL System.@LStrFromPCharLen ???
            ADD  ESP, 260
            JMP  @@exit
    @@1:
 
Конференция "KOL" » Unicode, обрезанные caption [Delphi, Windows]
Есть новые Нет новых   [118480   +43][b:0][p:0.002]