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

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

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2015, 12:43   #11
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Согласен с evg_m.

А вот такой простой код:
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if SpeedButton1.Down then
  begin
    Form2 := TForm2.Create(self);
    Enabled := false;
    Form2.Show;
  end
  else
  begin
    ....
    Enabled := true;
    if Form2 <> nil then
    Form2.Free;
  end;
end;
Код:
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
    Form1.SpeedButton1.Down := false;
    Form1.SpeedButton1.Click;
end;//строка 1
Он правильный? Код рабочий (проверял), если таким обазом закрыть окно?
просто "Form2" не модальное.

В моей программе, вместо "...", написано кучу разных операций, связанных с выключением уже существующего сценария работы программы. И в процессе закрытия, после "строки 1" (в моей программе) - "class EAccessViolation with message 'Access violation at address 018283C6. Read of address 018283C6"
- что-то читаю с высвобожденной памяти, как сказано в статье. Но найти почему я читаю (дергаю "Form2") мне пока не удается

Последний раз редактировалось KBO; 22.08.2015 в 13:04.
KBO вне форума Ответить с цитированием
Старый 22.08.2015, 13:05   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так вы ж вызываете метод Free у Form2.
Видимо Form2 не инициализирован и изначально не nil, а какой-то мусор. И поэтому же рекомендуется после Free чего-либо присваивать этой ссылке nil (есть даже функция FreeAndNil).

А вообще в коде по-моему опять какая-то фигня с вызовом обработчика клика в ручную и управления другими формами откуда попало.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.08.2015, 13:29   #13
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Я уже эту функцию (FreeAndNil), таже самая фигня,
наверно Вы правы фигня с обработчиком
KBO вне форума Ответить с цитированием
Старый 22.08.2015, 13:33   #14
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Автор, всё ещё мучаешь свой клубок путанку или уже переписал код?
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 22.08.2015, 13:43   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Он правильный? Код рабочий (проверял), если таким образом закрыть окно?
Итак мы выполнили действия по первому клику
запуску
Цитата:
Код:
  if SpeedButton1.Down then
  begin
    Form2 := TForm2.Create(self);
    Enabled := false;
    Form2.Show;
  end
тем самым ЗАБЛОКИРОВАЛИ себя (Form1).
И кто теперь нас разблокирует? (опять Form2 заставим делать несвойственные ей функции?!).
Доступ ко второй части if вместе со всей формой и ее кнопками у пользователя ОТСУТСТВУЕТ!!
ну не нажимается второй раз эта кнопка, все окно заблокировано(отсутствует доступ!)

Цитата:
Код:
    Form1.SpeedButton1.Down := false;
    Form1.SpeedButton1.Click;
ТАК и есть.!

Программист может создавать собственные сообщения
Код:
TForm2 =class
...
private
  FonAfterAnser: TNotifyEvent;
public
  property OnAfterAnser: TNotifyEvent read FonAfterAnser write FonAfterAnser;//МЫ объявили свое собственное сообщение о том что все готово
end;
Теперь в любом месте где мы хотим известить главную форму пишем
Код:
if assign(FonAfterAnser) then FonAterAnser(self);/// просто сообщаем КОМУ БЫ ТО НИ БЫЛО( кто готов нас выслушать!!!) о том что все готово
Код:
Tform1 =class
....
protected
  procedure AfterAnser(sender: Tobject);
end;

procedure TForm1.AfterAnser(Sender: TObject);
var
  f: TForm2;
begin//если мы ПОДПИСАНЫ(что это смотри далее) мы придем СЮДА
  f:=sender as Tform2;// форма есть и мы даже знаем какая именно
  f.Release; //ЗАКРЫТЬ И УДАЛИТЬ потом КОГДА отработают все сообщения !!
  enabled:=true;// не забудем и себя привести в порядок (разблокировать)
end;

procedure TForm1.SpeedClick();
var
  f: TForm2;
begin
  f:=TForm2.Create(self);//если уж мы создаем и удаляем форму в процессе то НЕ БУДЕМ привязываться
 к глобальным переменным form2 (как знать захочется показать НЕСКОЛЬКО однотипных форм ОДНОВРЕМЕННО)
  f.OnAfterAnser:=self.AfterAnser;//"подписываемся" на извещение о готовности
  enabled:=false;// заблокируем СЕБЯ 
  f.Show;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.08.2015 в 14:23.
evg_m вне форума Ответить с цитированием
Старый 22.08.2015, 13:44   #16
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Автор, всё ещё мучаешь свой клубок путанку или уже переписал код?
Большую часть уже переписал

например было:
Код:
procedure TForm2.bbHitClick(Sender: TObject);
begin
  if Form1.sbAutoRepeat.Down then
  begin
    Form1.MESSAGE_APPLICATION(2, Form1.rgDirectionRepeat.ItemIndex, 0);
    Form.ibdsWord.Next;
    Form1.TimerRepeat.Enabled := true;
  end
  else Form1.MESSAGE_APPLICATION(2, Form1.rgDirectionRepeat.ItemIndex, 1);
end;

и

procedure TForm1.TimerRepeatTimer(Sender: TObject);
begin
  TimerRepeat.Enabled := false;
  Form2 := Form2.Create(self);
  try
     Form2.ShowModal
  finally
    Form2.Free;
  end;
end;
а стало

Код:
procedure TForm2.bbHitClick(Sender: TObject);
begin
  if Form1.sbAutoRepeat.Down then
    Form1.MESSAGE_APPLICATION(2, Form1.rgDirectionRepeat.ItemIndex, 0)
  else Form1.MESSAGE_APPLICATION(2, Form1.rgDirectionRepeat.ItemIndex, 1);
end;

//и

procedure TForm1.TimerRepeatTimer(Sender: TObject);
begin
  TimerRepeat.Enabled := false;
  Form2 := TForm2.Create(self);
  try
    case Form2.ShowModal of
       mrOk:
            begin
              if sbAutoRepeat.Down then
              begin
                ibdsWord.Next;
                TimerRepeat.Enabled := true;
              end;
            end;
    end
  finally
    Form2.Free;
  end;
end;

Последний раз редактировалось KBO; 22.08.2015 в 14:24.
KBO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как закрыть форму? MIKE11IPME Windows Forms 8 11.08.2013 02:07
Закрыть вторую форму WhiteForge Общие вопросы Delphi 19 03.11.2012 22:04
Закрыть форму по команде TsaveDialog kta87 Общие вопросы Delphi 10 21.05.2012 20:10
Закрыть и открыть форму Swatch Microsoft Office Access 1 31.05.2010 23:04
Как закрыть форму при показе RIO Общие вопросы Delphi 4 28.08.2009 07:54