Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2015, 09:36   #1
zdus2757
vk.com/replog
Пользователь
 
Регистрация: 04.05.2012
Сообщений: 87
Радость Windows 10 и Windows 7 try.. except

всем привет, половину ошибки впринципе описал уже в названии
дело такое
на таймере стоит код, в try except если ошбика то таймер вырубается т.е.

Код:
try
код
except
timer.enabled:=false;
end;
воот, у меня(7 винда) и все хорошо и таймер нормально выключается, но на 10 винде ошибки всеравно выходят, кто-нибудь сталкивался с такой проблемой? и как её решить?
zdus2757 вне форума Ответить с цитированием
Старый 11.12.2015, 09:49   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
воот, у меня(7 винда) и все хорошо и таймер нормально выключается, но на 10 винде ошибки всеравно выходят
Какие ошибки и куда выходят?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.12.2015, 10:16   #3
zdus2757
vk.com/replog
Пользователь
 
Регистрация: 04.05.2012
Сообщений: 87
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Какие ошибки и куда выходят?
запись в процесс идет, когда процесс закрывается, он должен выключить таймер, пробовал тестить есть процесс или нет, ну и try except пытаюсь, у меня норм выключается а на 10 ошибки выходят, ну ошибки соответственно о том что он не может записать в процесс т.к. адрес 00000000

Последний раз редактировалось zdus2757; 11.12.2015 в 10:18.
zdus2757 вне форума Ответить с цитированием
Старый 11.12.2015, 10:19   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
адрес 00000000
обычно обращение к чему-то не созданному. В остальном по твоей информации можно только гадать на кофейной гуще
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.12.2015, 10:27   #5
zdus2757
vk.com/replog
Пользователь
 
Регистрация: 04.05.2012
Сообщений: 87
Радость

Цитата:
Сообщение от Аватар Посмотреть сообщение
обычно обращение к чему-то не созданному. В остальном по твоей информации можно только гадать на кофейной гуще
так я же и говорю, он обращается в процесс которого нет :/
но изза того что у меня на 7 нет с этим проблем, я не могу узнать что нужно менять для 10, и откуда ошибка вообще идет.. знаю только то что "invalid pointer" и 00000000, после выключения процесса, т.е. таймер продолжает работать и выдает ошибки т.к. процесса не может найти

мб попробовать пару тестов сделать есть процесс или нет..
zdus2757 вне форума Ответить с цитированием
Старый 11.12.2015, 10:40   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

проверяйте результаты API функций, а не работайте наугад.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.12.2015, 10:52   #7
zdus2757
vk.com/replog
Пользователь
 
Регистрация: 04.05.2012
Сообщений: 87
Радость

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
проверяйте результаты API функций, а не работайте наугад.

я не могу проверить результаты, у меня же нет ничего(10 винда не у меня)..
в процессе в 10 все тоже хорошо все работает, проблема токо с выключением таймера
zdus2757 вне форума Ответить с цитированием
Старый 11.12.2015, 11:59   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут что есть, читайте документацию по вызываемым функциям и всегда проверяйте возвращаемое значение функций API, обрабатывайте соответствующим образом (например вывод/запись в лог осмысленной ошибки).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.12.2015, 13:37   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
вывод/запись в лог
согласен!
автор, вот тябе шуба с барскага плеча.
Код:
unit uEventLog;

interface

uses
  //============================== Модули проекта ==============================
  //========================= Модули проекта с формами =========================
  //=============================== Левые модули ===============================
  //=================== Системные модули, добавленные вручную ==================
  Windows, Messages, Classes, SysUtils;

type
  TTimerProc = procedure (hWindow: HWND; uMsg, idEvent, dwTime: DWORD); stdcall;
  TEventLog = class(TStringList)
  private
    //
    TIMER_ID: DWORD;
    FTimerProc: TTimerProc;
    //
    FActive: Boolean;
    FFileName: string;
    FTimes: Boolean;
    FTimerInterval: DWORD;


    procedure SetTimerInterval(const ANew: DWORD);
  protected
    function TimeStr: string; virtual;
  public
    constructor Create(const AFileName: string); reintroduce;
    destructor Destroy; override;
    function Flush(const AFileName: string = ''): Boolean;

    procedure Add(const S: string); reintroduce; //override;
    procedure AddLine(const ALine: string);
    procedure AddWindowMessage(const hWindow: HWND; const MSG_ID, WParam, LParam: DWORD);
    procedure AddObjectAbout(AObj: TObject; const AAbout: string);

    property Active: Boolean read FActive write FActive;
    property FileName: string read FFileName;
    property Times: Boolean read FTimes write FTimes;
    property TimerInterval: DWORD read FTimerInterval write SetTimerInterval;
  end;

