Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 69

Cannot change Visible и Access violation в одном флаконе

28.10.2022, 22:07. Показов 2989. Ответов 33

Студворк — интернет-сервис помощи студентам
Добрый вечер! Возникла интересная проблема: в проекте две (на самом деле больше) формы. Первая главная, вторая нужна. Первая форма должна прогружаться и после этого прятаться, а закрытие второй формы (как и остальных) должно приводить к закрытию главной формы и проекта в целом. Но почему-то программа при компиляции выдаёт одну из двух ошибок: либо "Cannot change Visible in OnShow or OnHide", если в первой форме Visible:=false, либо "Access Violation at address 002F42BF in module (программа.хехе). Read of address 000003E0", если указанный Visible стоит в true. Вопрос, что с этим делать?)

К слову, переношу саму программу с Лазаруса, но не думаю, что это важно. Мне кажется, что ошибка кроется в form.Show или в form.Hide, но не могу найти своей ошибки/

Добавлено через 3 минуты
Сам код здесь:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
unit launchingcode;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IniFiles, Vcl.ComCtrls,
  Vcl.Imaging.pngimage, Vcl.ExtCtrls, Vcl.StdCtrls;
 
type
  TLogoForm = class(TForm)
    ProgressBar1: TProgressBar;
    MainTitleSettings: TImage;
    Greeter: TImage;
    StartChest: TImage;
    StartBackground: TImage;
    AprilCaption: TStaticText;
    AppVersion: TStaticText;
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  LogoForm: TLogoForm;
  Ini:TIniFile;
  Version, LastVisitedAccount, AccountBlockyStats, AccountID, AccountPassword, ActivationKey, DefaultLanguage:string;
//ActivationKeyApproved:string;
  EntersFirstTime, AccountLoginActive, AccountIDexists, Activation:boolean;
  OnlineStatus, OfflineStatus, NotificationsAllowed:boolean;
 
implementation
 
uses setlanguage, activationcode, main;
 
{$R *.dfm}
 
procedure TLogoForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'settings.ini');
  Ini.WriteString('Version', 'BlockyStats', 'Alpha7');
  Ini.WriteBool('AppLogin', 'EntersFirstTime', EntersFirstTime);
  Ini.WriteBool('AppLogin', 'AccountLoginActive', AccountLoginActive);
  Ini.WriteString('AppLogin', 'LastVisitedAccount', LastVisitedAccount);
  Ini.WriteString('AppLogin', 'AccountBlockyStats', AccountBlockyStats);
  Ini.WriteBool('AppLogin', 'AccountIDexists', AccountIDexists);
  Ini.WriteString('AppLogin', 'AccountID', AccountID);
  Ini.WriteString('AppLogin', 'AccountPassword', AccountPassword);
  Ini.WriteBool('AppLogin', 'Activation', Activation);
  Ini.WriteString('AppLogin', 'ActivationKey', ActivationKey);
  Ini.WriteString('System', 'Language', DefaultLanguage);
  Ini.WriteBool('System', 'OnlineStatus', OnlineStatus);
  Ini.WriteBool('System', 'OfflineStatus', OfflineStatus);
 
  Ini.Free;
end;
 
procedure TLogoForm.FormShow(Sender: TObject);
begin
  //SetLanguageWindow.Show;
  //ActivationWindow.Show;
  //MainWindow.Show;
  Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'settings.ini');
  //iniciate loading files, check online-status, then connect/not connect to servers
  //set language, check activation status, enter accounts
  EntersFirstTime:=true;
  Activation:=false;
  AccountLoginActive:=true;
  AccountIDexists:=true;
 
  Ini.Free;
  if EntersFirstTime=true then begin
    SetLanguageWindow.Show;
  end
  else begin
    //if Account
    MainWindow.Show;
  end;
  Logoform.Hide;
end;
 
end.
Действующие лица: LogoForm - главная форма проекта, код launchingcode; SetLanguageWindow - вторая форма, код соответствующий; MainWindow - основная GUI форма, тут никак не задействована
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2022, 22:07
Ответы с готовыми решениями:

