Показать сообщение отдельно
  #10  
Старый 12.11.2009, 22:57
-=C@$PeR=- -=C@$PeR=- вне форума
Прохожий
 
Регистрация: 07.11.2009
Сообщения: 14
Репутация: 11
Восклицание

Почти всё сделал, теперь в настройках можно менять, ну типа скин будильника на маленький, два дня сидел за этим делом, просто все компоненты раскидать по форме програмно надо, а это как минимум надо у каждого поменять Left, Top, Width, Height. Тестирую вылетает ошибка EAccessViolation.
Цитата:
Исключение генерируется при ошибочном доступе к памяти.



Модуль SysUtils

Описание:

Исключение класса EAccessViolation генерируется во время выполнения при возникновении следующих ситуаций:
Попытка разыменования нулевого указателя nil.
Попытка записи в кодовую страницу.
Попытка доступа к адресу вне памяти, распределенной приложению.
Исключение EAccessViolation автоматически генерируется при возникновении подобных ситуаций. Генерация его с помощью оператора raise не разрешается.

Все свойства и методы исключения EAccessViolation наследуются от базового класса Exception.

Вообще ничё не понял.


Я как понял это происходит при сохранении структуры содержащей множество настроек будильника в файл формата .dat с помощью TFileStream или чёто меди плэер тупит, много раз прогонял пошагово, то в одном месте затупит, то вдругом.

Код:
procedure SaveSettings;
var Ini : TCustomIniFile;
    reg : TRegistry;
    FS : TFileStream;
begin
  SettingToRecord; //нужно чтобы все настройки загнать в переменные
  Ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Settings.cfg');

  Ini.WriteString('Strings','Message',Setting.MessageAlarm);
  Ini.WriteString('Strings','Musicway',Setting.MusicWayName);

  Ini.WriteInteger('Colors', 'Message',Setting.ColorMsgFont);
  Ini.WriteInteger('Colors','Time',Setting.LColorDigits);
  Ini.WriteInteger('Colors','Date',Setting.LColorDate);
  Ini.WriteInteger('Colors','LabelHM',Setting.LColorHourMin);
  Ini.WriteInteger('Colors','ComboBoxFont',Setting.ColorCombBoxFont);
  Ini.WriteInteger('Colors','ComboBoxBack',Setting.ColorCombBoxBack);

  Ini.WriteBool('CheckSettings', 'AlarmClockReady',False);//чтобы будильник при
  // следующем запуске был в не запущеном состоянии, если по среди работы программы
  // вдруг сняли галочку в настройках, "сохранять время сигнала будильника"
  Ini.WriteBool('CheckSettings', 'RepeatMusic', Setting.RepeatMusic);
  Ini.WriteBool('CheckSettings', 'MonitorOff',Setting.CheckBoxMonitor);
  Ini.WriteBool('CheckSettings', 'AutoRun', Setting.AutoRun);
  Ini.WriteBool('CheckSettings','AutoRunParameters', Setting.AutoRunParameters);
  Ini.WriteBool('FormStyle', 'AlwayOnTop', Setting.OnTop);

  Ini.WriteInteger('Counters','CountRepeat', Setting.CountRepAlarm);
  Ini.WriteInteger('Counters','CountRepeatMS', Setting.CountRepMilisecond);



  if Setting.AutoRunParameters then
  begin
    Ini.WriteInteger('AlarmTime', 'Hours', HourAlarm);
    Ini.WriteInteger('AlarmTime', 'Minutes', MinAlarm);
    Ini.WriteBool('CheckSettings', 'AlarmClockReady',Form1.ACStarted);
  end; //else - здесь можно поставить запись, что будильник не запущен, вместо той что сверху, будет тоже самое
  Ini.Free;

  FS := TFileStream.Create('Size.dat', fmOpenRead or fmCreate);
  FS.Write(Setting, SizeOf(Setting));
  FS.Free; 

  reg := TRegistry.Create;
  reg.RootKey := HKEY_CURRENT_USER;
  reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',true);
  if Setting.AutoRun then //Если Автозагрузка выбрана то...
  begin
    reg.WriteString('AlarmClock',Application.ExeName);
    reg.CloseKey;
    reg.Free;
  end else
  begin
    reg.DeleteValue('AlarmClock');
    reg.CloseKey;
    reg.Free;
  end;
end;

или вообще дело не в этом.

Всё разобрался, это всё косячил TFileStream, переписал, теперь сохраняю в ини и читаю от туда, перестало тупить
Ответить с цитированием