var
  EventLog: TEventLog;
  TempFolder: string;

const
  MillisecondsInDay = 86400000;

function TicksToDateTimeStr(const TC: DWORD): string;

implementation

procedure TimerProc(hWindow: HWND; uMsg, idEvent, dwTime: DWORD); stdcall;
begin
  EventLog.AddLine('Autoflush.');
  EventLog.Flush();
end;

function TicksToDateTime(const TC: DWORD): TDateTime;
begin
  // TC - целое число миллисекунд.
  // сутки в миллисекундах = 24 * 3600 * 1000 = 86400000 - целая часть TDateTime
  Result:= TC / MillisecondsInDay;
end;

function TicksToDateTimeStr(const TC: DWORD): string;
var
  dt: TDateTime;
  Days: DWORD;
begin
  dt:= TC / MillisecondsInDay;
  Days:= Trunc(dt);
  if Days = 0
    then Result:= TimeToStr(Time)
    else Result:= IntToStr(Days) + 'd, ' + TimeToStr(Time);
end;

{ TEventLog }

procedure TEventLog.Add(const S: string);
begin
  if FActive then inherited Add(S);
end;

procedure TEventLog.AddLine(const ALine: string);
begin
  Add(TimeStr + ALine);
end;

procedure TEventLog.AddObjectAbout(AObj: TObject; const AAbout: string);
begin
  if (AObj is TComponent) and (TComponent(AObj).Name <> '')
    then AddLine(TComponent(AObj).Name + ' - ' + AAbout)
    else AddLine(AObj.ToString + ' - ' + AAbout);
end;

procedure TEventLog.AddWindowMessage(const hWindow: HWND; const MSG_ID, WParam,
  LParam: DWORD);
begin
  AddLine(Format('0x%.8X <--- ID: 0x%.8X; WParam: 0x%.8X; LParam: 0x%.8X',
                 [hWindow, MSG_ID, WParam, LParam]));
end;

constructor TEventLog.Create(const AFileName: string);
begin
  inherited Create();
  FFileName:= AFileName;
  FTimes:= True;
  FActive:= True;
  FTimerProc:= TimerProc;

  AddLine('--------- СТАРТ ---------');
  Add(FFileName);
end;

destructor TEventLog.Destroy;
begin
  SetTimerInterval(0);
  AddLine('--------- ВЫХОД ---------');
  if not Self.Flush()
    then Self.Flush(IncludeTrailingPathDelimiter(TempFolder) +
                    ChangeFileExt(ExtractFileName(ParamStr(0)), '.log'));
  inherited;
end;

function TEventLog.Flush(const AFileName: string = ''): Boolean;
begin
  try
    if AFileName = ''
      then Self.SaveToFile(FFileName)
      else Self.SaveToFile(AFileName);

    Result:= True;
  except
    Result:= False;
  end;
end;

procedure TEventLog.SetTimerInterval(const ANew: DWORD);
begin
  if ANew = FTimerInterval
    then Exit;

  FTimerInterval:= ANew;

  // сначала убить установленный таймер, если есть
  if TIMER_ID <> 0
    then KillTimer(0, TIMER_ID);

  // затем создать новый
  if ANew <> 0
    then TIMER_ID:= SetTimer(0, 0, FTimerInterval, @FTimerProc)
    else TIMER_ID:= 0;
end;

function TEventLog.TimeStr: string;
begin
  if FTimes
    then Result:= '[' + TimeToStr(Time()) + ']: '
    else Result:= '';
end;

initialization
  TempFolder:= GetEnvironmentVariable('TEMP');
  EventLog:= TEventLog.Create(ChangeFileExt(ParamStr(0), '.log'));

finalization
  EventLog.Free();

end.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 13.12.2015, 04:39   #10
zdus2757
vk.com/replog
Пользователь
 
Регистрация: 04.05.2012
Сообщений: 87
По умолчанию

спс за ответы, буду разбираться
zdus2757 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка Windows 8 вместо Windows 7 на ноутбук acer intel core i5 шохрухсайдалиев Windows 10 26.11.2013 18:48
После установки windows xp 32- битной нельзя установить windows 7 64-битную Mag84 Windows 3 03.12.2012 15:50
Правда ли что Windows xp 64 определяет болше Оперативки чем Windows xp 32 subbota Операционные системы общие вопросы 4 03.06.2012 17:29
Собираюсь перейти с Windows на Linux, какой из дистирибутивов наиболее похож на Windows (Xp,7)? ivan.tiran Windows 5 09.03.2012 17:51