-
Всем привет. Столкнулся с такой проблемой:
При компиляции с флагом UNICODE_CTRLS заголовки в форме обрезаются (например, "Fo" вместо "Form1")
KOLMCK 3.20 и 3.18, Delphi 2010.
Какая версия KOLMCK сейчас наиболее стабильно работает с юникодом?
-
KOLMCK 3.20 и 3.18 - в Delphi 7 с UNICODE_CTRLS заголовки выводятся нормально.
-
В delphi7 с нативной поддержкой юникода всё плохо. Поэтому интересно что-нибудь из последних делфей.
-
-
Проблема не только в кодировке формы, потому что следующий код
procedure TForm1.Button1Click(Sender: PObj); begin ShowMessage(EditBox1.Text); end;
Нормально работает без UNICODE_CTRLS, а c UNICODE_CTRLS падает по рантайм. Это очень похоже на то, что буффер где-то криво считается.
-
(D2010+)
...
procedure TControl.SetCaption( const Value: KOLString );
asm
PUSH EBX
XCHG EBX, EAX
LEA EAX, [EBX].fCaption
CALL System.@WStrAsg
CALL System.@LStrAsg
...
и ещё вроде где-то есть похожая проблема
-
Такая же проблема. Delphi 2010. Помогла опция PAS_VERSION.
-
Похожие проблемы есть много где в коде ASM. В частности, KOL.ParamStr. Уважаемый Владимир Кладов, очень надо подправить. PAS_VERSION, конечно, решение, но объём...
-
Много где - это слишком широко сказано. Хотелось бы конкретики. И что вы имеете в виду под проблемами?
Я считаю так: падает, глючит - это ПРОБЛЕМА. Приходится использовать паскаль-версию - это вообще НЕ проблема (лишь бы работало).
П.С. Я понял, что лоханулся с SetCaption (в asm-версии оно все равно пытается освободить строку через @WStrClr, а не @UStrClr). Так что это в любом случае надо поправить.
Что с ParamStr - он как-то падает? Не то возвращает?
-
> 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 procedure TControl.SetCaption( const Value: KOLString );
destructor TDirList.Destroy; destructor TIniFile.Destroy; destructor TControl.Destroy; destructor TTrayIcon.Destroy; destructor TOpenSaveDialog.Destroy; destructor TOpenDirDialog.Destroy;
-
@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)
-
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, должно замедлять работу при интенсивном использовании строк. Возможно, заметно замедлять.
-
To: Кладов. ParamStr без PAS_VERSION падает всегда в D2010. Рантайм 255. Причём, непонятно где...
-
Реестр почистите (говорит гугл-яндекс). Или погуглите, или в яндексе погуглите. Проверьте опции проекта. Уберите отсроченную загрузку dll, если включена.
У меня нет D2010. У вас одного проблема?
-
to:VK :) само собой, всё это делается. Проблема явно в юникоде, так как в D7 её нет. А опции проекта - из лишнего там только PAS_VERSION
-
XCHG ECX, EAX MOV EDX, ESP MOV EAX, EDI >> CALL System.@LStrFromPCharLen ??? ADD ESP, 260 JMP @@exit @@1:
|