Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
5-1163941996
QuerySkin
2006-11-19 16:13
2007.12.02
Какие скины выбрать?


15-1193609979
Riply
2007-10-29 01:19
2007.12.02
Ubuntu


8-1170626458
Yura1024
2007-02-05 01:00
2007.12.02
Delphi: Изменение гамма-коррекции изображения


8-1170238744
Alek_1
2007-01-31 13:19
2007.12.02
делаем видео происходящего на экране


2-1194429628
Lera
2007-11-07 13:00
2007.12.02
Наименование продукта