FT232 на 3 функции в одном флаконе
Для командировок мне нужно иметь возможность к USB подключать несколько разных устройств. Конкретно: 1) программировать атмеги 2) 2...

Указатели и непонятки в одном флаконе!
Здравствуйте. Решил поднять новую тему про указатели. Да, литературу читал, но нихрена не понятно. Конечно, базовые концепции - не оч...

Foreach и BigInteger в одном флаконе
Доброго времени суток! Проблема такая: форич отказывается работать с БигИнтеджером static void Main(string args) ...

33
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 69
02.11.2022, 18:49  [ТС]
Студворк — интернет-сервис помощи студентам
AzAtom, отчасти этим
Цитата Сообщение от AzAtom Посмотреть сообщение
Форма появляется на мгновенье и исчезает.
А ещё, в одной из реализаций у меня уже стоял таймер на этой форме в событии OnCreate здесь (и возможно вы помните ). Тогда установка таймера, работающего на разных формах (в других формах его тоже предполагалось использовать) безрезультатно отняла несколько суток времени. Видимо не моим кривым ручкам таймеры делать
И мы же все помним, что таймер в Delphi иногда шалит (ох уж эти паскалевские флешбеки)))

Так что нет, таймер не подходит. Сейчас думаю, наверное и OnShow мне не подходит, попробую перенести всё в OnActivate
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,498
02.11.2022, 19:38
Цитата Сообщение от aprilpotter912 Посмотреть сообщение
попробую перенести всё в OnActivate
Крайне неудачное решение.

Я так и не понял смысл не показывать форму, на которой есть какие-то элементы, полосы прогресса и т.д.

Цитата Сообщение от aprilpotter912 Посмотреть сообщение
отчасти этим
Форму можно сделать минимально возможной по размеру.

