![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обсуждение замечаний и предложений. [Delphi, Windows]
Vladimir Kladov © (2007-04-14 12:53:00)Кстати, это правильно: делать отдельное обсуждение, куда складывать замечания. Но если туда же писать всевозможные рассуждения и обсуждения по их поводу, то уже в пределах той ветки трудно будет разобраться, как не раз бывало. Соответственно, обсуждать предлагаю в других местах.
И вообще, предложения лучше выкладывать не сразу, как в голову пришли, а выборочно, когда уже окончательно оформлены.
Теперь собственно обсуждение. У меня вопросы: какой тип у IsUnisode - KOLstring? Где вы параметры для IsUnicodeString нашли (F000), что-то я констант соответствующих в windows.pas не вижу. MSDN почитал. Очень не советуют вроде пользоваться IS_TEXT_UNICODE_STATISTICS and IS_TEXT_UNICODE_REVERSE_STATISTICS. Чем и как пользоваться и почему, не пишут. Насчет возвращаемого результата даже не понятно: это может быть не ответ "да, Unicode", а ответ "тест пройден, см. результаты в i" - не больше того.
Vladimir Kladov (2007-05-18 19:44:00) [1]up - просьба дублировать все окончательныепредложения по изменения в коде здесь.
Vladimir Kladov (2007-05-02 16:01:00) [2]PBT_APMRESUMEAUTOMATIC а, вот почему MultiClipboard до сих пор проблематично восстанавливается после гибернации. Ну, спасибо, что приметили слона.
delphicommctrl (2007-05-02 00:30:00) [3]Ошибка в delphicommctrl.inc, строка 1401
Должно быть:
PBT_APMRESUMEAUTOMATIC = $12; // 16-ричное 12 (см. Pbt.h)
Galkov (2007-05-01 21:53:00) [4]Есть небольшая бага в 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 :)
exero (2007-04-25 14:55:00) [5]
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;
и ассемблерный вариант тоже надо подправить
MTsv DN (2007-04-24 19:28:00) [6]
property LVColText[ Idx: Integer ]: String read GetLVColText write SetLVColText;
String заменить на KOLString.
Vladimir Kladov (2007-04-17 21:13:00) [7]Пример (test2) работает с апплетом. Проверку hwnd тоже можно добавить.
MTsv DN (2007-04-17 18:18:00) [8]> Поэтому, если уже шлете код, шлите его мылом, что ли.
Отправил...
mdw (2007-04-17 18:13:00) [9]Блин, что-то я не могу с одного раза правильно все написать. Последний, правильный вариант. Файл mirror.pas, строка 24563-24564.
if Actions[i].Tag <> 0 then
SL.Add(Format('%s.%s.Tag := %d;', [p, Actions[i].Name, Actions[i].Tag]));
mdw (2007-04-17 17:46:00) [10]И в следующей:
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 17:43:00) [11]Файл mirror.pas, строка 24563.
Нужно поменять:
if Tag <> 0 then
на
if Actions[i].Tag <> 0 then
Vladimir Kladov (2007-04-17 17:15:00) [12]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
Хорошо.
Don (2007-04-17 11:23:00) [13]Извиняюсь за последний пост, модйль не KOLadd, а KOL.
(плохо, что здесь ничего нельзя исправить)
Don (2007-04-17 11:15:00) [14]
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 не работает.
MTsv DN (2007-04-17 09:46:00) [15]Вот решение для 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;
MTsv DN (2007-04-16 19:47:00) [16]Если надо больше инфы по поводу 2. Качайте темповый проект: http://www.uus4u.com/download/uuds/temp2.rar
MTsv DN (2007-04-16 19:35:00) [17]Привет...
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 очень быстро "заканчивается"...
Vladimir Kladov (2007-04-16 16:12:00) [18]ASM не при чем, ставьте PAS_VERSION. Наверняка ошибка все-таки в другом месте. Как это может быть? Запросто. Как раз знание асма помогает понять.
Dy1 (2007-04-16 15:06:00) [19]Долго вылавливал ошибку: программа вылетала в случайные моменты времени. 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-14 22:19:00) [20]Ну так надо было сразу такой код и давать. Ежи знают, что '?' в имени файла - нонсенс, дхоть в дос, хоть в виндовс.