-
Владимир, вот кусок кода где сегодня словил AV. Получается, что перед вызовом Find(), нужно всегда проверять Count > 0? Тогда все же проще сразу вставить в метод эту проверку. ListIdUnusedSwatches:= NewStrList; ListIdUnusedSwatches.Text := inddDocument.GetUnusedSwatchesId; ListIdUnusedSwatches.AnsiSort(False);
for i:= 1 to ColorCount do begin ... ColorStorage.IsInDocument:= not ListIdUnusedSwatches.Find(ColorStorage.ColorId, FindIndex);
... end;
В этом примере я понятия не имею пустой список ListIdUnusedSwatches или нет. Единственный вариант проверять перед каждым вызовом Find() пустой он или нет....
-
Согласен, пусть будет. Еще что-нибудь? До выходных жду, потом оформлю как 2.90, как раз круглое число будет.
-
> потом оформлю как 2.90, как раз круглое число будет.
:) У меня вроде пока усё.:) Сегодня собрал, выложил софт, если в ближайшее время благодарные пользователи не возопят, то критических ошибок нет, т.к. используют непрерывно и интенсивно. Хотя там, в основном математика, интерфейса - одна панель с меню для выбора действия... но уже часа 4 работает без ошибок :)
-
1. function RemoveSpaces( const S: AnsiString ): AnsiString; Заменит на KOLString. 2. themelib = 'uxtheme'; Предлагаю добавить ".dll". Не помню где, но получал ошибку. 3. Функция function ExtractFilePath( const Path : KOLString ) : KOLString Я правил для себя так: function ExtractFilePath(const Path: KOLString): KOLString;
var
i: Integer;
begin
for i := Length(Path) - 1 downto 1 do begin
if (Path[i] = '\') then begin
Result := Copy(Path, 1, i);
Exit;
end;
end;
Result := Path;
end; Если честно было это давно, т.ч. причину не помню, возможно производительность выше, щас проверять лень. 4. WndProcToolbarCtrl Строчку if WinVer >= wvNT then надо закомментировать, иначе краш системы (до ресета) в Windows 98 (если кому интересно)
-
KOL_ASM.inc ========== 1. Это вообще не понятно: function AnsiEq( const S1, S2 : AnsiString ) : Boolean;
procedure TDirList.ScanDirectoryEx(const DirPath, Filters: KOLString;
2. Вот асм версия для WinVer: function WinVer : TWindowsVersion;
asm
MOVSX EAX, byte ptr [SaveWinVer]
INC AH JNZ @@exit
CALL GetVersion XCHG EDX, EAX
XOR EAX, EAX
TEST EDX, EDX
XCHG DL, DH
JL @@platform_9x
MOV AL, wvNT
CMP DX, $0400
JZ @@save_exit
INC AL CMP DX, $0500
JZ @@save_exit
INC AL CMP DX, $0501
JZ @@save_exit
INC AL CMP DX, $0502
JZ @@save_exit
INC AL CMP DX, $0600
JZ @@save_exit
INC AL CMP DX, $0601
JZ @@save_exit
@@platform_9x:
CMP DH, 4
JB @@save_exit INC AL CMP DX, $040A
JB @@save_exit
INC AL CMP DX, $045A
JB @@save_exit
INC AL @@save_exit:
MOV byte ptr [SaveWinVer], AL
@@exit:
end;
-
Если кому интересно. Файл MCKAppExpert200x. Заменить: dlg.Filter := '*.dpr'; на dlg.Filter := 'DPR files|*.dpr'; dlg.Filter := '*.pas'; на dlg.Filter := 'PAS files|*.pas'; Для корректной работы в Windows 7
-
ExtractFilePathЭто не пойдет. Сравните вашу версию и из KOL.pas. Сразу примеры - путь 'C:aaa.txt' - не вернет ваша 'C:', для пути 'aaa.txt' правильно возвращать пустую строку. Кроме того, очень важно, чтобы можно было без всяких дополнительных проверок гарантированно получить ExtractFilePath и прибавить имя файла. Как отдельную функцию, типа ExtractFilePathFast - пожалуйста. Но даже в этом случае мне кажется боле корректным при отсутствии '\' возвращать пустую строку, а не саму входную. WndProcToolbarCtrlА, вот зачем там комментарий. К сожалению, не могу проверить сейчас не на чем, даже виртуалки под рукой нет. Пока пусть будет закомментарено тогда. function AnsiEq - почему непонятно? Я параметр на KOLString поменял глядя на реализацию. -> AnsiCompareStrNoCase(S1,S2:KOLString). Иначе лишние конверсии строк замедляют в случае UNICODE_CTRL. procedure TDirList.ScanDirectoryEx - аналогично, от реализации. function WinVer : TWindowsVersion; - а если так:
function WinVer : TWindowsVersion;
asm
MOVSX EAX, byte ptr [SaveWinVer]
INC AH JNZ @@exit
CALL GetVersion XCHG EDX, EAX
XOR EAX, EAX
TEST EDX, EDX
XCHG DL, DH
JL @@platform_9x
MOV AL, wvNT
CMP DX, $0400
JZ @@save_exit
INC AL SUB DX, $0500
JZ @@save_exit
INC AL DEC DX
JZ @@save_exit
INC AL DEC DX
JZ @@save_exit
INC AL CMP DX, $0600 - $0502
JZ @@save_exit
INC AL JMP @@save_exit
@@platform_9x:
CMP DH, 4
JB @@save_exit INC AL CMP DX, $040A
JB @@save_exit
INC AL CMP DX, $045A
JB @@save_exit
INC AL @@save_exit:
MOV byte ptr [SaveWinVer], AL
@@exit:
end; ?
-
ExtractFilePath > путь 'C:aaa.txt' Я дико извиняюсь...а что такой путь возможен? 8) С таким же успехом можно любую строчку как путь в качестве примера привести.
> function AnsiEq - почему непонятно? Я параметр на KOLString поменял глядя на реализацию. -> AnsiCompareStrNoCase(S1, S2:KOLString). Иначе лишние конверсии строк замедляют в случае UNICODE_CTRL. Вы не поняли. Вопрос был: почему в KOL_ASM.inc все еще используется AnsiString. То же самое для procedure TDirList.ScanDirectoryEx.
WinVer Как угодно, если Ваш код работает. У меня щас не на чем проверить. Просто Вы асм-версию отключили, вот решил "подкинуть" рабочий код.
-
Вообще-то при каких-то условиях путь такой возможен. Вот код (VCL): procedure TForm1.Button1Click(Sender: TObject);
var SL: TStringList;
begin
SL := TStringList.Create;
TRY
SL.LoadFromFile( 'C:aaa.txt' );
SL.SaveToFile( ExtractFilePath( Application.ExeName ) + 'aaa.txt' );
FINALLY
SL.Free
END;
end;
Работает. Пользователь, зная, что такой путь работает, может набрать его вручную, сохранить в ini-файле и т.д. почему в KOL_ASM.inc все еще используется AnsiString.Не понял. У меня в KOL_ASM.inc: function AnsiEq( const S1, S2 : KOLString ) : Boolean;
asm
CALL AnsiCompareStrNoCase
TEST EAX, EAX
SETZ AL
end; Прямой вызов функции function AnsiCompareStrNoCase(const S1, S2: KOLString): Integer; и преобразование результата. А для второго
procedure TDirList.ScanDirectoryEx , т.е. ассемблер отрубается для UNICODE_CTRLS. Как и раньше было, собственно. WinVer Мне тоже не на чем, да я и не собираюсь ставить Висту-Семерку. Просто если выйдет (не дай, не дай) версия 8, то предложенная Вами версия станет показывать что-то типа WinME, будет смешно :)
-
А нет, не WinME. Выйдет за пределы диапазона значений. Будет что-то типа Seven+3.
-
почему в KOL_ASM.inc все еще используется AnsiString Пардон. Ошибся.
-
Спасибо, Владимир! KOL.PAS строка 13256
А в архиве с KOL2.89 поставляется MCKfakeClasses.inc. Или я что-то пропустил?
-
Видать, я всё-таки что-то пропустил :) SVN лежит, где взять этот MCKfakeClasses200x.inc ?
-
KOL.pas Описание: различие interface/implementation объявлений параметров функций: interface function SeekMemStream( Strm: PStream; const MoveTo: TStrmMove; MoveFrom: TMoveMethod ): TStrmSize; implementation function SeekMemStream( Strm: PStream; const MoveTo: TStrmMove; MoveFrom: TMoveMethod ): TStrmSize; аналогично и для SetSizeMemStream, ReadMemStream, WriteMemStream, WriteExMemoryStream в KOL_ASM.inc объявления совпадают.
-
KOL.pas Метод SetName обекта TObj. Описание: переопределение значения константы NewName в теле метода. Компилятор: D140,D200,FPC2xx. ...
if FOwnerObj.fNamedObjList = nil then
FOwnerObj.fNamedObjList := NewList;
FName := NewName;
for i := 0 to FOwnerObj.fNamedObjList.Count-1 do
begin
if PObj( FOwnerObj.fNamedObjList.Items[ i ] ).FName = NewName then
begin
FName := '';
break;
end;
end;
if FName = '' then
FOwnerObj.fNamedObjList.Remove( @ Self )
else
if FOwnerObj.fNamedObjList.IndexOf( @ Self ) < 0 then
FOwnerObj.fNamedObjList.Add( @ Self );
...
-
#issue_289 KOL_ASM.inc Описание: различие interface/implementation объявлений параметров функций, предполагалось: kol_asm.implementation [4183]function TStream.Write(var Buffer; const Count: TStrmSize): TStrmSize; //Dimaxx © (28.10.08 02:41) kol_asm.implementation [4190]function TStream.Seek( const MoveTo: TStrmMove; MoveMethod: TMoveMethod): TStrmSize; //Dimaxx © (28.10.08 02:41)
-
По поводу SetName - это для оптимизации? Посмотрите, что будет в этом случае (определены символы Use_names, Unique_names): procedure TForm1.Button3Click(Sender: PObj);
begin
ShowMessage( 'before: <' + Button3.Name + '>' );
Button3.SetName( Form, 'A' );
ShowMessage( 'after: <' + Button3.Name + '>' );
end;
-
Там надо const убрать из декларации.
-
Больше замечаний не будет, как я понимаю. Буду оформлять выпуск.
|