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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2011, 18:48   #1
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
Восклицание Тупая проблема - переменная не передаётся!

Здравствуйте!
Столкнулся с тупейшей проблемой не могу решить уже два дня -есть главное окно программы MDIForm, из него по нажатию батона создаётся новое окно MDIChild:
Код:
begin
//   Fx:=Formx.Create(self);
   Fx:=Formx.Create(Application);
   Fx.Varx:=1;
   Fx.Show;
end;
В создаваемом окне есть переменная
Код:
public
    Varx: Integer; // variant, boolean
на событие OnCreate/OnShow стоит код настройки отображения окна в соответствии с Varx вида:
Код:
if Varx=1 then begin 
 ..... настройки формы
end;
Проблема в том, что если стоит проверка "if..." нихрена форма не настраивается!!, если же строку с проверкой "if..." закомментить - сразу всё работает нормально!! То есть переменная почему-то не была определена!

Ещё в этой форме в некоторых случаях вылетает ошибка:
Цитата:
:7c812afb kernel32.RaiseException + 0x52
:00406d68 NotifyNonDelphiException + $1C
:7c90327a ntdll.RtlConvertUlongToLargeInteger + 0x3c
:7c90e48a ntdll.KiUserExceptionDispatcher + 0xe
:00544e33 TCustomForm.DoCreate + $37
:00544a77 TCustomForm.AfterConstruction + $17
:00544a46 TCustomForm.Create + $1A6
Посмотрел CallStack и CPU - ничего явно указывающего на ошибку нет.

Что за баг и как его исправить??? Пишите все предположения - проверю!
delphicoding вне форума Ответить с цитированием
Старый 05.10.2011, 20:54   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ваше OnCreate отрабатывает раньше чем в Varx что-то присваивается. OnShow позже
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.10.2011, 21:56   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

для этого были придуманы свойства (property)
Код:
private
  Fvarx: integer;
  procedure SetVatX(value: integer);
public
property varx: integer read Fvarx write SetVarx;
Код:
procedure TFormX.setVarX(value: integer);
begin
  if Value=1 then 
     // настройки формы
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 05.10.2011, 23:58   #4
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Цитата:
Ваше OnCreate отрабатывает раньше чем в Varx что-то присваивается. OnShow позже
И так и сяк пробовал - глючит.
Цитата:
для этого были придуманы свойства (property)
Код:
private
Fvarx: integer;
procedure SetVatX(value: integer);
public
property varx: integer read Fvarx write SetVarx;
Спасибо за подсказу! Но конструкция для человека не знающего зачем именно это нужно - выглядит мягко говоря странно... можно обойтись одной переменной вместо "varx: integer read Fvarx write SetVarx;" ?
delphicoding вне форума Ответить с цитированием
Старый 06.10.2011, 10:18   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

в свойствах главное возможность выполнить какие-то действия (SetVarX, GetVarX) в тот момент когда внешняя программа выполняет простое присваивание (чтение) переменной.
И использование вне класса одного идентификатора VarxX вместо двух (GetVarX, SetVarX)
formX.varX:=r; // formX.setVarX(r);
r:=FormX.VarX; // r:=FormX.GetVarX;
а переменноой FvarX вообще может и не быть.
Все вместе называется сокрытие деталей реализации.
Цитата:
Но конструкция для человека не знающего зачем именно это нужно
Если человек пишет программу(класс) он знает зачем это надо. А вот человеку который будет использовать класс знать что там внутри совсем не обязательно.

Цитата:
можно обойтись одной переменной вместо "varx: integer read Fvarx write SetVarx;" ?
и мучиться при этом почему не работает или работает не всегда.
а пользователю класса без разницы в написании
formX.varX в любом случае.
Но при этом(одна переменная) проблемы то работает то нет.
Цитата:
Проблема в том, что если стоит проверка "if..." нихрена форма не настраивается!!, если же строку с проверкой "if..." закомментить - сразу всё работает нормально!! То есть переменная почему-то не была определена!
и нет проблем если свойство.

1.программист один раз пишет простой короткий класс( одна переменная). и заставляет писать много раз одинаковый код (для правильного использования данной переменной) многих других программистов, использующих его "простой" класс.
2. программист один раз пишет простой длинный класс(одно свойство) и все программисты много раз просто используют это свойство.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.10.2011 в 10:39.
evg_m вне форума Ответить с цитированием
Старый 06.10.2011, 12:39   #6
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Огромное спасибо за объяснение и метод - действительно так стало работать!!! :D
Хотя я так и не понял почему же не работало просто с переменной - согласно правилам делфи - тоже должно было бы работать...