Ещё можно использовать только одну форму для всего, а элементы от каждой формы разместить на панелях и показывать нужную панель. Либо можно использовать фреймы.
0
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 69
02.11.2022, 19:59  [ТС]
Нуу, смысл тот же - на первой и главной форме идут все процессы, загрузки, сохранения данных, всё это происходит за глазами пользователя автоматически. Перед запуском всех процессов проверяется логин(активация) - если приложение активировано, то программа продолжает работу, если нет - открывает формы выбора языка и активации. По завершении алгоритма открывается GUI-форма (в коде значится как MainWindow), чистое средство просмотра, предлагающее ознакомиться с данными через фреймы. На фреймах второй этап - вытащить уже сохранённые данные, и вывести статистику по ним: большее/меньшее, среднее, производные от некоторых параметров и т.д.. То есть, задачи главной формы - загрузка и архивация сырых данных, задача GUI - быстро и красиво открыться, задачи фреймов - обработать сырое и представить готовое. На мой взгляд, структура достаточно оптимальная и риски при реализации оправданы. Ну и где-то половина кода уже написана, жалко бросать(

И, теперь думаю, что вместо скрытия главной формы (ProgressBar на ней для отладки) можно и оставить её, чтобы и пользователь её видел, тогда и проблем с её исчезновением не будет
Что теперь скажете?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
03.11.2022, 09:50
Лучший ответ Сообщение было отмечено aprilpotter912 как решение

Решение

Смысл ФОРМЫ - в ее существовании на экране.
Это ВИЗУАЛЬНЫЙ элемент интерфейса
Главная форма приложения имеет дополнительную нагрузку - ее существование отождествляется с работой самого приложения. Она также имеет кнопку на панели задач.
Это базовая архитектура приложения в Делфи.
Вы в принципе можете все поменять, переписать и т.д.
Вопрос - зачем, какой профит? Зачем писать то, что уже написано до вас?
Все процессы, которые идут в фоне, не требуют для себя формы.
Если вам нужно где-то разместить компоненты доступа к БД - заведите себе datamodule например.
Представьте, что у вас веб-страница, и все встанет на свои места.
После логина можно накидать на главную форму разной информации, лучше всего упаковывая логически объединенные куски во фреймы - это те же формы, только не для открытия в отдельном окне, а для встраивания в форму.
Создали фрейм - он сам там чото работает. Удалили - не работает. Все аккуратно
Главная форма просто существует. Ну кнопки к-нить общие может держать. Показывать статус кто залогинился и прочее.
Еще раз рекомендую присмотреться к веб-страницам. Это уже проверенный десятилетиями вариант.
1
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 69
03.11.2022, 19:02  [ТС]
Хорошо, спасибо, постараюсь реализовать..

Добавлено через 1 час 58 минут
При повторном просмотре вскрылся удивительный факт - ошибка повторяется в этом коде:
Delphi
1
2
3
4
5
6
7
8
procedure TLogoForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if EntersFirstTime=true then begin
    SetLanguageWindow.Show;
  end
  else begin
    MainWindow.Show;
  end;
При этом если удалить else begin ... end, то он безошибочно открывает любую из форм. Тип ошибки всё так же зависит от значения LogoForm.Visible. Похоже на баг?
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,498
03.11.2022, 20:23
Цитата Сообщение от aprilpotter912 Посмотреть сообщение
Тип ошибки всё так же зависит от значения LogoForm.Visible. Похоже на баг?
Нет, это принцип работы VCL. Просто вы не понимаете последовательности наступления событий у форм.
Почти неделю возитесь с кучей багов, а могли бы за пол дня переделать на одну форму с фреймами или с панелями, и вот этих багов не было бы.

Итак, у вас главная форма это LogoForm. Смотрите в файле проекта (.dpr), первая создаваемая форма - это главная форма. При обычном порядке, когда у главной формы Visible = false, при создании форм сначала наступает событие OnCreate каждой формы, и затем, при показе событие OnShow формы, которая появилась на экране. То есть, так:
LogoForm.FormCreate;
SetLanguageWindow.FormCreate;
ActivationWindow.FormCreate;
MainWindow.FormCreate;
LogoForm.FormShow;

Но если главной форме (LogoForm) установить Visible = true, то события возникают так:
LogoForm.FormCreate;
LogoForm.FormShow; --- а здесь идёт обращение к ещё не созданной форме, что и вызывает ошибку!
SetLanguageWindow.FormCreate;
ActivationWindow.FormCreate;
MainWindow.FormCreate;

В принципе, порядок событий OnCreate и OnShow такой же и у остальных форм.

Поставьте на эти события у всех форм обработчики с сообщениями вида:
Delphi
1
2
3
4
procedure TLogoForm.FormCreate(Sender: TObject);
begin
  ShowMessage('LogoForm Create');
end;
и всё станет понятнее.
2
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
03.11.2022, 20:37
и тут мы еще раз обращаемся к здравому смыслу
а зачем создаются все эти формы?
они даже на экран вероятно показываться не будут.
и опять же про все это я уже писал в статье

вы и чужое не читаете и со своим справиться не можете.
зачем тогда вам помогать?
1
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 69
04.11.2022, 01:58  [ТС]
AzAtom, Спасибо огромное, очень помогло!
krapotkin, Да, наверное, ошибки у меня глупые((
Если честно, то казалось, что такое разделение будет работать лучше, т.к. любой крупный проект, те же Delphi и Lazarus, используют отдельное окно для загрузки данных, а чрезмерно нагруженное окно перестаёт отвечать, вот, в общем-то и всё.
Пойду исправлять
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,498
04.11.2022, 07:48
Цитата Сообщение от aprilpotter912 Посмотреть сообщение
любой крупный проект, те же Delphi и Lazarus, используют отдельное окно для загрузки данных
Это не окно загрузки данных, а окно логотипа (заставка), которое существует только во время загрузки программы и затем уничтожается. Тут на форуме были примеры таких окон-заставок.

Цитата Сообщение от aprilpotter912 Посмотреть сообщение
а чрезмерно нагруженное окно перестаёт отвечать
С чего бы вдруг? Если программа зависает это исключительно из-за ошибки в алгоритме, а не из-за количества элементов управления на форме.
1
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 69
04.11.2022, 14:20  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
С чего бы вдруг? Если программа зависает это исключительно из-за ошибки в алгоритме, а не из-за количества элементов управления на форме
AzAtom, не совсем. Ещё на Паскале в первой версии программы был такой алгоритм: в цикле берётся имя пользователя из первого файла, открывается второй файл с данными, и во вложенном цикле выполняется нахождение записей именно об этом пользователе и вычисление нужных параметров ствтистики. Двойной цикл заканчивается, когда достигнут Eof первого списка.
При длине первого списка от 50 до 100 строк и длине второго примерно 2000 строк обработка списка занимает 5-7 секунд, всё это время элементы на форме не отвечают вообще(в лазарусе), или в коде/данных ничего не выделяется (в Паскале), программа естественно однопоточная

И мне очень не хочется, чтобы пользователи видели это зависание
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,498
04.11.2022, 14:50
aprilpotter912, и что, думаете, добавив ещё форм дело станет лучше? В любом случае, всё продолжит работать в одном потоке, и пока обработка данного сообщения не закончится, не начнётся обработка следующего. И от количества форм в этом случае подвисания не зависят.

А чтобы интерфейс не подвисал можно либо запустить обработку в отдельном потоке, либо переделать процедуру так, чтобы она выполнялась пошагово при каждом вызове процедуры, тогда её можно поместить в обработчик OnIdle и можно обойтись одним потоком и ничего подвисать не будет.
1
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,498
Записей в блоге: 3
04.11.2022, 14:58
Цитата Сообщение от aprilpotter912 Посмотреть сообщение
При длине первого списка от 50 до 100 строк и длине второго примерно 2000 строк обработка списка занимает 5-7 секунд
всего 200000 записей и за такое время? Что-то очень долго, а это как раз говорит о том, что
Цитата Сообщение от AzAtom Посмотреть сообщение
ошибки в алгоритме
Цитата Сообщение от aprilpotter912 Посмотреть сообщение
программа естественно однопоточная
Ну так это неестественно. Ладно ДОС-овский Паскаль, там деваться некуда было... Но Лазарус-то прекрасно работает с потоками, а задача прямо требует вынести в отдельный поток цикл обработки.

Но даже и если не трогать потоки: что мешает на каждой итерации цикла дать программе обработать сообщения Windows? Не кошерный, конечно, вариант, но, таки, лучше, чем Ваш огород со скрытием/показом форм.
1
 Аватар для Newby52
43 / 38 / 5
Регистрация: 24.07.2018
Сообщений: 214
Записей в блоге: 6
04.11.2022, 15:37
Цитата Сообщение от aprilpotter912 Посмотреть сообщение
был такой алгоритм: в цикле берётся имя пользователя из первого файла, открывается второй файл с данными, и во вложенном цикле выполняется нахождение записей именно об этом пользователе и вычисление нужных параметров ствтистики. Двойной цикл заканчивается, когда достигнут Eof первого списка.
1. Такие вещи в памяти надо делать.
2. И не перебором, а предварительно отсортировать, и, хотя бы, бинарным поиском.
1
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 69
04.11.2022, 19:55  [ТС]
Понятно, понятно..
Значит, придётся пересматривать всю архитектуру проекта

Добавлено через 2 минуты
AzAtom, D1973, krapotkin, Newby52, спасибо..)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2022, 19:55

Локальная сеть и интернет в одном флаконе (домен)
Всем доброго дня! Значит ситуация следующая. Есть ПК, который в домене (домен ххх.local), ip-адрес раздаётся DHCP, у предыдущего ПК он...

Хочу EXE и DLL в одном флаконе. Не получается.
Хочу в EXE файл добавить функцию на экспорт. Типа EXE и DLL в одном флаконе. Но глючит как-то все. Выяснилось, что при загрузке библиотеки...

Ошибка Cannot change visible onshow or onhide
Пишу клавиатурный тренажёр, всё работает, но есть одна проблема, есть RadioGroup, в нём пользователь выбирает ввод символов, либо ввод...

Обработчик на закрытие формы и ошибка "Cannot change Visible in OnShow or OnHide"
Всем привет. Поставил обработчик на закрытие формы void __fastcall TForm3::FormCloseQuery(TObject *Sender, bool &CanClose) { ...

.live('change') загружается несколько раз при одном событии
Добрый день! Никто не сталкивался с проблемой многократной загрузки ajax в $('#....').live('change', function() {ajax....}); при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru