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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2010, 21:00   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию Решение "EAccesViolation at adress 004302EF"

(По или поискал, нашел топик, но там не сказано как решить проблему)
2 формы. (Form1 & Form2)
на первой есть чекбокс, и кнопка(вызывает 2 форму).
на второй только чекбокс.

вот проблема.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Inifiles;

type
  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.show;
end;

procedure TForm1.FormCreate(Sender: TObject);
Var
Ini:TIniFile;
begin
ini:=Tinifile.Create(ExtractFilePath(ParamStr(0))+'Settings.ini');
Button1.Caption:=ini.ReadString('Main','test','button');
CheckBox1.Checked:=ini.ReadBool('Main','checkbox',false);
Form2.CheckBox1.Checked:=Ini.ReadBool('Main2','checkbox',true);
ini.Free;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
Var
Ini:TIniFile;
begin
ini.WriteString('Main','test',Button1.Caption);
ini.WriteBool('Main','checkbox',CheckBox1.Checked);
ini.WriteBool('Main2','checkbox',Form2.CheckBox1.Checked);
ini.Free;
end;

end.
при открытии приложения или закрытии...(если закоментировать {Form2.CheckBox1.Checked:=Ini.ReadB ool('Main2','checkbox',true);})
возникает "EAccesViolation at adress 004302EF"

как решить проблему?
то что программа пытается послать настройки на не существующую форму, это понятно, но какое решение?
пожалуйста... как?

Я же вам ясно написал - один вопрос - одна тема...
Что ж вы опять винегрет тут устраиваете ?
Как люди потом будут искать интересующее их, если вы все в кучу смешали ?

Последний раз редактировалось mihali4; 14.02.2010 в 21:09.
Человек_Борща вне форума Ответить с цитированием
Старый 14.02.2010, 21:11   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Какова очередность создания форм в файле проекта ?
Вы уверены, что вторая форма создается до создания первой ?
mihali4 вне форума Ответить с цитированием
Старый 14.02.2010, 22:40   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

хм..
Цитата:
Вы уверены, что вторая форма создается до создания первой ?
можно по подробнее..?

нет все в стандартном порядке.. сначала form1 потом form2 (В этом проблема? о_О)

p.S. извиняюсь, просто не могу привыкнуть к таким правилам, обычно на всех форумах просят не плодить топики.. а тут на оборот.(прошу прощения, исправлюсь)

Последний раз редактировалось Человек_Борща; 14.02.2010 в 22:52.
Человек_Борща вне форума Ответить с цитированием
Старый 14.02.2010, 23:00   #4
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Локализацию форм и чтение настроек из ini-файла нужно сделать отдельно для каждой формы. Главная форма создается самой первой, поэтому обращение из её OnCreate к другим формам в любом случае будет вызывать AV, т.к. они к тому моменту еще не созданы.
maxionans вне форума Ответить с цитированием
Старый 15.02.2010, 01:00   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Проще говоря, перенесите всю обработку из события TForm1.FormCreate в событие TForm1.FormActivate
Должно помочь...
mihali4 вне форума Ответить с цитированием
Старый 15.02.2010, 01:46   #6
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Перенос в OnActivate, это плохая идея, т.к. тогда этот код будет выполняться каждый раз, когда форма получает фокус.
maxionans вне форума Ответить с цитированием
Старый 15.02.2010, 07:55   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
(В этом проблема?
Именно в этом.
Можно выдрать из dpr
Application.CreateForm(TForm2, Form2);
И вставить в TForm1.FormCreate, я иногда так делаю.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.02.2010, 18:45   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

хм, maxionans ваш вариант кажется более интересным!
вот что я имею...
на форме настроек.. TSettingsForm(от туда и идёт управление, языком приложения через переключение чекбоксов...)
Код:
procedure TSettingsForm.LangRussianClick(Sender: TObject);
begin
  if LangRussian.Checked = True then
  begin
    MainForm.AutoSearchBtnStart.Caption := 'Старт';
    MainForm.SkinProvider.AddedTitle.Text := '';
    SettingsForm.Caption := 'Настройки';
    SettingsForm.skinAppyRight.Hint := 'установив галочку, выбранный скин будет применяться сразу, а не после нажатия "Применить и выйти"';
    AboutForm.Caption := 'О программе...';
  end;
end;
если рассматривать ваш вариант, то придется на всех формах по натыкать чекбоксов...
как вариант, организовать цикл который будет ждать пока создастся форма, и передать её соответствующие значения в зависимости от состояния чекбоксов на форме...

ещё как вариант:
при переключении создавать все имеющиеся формы невидимыми, переводить контролы, и закрывать... как организовать пака не придумал..

может поможете?

p.s. аналогично передаче настроек.. с одной формы на другую...

Последний раз редактировалось Человек_Борща; 15.02.2010 в 20:06.
Человек_Борща вне форума Ответить с цитированием
Старый 15.02.2010, 18:48   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от maxionans Посмотреть сообщение
Перенос в OnActivate, это плохая идея, т.к. тогда этот код будет выполняться каждый раз, когда форма получает фокус.
Вы этот сказанный вами бред хотя бы проверили, что ли...
А то как-то совсем уж неудобно получается...
Попробуйте-ка примитивный проектик, в котором есть всего-то навсего:
Код:
procedure TForm1.FormActivate(Sender: TObject);
begin
ShowMessage('aaaa');
Application.ProcessMessages;
end;
и убедитесь, что ShowMessage будет выполнено один-единственный раз - при запуске программы...
mihali4 вне форума Ответить с цитированием
Старый 16.02.2010, 21:56   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

поможет кто-небуть?
Человек_Борща вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получаю ошибку Access violation at adress fs444 Общие вопросы C/C++ 9 16.12.2009 08:04
решение ДУ Gronex Паскаль, Turbo Pascal, PascalABC.NET 0 20.05.2009 20:51
решение ДУ DEBAZOL Паскаль, Turbo Pascal, PascalABC.NET 1 04.04.2008 21:49
Как изменить IP adress на локальном ПК dec.v Работа с сетью в Delphi 1 06.12.2007 10:02