| 
| 
 | Вопрос # 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |