|
Вопрос # 3 303/ вопрос решён / |
|
Приветствую, уважаемые эксперты!
Не пойму - при открытии Form2 вылетает ошибка:
EAccessViolation - первый раз столкнулся
Код:фрагмент кода
 |
Вопрос задал: igoriy (статус: Посетитель)
Вопрос отправлен: 19 октября 2009, 11:01
Состояние вопроса: решён, ответов: 3.
|
Ответ #1. Отвечает эксперт: DNK
Здравствуйте, igoriy!
Вы пытаетесь показать Form2, которая еще не создана. К моменту, когда выполняется метод TForm1.FormCreate, отработка Application.CreateForm(TForm2, Form2); еще не произвелась. Вызывайте код в событии OnShow.
 |
Ответ отправил: DNK (статус: Студент)
Время отправки: 19 октября 2009, 11:09
Оценка за ответ: 5
Комментарий к оценке: Огромное спасибо
|
Ответ #2. Отвечает эксперт: min@y™
Form2.Show; // <--- Ошибка вылетает тут? Форма 2 ещё не создана.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 19 октября 2009, 11:12
Оценка за ответ: 5
|
Ответ #3. Отвечает эксперт: Вадим К
Здравствуйте, igoriy!
В коде есть ещё несколько потенциальных мест, которые сейчас скорее всего работают, но в будущем могут дать неожиданную проблему.
Начало кода, где пытаетесь выделить месяц и день через ужасные преобразования. Не проще воспользоваться готовой процедурой и сделать всё в одну строку? читаем здесь http://www.delphibasics.co.uk/RTL.asp?Name=DecodeDate
после строки вида StrF:= f.Strings[i];
надо объязательно вставить проверку на пустую строку, где то так
if (trim(StrF) = '') continue;
По поводу формы. если её всё таки хочется показать, то оптимально использовать такой код
with TForm2.Create do
try
ShowModal;
finally
Free;
end;
Правда это покажет форму и удалит её по закрытию. Для более детального понимания, советую в разделе статей поискать мою статью о формах.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 19 октября 2009, 11:26
Оценка за ответ: 4
|
Мини-форум вопроса
Всего сообщений: 11; последнее сообщение — 19 октября 2009, 11:56; участников в обсуждении: 4.
|
Тов. Женька (статус: 3-ий класс), 19 октября 2009, 11:12 [#1]:
Теряюсь в догадках. Желательно бы весь код увидеть.
|
|
igoriy (статус: Посетитель), 19 октября 2009, 11:16 [#2]:
Так я же код прикрепил а на форме 2 ничего еще нет.
И еще предыдущие ответы,а как мне быть если вся проверка проходит в Form1.Create и вызов происходит из ее цикла?
|
|
min@y™ (статус: Доктор наук), 19 октября 2009, 11:25 [#3]:
Цитата (igoriy):
а как мне быть если вся проверка проходит в Form1.Create и вызов происходит из ее цикла?
А выкинь Form2 из списка автосоздаваемых форм и создавай её вручную вот тут:
begin
ShowMessage('2');
Form2:= TForm2.Create(Application); <--- !!!
Form2.Show();
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Тов. Женька (статус: 3-ий класс), 19 октября 2009, 11:26 [#4]:
Оно-то конечно так, просто
Надо в свойствах проекта форму 2 вынести в Available forms (для BDS2006: Project - Options... - Forms) из Auto-create forms.
Тогда надо будет изменить код и создавать форму динамически, типа:
procedure Test;
var forma : TForm2;
begin
...
forma := TForm2.Create(nil);
...
forma.ShowModal;
...
forma.Free;
...
end;
Вот примерно так.
|
|
igoriy (статус: Посетитель), 19 октября 2009, 11:29 [#5]:
min@y™ спасибо, а еще можно весь код перенести из Form1.Create в Form1.Show?
|
|
Вадим К (статус: Академик), 19 октября 2009, 11:30 [#6]:
Код то можно перенести. Вот только надо подумать, а что это даст. Можно сделать себе ещё проблем . На момент создания первой формы, вторая ещё не создана и это и стает причиной.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 19 октября 2009, 11:32 [#7]:
Чудовищный кусок кода! Бррррррррр....
DayNow:= FormatDateTime('ddddd',Date());
Delete(DayNow,3,8);
DayNow1:= StrToInt(DayNow); // сегодняшний день
DayNow:= FormatDateTime('ddddd',Date());
Delete(DayNow,1,3);
Delete(DayNow,3,8);
MunNow:= StrToInt(DayNow); // сегодняшний месяц
Посмотри справку по процедуре DecodeDate().
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 19 октября 2009, 11:33 [#8]:
Кинулся я уже написал выше это ))
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 19 октября 2009, 11:34 [#9]:
Цитата (igoriy):
а еще можно весь код перенести из Form1.Create в Form1.Show?
Я бы этот код перенёс в отдельную функцию и вызывал бы её, когда мне нужно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
igoriy (статус: Посетитель), 19 октября 2009, 11:35 [#10]:
Спасибо всем - буду читать
|
|
min@y™ (статус: Доктор наук), 19 октября 2009, 11:56 [#11]:
Ну типа вот как-то так (проверку на валидность данных сам напишешь):
procedure TForm1.Proc;
var
f: TStrings;
i: Integer;
Year, MunZ, Poz, DayNow, MunNow, DayZ: Word;
StrF, FIO: string;
begin
DecodeDate(Date(), Year, MunNow, DayNow);
f:= TStringList.Create();
try
f.LoadFromFile('DN1.dat'); //читаем из файла
for i:= 0 to f.Count - 1 do
begin
Poz:= Pos('|', f[i]); // находим разделитель
FIO:= Copy(f[i], 1, Poz - 1);
StrF:= Copy(f[i], Poz + 1, Length(f[i]));
DecodeDate(StrF, Year, MunZ, DayZ);
if MunZ = MunNow
then begin
if DayZ = DayNow1
then ShowMessage('1');
else if DayZ = DayNow1 + 1
then begin
ShowMessage('2');
Form2:= TForm2.Create(Application);
Form2.Show();
end;
end;
end;
finally
f.Free();
end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
31 января 2011, 20:03: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|