Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2

Версия 2.89 [Delphi]


mdw   (24.03.10 16:20[20]

Владимир, вот кусок кода где сегодня словил 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() пустой он или нет....


Vladimir Kladov ©   (24.03.10 16:59[21]

Согласен, пусть будет. Еще что-нибудь? До выходных жду, потом оформлю как 2.90, как раз круглое число будет.


mdw   (24.03.10 17:49[22]


> потом оформлю как 2.90, как раз круглое число будет.

:)
У меня вроде пока усё.:)
Сегодня собрал, выложил софт, если в ближайшее время благодарные пользователи не возопят, то критических ошибок нет, т.к. используют непрерывно и интенсивно. Хотя там, в основном математика, интерфейса - одна панель с меню для выбора действия... но уже часа 4 работает без ошибок :)


MTsv DN   (24.03.10 18:15[23]

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 // todo: check it. надо закомментировать, иначе краш системы (до ресета) в Windows 98 (если кому интересно)


MTsv DN   (24.03.10 18:28[24]

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     // если <> 0 после инкремента, то AL содержит вычисленную версию
 JNZ   @@exit
 CALL  GetVersion // EAX < 0 для платформы 9х, иначе NT; AL=MajorVersion; AH=MinorVersion
 XCHG  EDX, EAX
 XOR   EAX, EAX
 TEST  EDX, EDX
 XCHG  DL, DH    // DH=MajorVersion; DL=MinorVersion

 JL    @@platform_9x
 MOV   AL, wvNT
 CMP   DX, $0400
 JZ    @@save_exit

 INC   AL // wvY2K
 CMP   DX, $0500
 JZ    @@save_exit

 INC   AL // wvXP
 CMP   DX, $0501
 JZ    @@save_exit

 INC   AL // wvWin2003Server
 CMP   DX, $0502
 JZ    @@save_exit

 INC   AL // wvVista
 CMP   DX, $0600
 JZ    @@save_exit

 INC   AL // wvSeven
 CMP   DX, $0601
 JZ    @@save_exit
@@platform_9x:
 CMP   DH, 4
 JB    @@save_exit // wv31
 INC   AL // wv95
 CMP   DX, $040A
 JB    @@save_exit
 INC   AL // wv98
 CMP   DX, $045A
 JB    @@save_exit
 INC   AL // wvME
@@save_exit:
 MOV   byte ptr [SaveWinVer], AL
@@exit:
end;        


MTsv DN   (24.03.10 18:33[25]

Если кому интересно. Файл MCKAppExpert200x. Заменить:
dlg.Filter     := '*.dpr';
на
dlg.Filter     := 'DPR files|*.dpr';

dlg.Filter := '*.pas';
на
dlg.Filter := 'PAS files|*.pas';
Для корректной работы в Windows 7


Vladimir Kladov ©   (24.03.10 19:11[26]

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     // если <> 0 после инкремента, то AL содержит вычисленную версию
JNZ   @@exit
CALL  GetVersion // EAX < 0 для платформы 9х, иначе NT; AL=MajorVersion; AH=MinorVersion
XCHG  EDX, EAX
XOR   EAX, EAX
TEST  EDX, EDX
XCHG  DL, DH    // DH=MajorVersion; DL=MinorVersion

JL    @@platform_9x
MOV   AL, wvNT
CMP   DX, $0400
JZ    @@save_exit

INC   AL // wvY2K
SUB   DX, $0500
JZ    @@save_exit

INC   AL // wvXP
//CMP   DX, $0501
DEC   DX
JZ    @@save_exit

INC   AL // wvWin2003Server
//CMP   DX, $0502
DEC   DX
JZ    @@save_exit

INC   AL // wvVista
CMP   DX, $0600 - $0502
JZ    @@save_exit

INC   AL // wvSeven
//CMP   DX, $0601
//DEC   DX
JMP   @@save_exit
@@platform_9x:
CMP   DH, 4
JB    @@save_exit // wv31
INC   AL // wv95
CMP   DX, $040A
JB    @@save_exit
INC   AL // wv98
CMP   DX, $045A
JB    @@save_exit
INC   AL // wvME
@@save_exit:
MOV   byte ptr [SaveWinVer], AL
@@exit:
end;              

?


MTsv DN   (24.03.10 19:29[27]

ExtractFilePath
> путь 'C:aaa.txt'
Я дико извиняюсь...а что такой путь возможен? 8) С таким же успехом можно любую строчку как путь в качестве примера привести.

> function AnsiEq - почему непонятно? Я параметр на KOLString поменял глядя на реализацию. -> AnsiCompareStrNoCase(S1, S2:KOLString). Иначе лишние конверсии строк замедляют в случае UNICODE_CTRL.
Вы не поняли. Вопрос был: почему в KOL_ASM.inc все еще используется AnsiString.
То же самое для procedure TDirList.ScanDirectoryEx.

WinVer
Как угодно, если Ваш код работает. У меня щас не на чем проверить. Просто Вы асм-версию отключили, вот решил "подкинуть" рабочий код.


Vladimir Kladov ©   (24.03.10 19:57[28]

Вообще-то при каких-то условиях путь такой возможен. Вот код (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; и преобразование результата.

А для второго
{$IFDEF ASM_UNICODE}
procedure TDirList.ScanDirectoryEx
, т.е. ассемблер отрубается для UNICODE_CTRLS. Как и раньше было, собственно.

WinVer Мне тоже не на чем, да я и не собираюсь ставить Висту-Семерку. Просто если выйдет (не дай, не дай) версия 8, то предложенная Вами версия станет показывать что-то типа WinME, будет смешно :)


Vladimir Kladov ©   (24.03.10 20:06[29]

А нет, не WinME. Выйдет за пределы диапазона значений. Будет что-то типа Seven+3.


MTsv DN   (24.03.10 20:24[30]

почему в KOL_ASM.inc все еще используется AnsiString
Пардон. Ошибся.


vampir_infernal   (25.03.10 00:53[31]

Спасибо, Владимир!

KOL.PAS
строка 13256

{$IFDEF _D2006orHigher}
{$I MCKfakeClasses200x.inc} // Dufa
{$ENDIF}


А в архиве с KOL2.89 поставляется MCKfakeClasses.inc. Или я что-то пропустил?


vampir_infernal   (25.03.10 01:12[32]

Видать, я всё-таки что-то пропустил :) SVN лежит, где взять этот MCKfakeClasses200x.inc ?


Hallif ©   (25.03.10 02:49[33]

KOL.pas
Описание: различие interface/implementation объявлений параметров функций:
interface
function SeekMemStream( Strm: PStream; {$IFNDEF STREAM_COMPAT} const {$ENDIF} MoveTo: TStrmMove; MoveFrom: TMoveMethod ): TStrmSize;
implementation
function SeekMemStream( Strm: PStream; const MoveTo: TStrmMove; MoveFrom: TMoveMethod ): TStrmSize;
аналогично и для
SetSizeMemStream,
ReadMemStream,
WriteMemStream,
WriteExMemoryStream
в KOL_ASM.inc объявления совпадают.


Hallif ©   (25.03.10 05:45[34]

KOL.pas
Метод SetName обекта TObj.
Описание: переопределение значения константы NewName в теле метода.
Компилятор: D140,D200,FPC2xx.
...
 if FOwnerObj.fNamedObjList = nil then
    FOwnerObj.fNamedObjList := NewList;
 FName := NewName;
 {$IFDEF UNIQUE_NAMES}
 for i := 0 to FOwnerObj.fNamedObjList.Count-1 do
 begin
   if PObj( FOwnerObj.fNamedObjList.Items[ i ] ).FName = NewName then
   begin
      FName := '';  
       //                NewName := ''; Old code
     break;
   end;
 end;
 {$ENDIF}
      //                 FName := NewName; Old code
 if FName = '' then
    FOwnerObj.fNamedObjList.Remove( @ Self )
 else
 if FOwnerObj.fNamedObjList.IndexOf( @ Self ) < 0 then
    FOwnerObj.fNamedObjList.Add( @ Self );
...


Hallif ©   (25.03.10 12:24[35]

#issue_289
KOL_ASM.inc
Описание: различие interface/implementation объявлений параметров функций, предполагалось:

kol_asm.implementation [4183]
function TStream.Write(var Buffer; {$IFNDEF STREAM_COMPAT} const {$ENDIF} Count: TStrmSize): TStrmSize; //Dimaxx ©   (28.10.08 02:41)

kol_asm.implementation [4190]
function TStream.Seek({$IFNDEF STREAM_COMPAT} const {$ENDIF} MoveTo: TStrmMove; MoveMethod: TMoveMethod): TStrmSize; //Dimaxx ©   (28.10.08 02:41)


Vladimir Kladov ©   (25.03.10 16:37[36]

По поводу SetName - это для оптимизации?
Посмотрите, что будет в этом случае (определены символы Use_names, Unique_names):

procedure TForm1.Button3Click(Sender: PObj);
begin
   ShowMessage( 'before: <' + Button3.Name + '>' );
   Button3.SetName( Form, 'A' );
   ShowMessage( 'after: <' + Button3.Name + '>' );
end;


Vladimir Kladov ©   (25.03.10 16:39[37]

Там надо const убрать из декларации.


Vladimir Kladov ©   (27.03.10 17:07[38]

Больше замечаний не будет, как я понимаю. Буду оформлять выпуск.


Страницы: 1 2 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо