Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 303

/ вопрос решён /

Приветствую, уважаемые эксперты!
Не пойму - при открытии Form2 вылетает ошибка:
EAccessViolation - первый раз столкнулся
Код:фрагмент кода

igoriy Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

igoriy (статус: Посетитель), 19 октября 2009, 11:16 [#2]:

Так я же код прикрепил а на форме 2 ничего еще нет.
И еще предыдущие ответы,а как мне быть если вся проверка проходит в Form1.Create и вызов происходит из ее цикла?
min@y™

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

igoriy (статус: Посетитель), 19 октября 2009, 11:29 [#5]:

min@y™ спасибо, а еще можно весь код перенести из Form1.Create в Form1.Show?
Вадим К

Вадим К (статус: Академик), 19 октября 2009, 11:30 [#6]:

Код то можно перенести. Вот только надо подумать, а что это даст. Можно сделать себе ещё проблем:). На момент создания первой формы, вторая ещё не создана и это и стает причиной.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

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™

min@y™ (статус: Доктор наук), 19 октября 2009, 11:34 [#9]:

Цитата (igoriy):

а еще можно весь код перенести из Form1.Create в Form1.Show?


Я бы этот код перенёс в отдельную функцию и вызывал бы её, когда мне нужно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
igoriy

igoriy (статус: Посетитель), 19 октября 2009, 11:35 [#10]:

Спасибо всем - буду читать
min@y™

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)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.04 сек.