Почти всё сделал, теперь в настройках можно менять, ну типа скин будильника на маленький, два дня сидел за этим делом, просто все компоненты раскидать по форме програмно надо, а это как минимум надо у каждого поменять 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, переписал, теперь сохраняю в ини и читаю от туда, перестало тупить
|