И одно уточнение в строке
property varx: integer read Fvarx write SetVarx;
так ли нужно "read Fvarx"? логически оно вообще не нужно, можно ведь просто:
property varx: integer write SetVarx;
можно ли так делать и для чего нужно "read Fvarx"?!
delphicoding вне форума Ответить с цитированием
Старый 06.10.2011, 13:04   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
И одно уточнение в строке
property varx: integer read Fvarx write SetVarx;
так ли нужно "read Fvarx"? логически оно вообще не нужно, можно ведь просто:
property varx: integer write SetVarx;
можно ли так делать и для чего нужно "read Fvarx"?!
да можно, если не надо будет делать
r:=formX.varX; // прочитать (узнать это значение ВНЕ модуля).
аналогично можно не писать write блок (если не требуется изменять значение ИЗВНЕ).
formX.varX:=r;

Цитата:
Хотя я так и не понял почему же не работало просто с переменной - согласно правилам делфи - тоже должно было бы
работать...
самый простой способ понять почему все получается не так как хотелось, сделать информативный лог. к примеру выводить некие некие строки с помощью showmessage
showMessage('FormX.VarX:=1');
showMessage('formX.OnCreate');

Код:
FormX.Create;
formX.VarX:=0;
FormX.OnCreate;
FormX.Onshow;// обработали известное на данный момент значение
formX.VarX:=1; // ну и что. все процедуры настройки уже выполнены.
так понятно?

Цитата:
Ваше OnCreate отрабатывает раньше чем в Varx что-то присваивается
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.10.2011 в 13:17.
evg_m вне форума Ответить с цитированием
Старый 06.10.2011, 13:15   #8
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

За объяснение ещё раз спасибище!

А вот с последним абзацем не согласен, тк:
Цитата:
begin
// Fx:=Formx.Create(self);
Fx:=Formx.Create(Application);
Fx.Varx:=1;
Fx.Show;
end;
+ у формы Formx в дизайнере установлено Visible=False, поэтому OnShow происходит ПОСЛЕ присвоения переменной!!!
Ну и типы окна пробовал все 3 варианта (MDIChild, Normal, StayOnTop) - всегда одинаковый баг.

Так что с последним не согласен - должно было работать с переменной, почему не работало - мне кажется при Create формы возникает некий баг не из-за моего написанного кода, а в невизуальных компонентах (связи с БД или других вспомогательных) и из-за этого бага возникают остальные баги... почему заработало с Вашим вариантом объясняется довольно просто - property активный элемент, который при изменении сам пробивается к исполнению, а назначение переменной извне - видимо действие более пассивное и не срабатывало... или же при создании форма где-то циклится и не доходит даже до создания переменной Varx... что-то такое...

Последний раз редактировалось delphicoding; 06.10.2011 в 13:18.
delphicoding вне форума Ответить с цитированием
Старый 06.10.2011, 13:36   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
+ у формы Formx в дизайнере установлено Visible=False, поэтому OnShow происходит ПОСЛЕ присвоения переменной!!!
есть простой способ проверить это. (см мой пост).
на самом деле Onshow НИКАК не связан с visible:=true/False
Цитата:
объясняется довольно просто - property активный элемент, который при изменении сам пробивается к исполнению, а назначение переменной извне - видимо действие более пассивное и не срабатывало...
полностью с этим согласен. Все данные (а переменная это данные) это пассивные блоки программы. Активные блоки программы это процедуры и функции в просторечии КОД.

Цитата:
property активный элемент
Он может быть и пассивным но такое используется достаточно редко.
Код:
Fvarx: integer;
property varX: integer write FvarX; // пример "пассивного" свойства.
не требующего дополнительных действий при его изменении.( кроме изменения самой переменной)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.10.2011 в 13:53.
evg_m вне форума Ответить с цитированием
Старый 06.10.2011, 14:26   #10
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Цитата:
на самом деле Onshow НИКАК не связан с visible:=true/False
Но OnShow связан с Formx.Show, который в случае параметра формы Visible=False и производит OnShow так что всё было вполне правильно написано, по правилам Delphi.
delphicoding вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тупая ошибка ...Duplicate resource(s): [Error] Romer9999 Общие вопросы Delphi 5 02.08.2011 15:21
Переменная в C# bead C# (си шарп) 8 01.05.2011 12:32
переменная char genrix Общие вопросы C/C++ 9 20.02.2011 18:23
переменная в Excel serror514 Microsoft Office Excel 5 11.10.2010 13:15
тупая Виста и браузеры. Чип с Вальдеза Операционные системы общие вопросы 5 23.02.2009 00:54