Текущий архив: 2007.12.02;
Скачать: CL | DM;
Вниз
Обсуждение замечаний и предложений. Найти похожие ветки
← →
Vladimir Kladov (2007-04-14 12:53) [0]Кстати, это правильно: делать отдельное обсуждение, куда складывать замечания. Но если туда же писать всевозможные рассуждения и обсуждения по их поводу, то уже в пределах той ветки трудно будет разобраться, как не раз бывало. Соответственно, обсуждать предлагаю в других местах.
И вообще, предложения лучше выкладывать не сразу, как в голову пришли, а выборочно, когда уже окончательно оформлены.
Теперь собственно обсуждение. У меня вопросы: какой тип у IsUnisode - KOLstring? Где вы параметры для IsUnicodeString нашли (F000), что-то я констант соответствующих в windows.pas не вижу. MSDN почитал. Очень не советуют вроде пользоваться IS_TEXT_UNICODE_STATISTICS and IS_TEXT_UNICODE_REVERSE_STATISTICS. Чем и как пользоваться и почему, не пишут. Насчет возвращаемого результата даже не понятно: это может быть не ответ "да, Unicode", а ответ "тест пройден, см. результаты в i" - не больше того.
← →
MTsv DN © (2007-04-14 14:07) [1]> какой тип у IsUnisode - KOLstring?
i : integer;
IsUnicode : WideString;
Где вы параметры для IsUnicodeString нашли (F000), что-то я констант соответствующих в windows.pas не вижу.
Из JEDI взял...const
IS_TEXT_UNICODE_ASCII16 = $0001;
{$EXTERNALSYM IS_TEXT_UNICODE_ASCII16}
IS_TEXT_UNICODE_REVERSE_ASCII16 = $0010;
{$EXTERNALSYM IS_TEXT_UNICODE_REVERSE_ASCII16}
IS_TEXT_UNICODE_STATISTICS = $0002;
{$EXTERNALSYM IS_TEXT_UNICODE_STATISTICS}
IS_TEXT_UNICODE_REVERSE_STATISTICS = $0020;
{$EXTERNALSYM IS_TEXT_UNICODE_REVERSE_STATISTICS}
IS_TEXT_UNICODE_CONTROLS = $0004;
{$EXTERNALSYM IS_TEXT_UNICODE_CONTROLS}
IS_TEXT_UNICODE_REVERSE_CONTROLS = $0040;
{$EXTERNALSYM IS_TEXT_UNICODE_REVERSE_CONTROLS}
IS_TEXT_UNICODE_SIGNATURE = $0008;
{$EXTERNALSYM IS_TEXT_UNICODE_SIGNATURE}
IS_TEXT_UNICODE_REVERSE_SIGNATURE = $0080;
{$EXTERNALSYM IS_TEXT_UNICODE_REVERSE_SIGNATURE}
IS_TEXT_UNICODE_ILLEGAL_CHARS = $0100;
{$EXTERNALSYM IS_TEXT_UNICODE_ILLEGAL_CHARS}
IS_TEXT_UNICODE_ODD_LENGTH = $0200;
{$EXTERNALSYM IS_TEXT_UNICODE_ODD_LENGTH}
IS_TEXT_UNICODE_DBCS_LEADBYTE = $0400;
{$EXTERNALSYM IS_TEXT_UNICODE_DBCS_LEADBYTE}
IS_TEXT_UNICODE_NULL_BYTES = $1000;
{$EXTERNALSYM IS_TEXT_UNICODE_NULL_BYTES}
IS_TEXT_UNICODE_UNICODE_MASK = $000F;
{$EXTERNALSYM IS_TEXT_UNICODE_UNICODE_MASK}
IS_TEXT_UNICODE_REVERSE_MASK = $00F0;
{$EXTERNALSYM IS_TEXT_UNICODE_REVERSE_MASK}
IS_TEXT_UNICODE_NOT_UNICODE_MASK = $0F00;
{$EXTERNALSYM IS_TEXT_UNICODE_NOT_UNICODE_MASK}
IS_TEXT_UNICODE_NOT_ASCII_MASK = $F000;
{$EXTERNALSYM IS_TEXT_UNICODE_NOT_ASCII_MASK}
> MSDN почитал. Очень не советуют вроде пользоваться IS_TEXT_UNICODE_STATISTICS
> and IS_TEXT_UNICODE_REVERSE_STATISTICS. Чем и как пользоваться
> и почему, не пишут. Насчет возвращаемого результата даже
> не понятно: это может быть не ответ "да, Unicode", а ответ
> "тест пройден, см. результаты в i" - не больше того.
Ну, если честно, то я щас и не пользуюсь IsTextUnicode. В данном случае задача сводится к проверке не столько на UNICODE, сколько на ANSI-16. Поэтому я использую сл.код...только не смейтесь:{$IFDEF UNICODE_CTRLS}
IsUnicode := FindData.cFileName;
if (IsUnicode <> ".") and (IsUnicode <> "..") then
begin
if Pos("?", AnsiString(IsUnicode)) <> 0 then
CopyMemory(@FindData.cFileName, @FindData.cAlternateFileName, SizeOf(FindData.cAlternateFileName));
end;
{$ENDIF}
После приведения к AnsiString, все символы не-AnsiString становятся "?" (кстати, поэтому я и про Trim вспомнил), а т.к. в имени файла/папки "?" быть не может, то следовательно, есть не-AnsiString символы...
← →
Vladimir Kladov (2007-04-14 22:19) [2]Ну так надо было сразу такой код и давать. Ежи знают, что "?" в имени файла - нонсенс, дхоть в дос, хоть в виндовс.
← →
Dy1 © (2007-04-16 15:06) [3]Долго вылавливал ошибку: программа вылетала в случайные моменты времени. KOLnMCK 2.56
procedure TForm1.Button1Click(Sender: PObj);
var
i: PBitmap;
s: string;
begin
i := NewBitmap(1,1);
i.LoadFromFile("1.bmp");
system.Str(i.Handle,s); // заменённый модуль
// int2str(i.Handle); Так я выяснил, что виновата ф-я "int2str". Если число - константа, то прога работала нормально
i.Free;
ASM знаю не на том уровне, чтобы копаться в функции
← →
Vladimir Kladov (2007-04-16 16:12) [4]ASM не при чем, ставьте PAS_VERSION. Наверняка ошибка все-таки в другом месте. Как это может быть? Запросто. Как раз знание асма помогает понять.
← →
MTsv DN © (2007-04-16 19:35) [5]Привет...
1. Файл KOL_ASM.PAS. Функции TrimXXX до сих пор string.
2. Файл KOL.PAS (если примите предложение, то и KOL_ASM.PAS надо менять).function WndProcJustOne( Control: PControl; var Msg: TMsg; var Rslt: Integer ) : Boolean;
begin
Result := False;
case Msg.message of
WM_CLOSE, WM_NCDESTROY:
if LongBool( JustOneMutex ) and (Control.Handle = Msg.hwnd) then
begin
CloseHandle( JustOneMutex );
JustOneMutex := 0;
end;
end;
end;
Предлагаю добавить выделенный участок кода, дабы исключить ошибочное уничтожение мютекса.
3.function WndProcJustOneNotify( Control: PControl; var Msg: TMsg; var Rslt: Integer ) : Boolean;
var Buf : array[0..MAX_PATH] of KOLChar;
begin
WndProcJustOne( Control, Msg, Rslt );
Result := False;
if Msg.message = JustOneMsg then
begin
Result := True;
if assigned( OnAnotherInstance ) then
begin
GetWindowText( Msg.lParam, Buf, MAX_PATH );
OnAnotherInstance( Buf );
end;
Rslt := 0;
end;
end;
Предлагаю заменить MAX_PATH на 65535.
Обоснование следующее: положим я использую код получения параметров приложения через меню "Отправить". При выделении в системе, положим, 5 элементов SendTo формирует строку вида:
"your_app.exe your_param "selItem1" "selItem2" "selItem3" "selItem4" "selItem5"". В WndProcJustOneNotify передается строка без "your_app.exe". Нетрудно догадаться, что MAX_PATH очень быстро "заканчивается"...
← →
MTsv DN © (2007-04-16 19:47) [6]Если надо больше инфы по поводу 2. Качайте темповый проект: http://www.uus4u.com/download/uuds/temp2.rar
← →
MTsv DN © (2007-04-17 09:46) [7]Вот решение для ASM-версии (пункт 2):
function WndProcJustOne( Control: PControl; var Msg: TMsg; var Rslt: Integer ) : Boolean;
asm
MOV ECX, [EDX].TMsg.message
SUB ECX, WM_CLOSE
JE @@1
SUB ECX, WM_NCDESTROY - WM_CLOSE
JNE @@exit
@@1:
MOV ECX, [JustOneMutex]
JECXZ @@exit
PUSH ECX
MOV ECX, [EDX].TMsg.hwnd
CMP [EAX].TControl.fHandle, ECX
POP ECX
JNE @@exit
PUSH ECX
//PUSH ECX
//CALL ReleaseMutex
CALL CloseHandle
MOV [JustOneMutex], 0
@@exit:
XOR EAX, EAX
end;
А также еще исправление для ASM-версии, в PAS-коде:destructor TObj.Destroy;
asm
PUSH EAX
CALL Final
POP EAX
{$IFDEF USE_NAMES}
PUSH EAX
XOR EDX, EDX
XOR ECX, ECX
CALL SetName
POP EAX
PUSH EAX
XOR ECX, ECX
XCHG ECX, [EAX].fNamedObjList
XCHG EAX, ECX
CALL TObj.Free
POP EAX
{$ENDIF}
XOR EDX, EDX
CALL System.@FreeMem
//CALL System.@Dispose
end;
Хотя при уничтожении объекта, выделенным кодом и выполняется попытка "fName := "";", однако из-за:if NewName = "" then Exit;
вот этой строчке в SetName, этого не происходит. И мемчекер выдает утечку (использую FastMM4). Предлагаю:if NewName = "" then
begin
fName := "";
Exit;
end;
← →
Don © (2007-04-17 11:15) [8]
unit KOLadd;
function GetAcceleratorText( const Accelerator: TMenuAccelerator ): KOLstring;
var
KeyName: array[0..255] of KOLChar;
procedure AddKeyName( Code: Integer );
begin
Code := MapVirtualKey(Code, 0);
if Code = 0 then exit;
if GetKeyNameText(Code shl 16, KeyName, 256) > 0 then begin
if Result <> "" then
Result := Result + "+";
Result := Result + KeyName;
end;
end;
begin
...
end;
там сейчас стоит SizeOf(KeyName), а в UNICODE это 512, а надо 256. Соответственно, под UNICODE GetAcceleratorText не работает.
← →
Don © (2007-04-17 11:23) [9]Извиняюсь за последний пост, модйль не KOLadd, а KOL.
(плохо, что здесь ничего нельзя исправить)
← →
Vladimir Kladov (2007-04-17 17:15) [10]1. Файл KOL_ASM.PAS. Функции TrimXXX до сих пор string.
KOL_ASM.inc. Она зкаомментирована для unicode: {$IFDEF ASM_UNICODE}.
Чтобы увидеть выделенный текст, мне надо загружать все обсуждение в браузере. Что накладно. Вот сейчас соединился. 34.6. Еле дышит. Поэтому, если уже шлете код, шлите его мылом, что ли.
MAX_PATH на 65535
И что, если в функции объявляется локальный буфер array[0..MAXPATH] - на стеке предлагаете выделять по стольку? MAX_PATH он и в MS VC++ объявлен 256. Другое дело, что для этой конкретной функции параметр может быть длиннее, и его вообще надо получать как длинную строку, выделяя память по мере длины. Ладно, сделаем. И опционально тоже, а то может кому и малой строки хватает.
AddKeyName
Хорошо.
← →
mdw © (2007-04-17 17:43) [11]Файл mirror.pas, строка 24563.
Нужно поменять:
if Tag <> 0 then
на
if Actions[i].Tag <> 0 then
← →
mdw © (2007-04-17 17:46) [12]И в следующей:
SL.Add(Format("%s.%s.Tag := %d;", [p, Name, Tag]));
на
SL.Add(Format("%s.%s.Tag := %d;", [p, Name, Actions[i].Tag]));
← →
mdw © (2007-04-17 18:13) [13]Блин, что-то я не могу с одного раза правильно все написать. Последний, правильный вариант. Файл mirror.pas, строка 24563-24564.
if Actions[i].Tag <> 0 then
SL.Add(Format("%s.%s.Tag := %d;", [p, Actions[i].Name, Actions[i].Tag]));
← →
MTsv DN © (2007-04-17 18:18) [14]> Поэтому, если уже шлете код, шлите его мылом, что ли.
Отправил...
← →
Vladimir Kladov (2007-04-17 21:13) [15]Пример (test2) работает с апплетом. Проверку hwnd тоже можно добавить.
← →
MTsv DN © (2007-04-24 19:28) [16]
property LVColText[ Idx: Integer ]: String read GetLVColText write SetLVColText;
String заменить на KOLString.
← →
exero © (2007-04-25 14:55) [17]
procedure TDirList.ScanDirectoryEx(const DirPath, Filters: KOLString;
Attr: DWord);
var F, FF: KOLString;
begin
FF := Filters;
if fFilters <> nil then Free_And_nil(fFilters);
.........
end;
и ассемблерный вариант тоже надо подправить
← →
Galkov © (2007-05-01 21:53) [18]Есть небольшая бага в ASM-версиях NewTabControl и NewTabEmpty
function NewTabControl;
const lenf=high(TabControlFlags); //+++
asm //cmd //opd
PUSH EBX
PUSH ESI
PUSH EDI
XCHG EBX, EAX
PUSH EDX
PUSH ECX
LEA EAX, [Options]
MOV EDX, offset[TabControlFlags]
XOR ECX, ECX
MOV CL, lenf//*** было 13
CALL MakeFlags
...
И ровно то же самое следует сделать для NewTabEmpty
Пардон: копировал не пересчитывая размер TabControlFlags :)
← →
delphicommctrl (2007-05-02 00:30) [19]Ошибка в delphicommctrl.inc, строка 1401
Должно быть:
PBT_APMRESUMEAUTOMATIC = $12; // 16-ричное 12 (см. Pbt.h)
← →
Vladimir Kladov (2007-05-02 16:01) [20]PBT_APMRESUMEAUTOMATIC а, вот почему MultiClipboard до сих пор проблематично восстанавливается после гибернации. Ну, спасибо, что приметили слона.
← →
Vladimir Kladov (2007-05-18 19:44) [21]up - просьба дублировать все окончательные предложения по изменения в коде здесь.
Страницы: 1 вся ветка
Текущий архив: 2007.12.02;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.028 c