Каково корректное использование GetLastError и FormatMessage в Delphi?

Как я могу сделать огонь предупреждения при каждом изменении, кроме первоначально?

blockquote>

Нокаут будет вызывать обратный вызов обновления первоначально, когда привязка применяется к элемент и отслеживать любые зависимости (наблюдаемые / вычисленные), к которым вы обращаетесь. Когда какая-либо из этих зависимостей изменится, обратный вызов обновления будет вызван еще раз.

Я не думаю, что можно запустить только изменения, а не изначально.

Вы можете создайте обходное решение, соответствующее вашему сценарию, добавив событие изменения, связанное с вашим элементом внутри init.

init: function(element, valueAccessor) {
   // element should be the element you want to attach change event.
   $(element).on('change', function (value)
   {
      // do your stuff.
    });
}
24
задан Drew Gibson 21 March 2009 в 10:10
поделиться

2 ответа

В Delphi существует интегрированная функция помощника: SysErrorMessage. Это - по существу обертка к FormatMessage, но намного более простой использовать в Вашем случае. Просто обеспечьте код ошибки, для которого Вы нуждаетесь в текстовом описании.

, Например, можно использовать это для отображения последней ошибки:

ShowMessage(SysErrorMessage(GetLastError))

, Если Вы хотите повысить исключение с этим сообщением, это еще более просто:

RaiseLastOSError;

Важный : Удостоверьтесь, что нет никакого дополнительного вызова API между провальной функцией и Вашим вызовом GetLastError, иначе последняя ошибка будет сброшена.

60
ответ дан Peter Rader 28 November 2019 в 18:10
поделиться

Хотя DR верен, есть проблема с этим подходом: он не позволяет вам указать контекст, в котором произошла ошибка. Когда-либо видел ошибку "Ошибка API-функции". без какой-либо мудрости, какая это была функция и где это произошло?

Вот почему я написал функции RaiseLastOsErrorEx и Win32CheckEx:

procedure RaiseLastOsErrorEx(const _Format: string);
begin
  RaiseLastOsErrorEx(GetLastError, _Format);
end;

procedure RaiseLastOsErrorEx(_ErrorCode: integer; _Format: string); overload;
var
  Error: EOSError;
begin
  if _ErrorCode <> ERROR_SUCCESS then
    Error := EOSError.CreateFmt(_Format, [_ErrorCode, SysErrorMessage(_ErrorCode)])
  else
    Error := EOsError.CreateFmt(_Format, [_ErrorCode, _('unknown OS error')]);
  Error.ErrorCode := _ErrorCode;
  raise Error;
end;

function GetLastOsError(out _Error: string; const _Format: string = ''): DWORD;
begin
  Result := GetLastOsError(GetLastError, _Error, _Format);
end;

function GetLastOsError(_ErrCode: integer; out _Error: string; const _Format: string = ''): DWORD;
var
  s: string;
begin
  Result := _ErrCode;
  if Result <> ERROR_SUCCESS then
    s := SysErrorMessage(Result)
  else
    s := _('unknown OS error');
  if _Format <> '' then
    try
      _Error := Format(_Format, [Result, s])
    except
      _Error := s;
    end else
    _Error := s;
end;

function Win32CheckEx(_RetVal: BOOL; out _ErrorCode: DWORD; out _Error: string;
  const _Format: string = ''): BOOL;
begin
  Result := _RetVal;
  if not Result then
    _ErrorCode := GetLastOsError(_Error, _Format);
end;

(они являются частью модуля u_dzMiscUtils моей доступной библиотеки dzLib). здесь: https://sourceforge.net/p/dzlib/code/HEAD/tree/dzlib/trunk/src/u_dzOsUtils.pas

9
ответ дан dummzeuch 28 November 2019 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: