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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2011, 21:11   #1
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
Вопрос Несколько простейших вопросов по формам

Здравствуйте!

Ковыряю формы, возникло несколько вопросов, которые не могу решить уже несколько дней, все параметры и код перепроверял, но видимо где-то что-то неправильно:
1. В закладке есть 4 TPanel, в каждой по 4-10 полей разного типа. Курсор при нажатии Tab в одном месте переходит неправильно, не на следующее поле в этой панели которое имеет TabOrder+1, а на следующий такой же объект TJvDBComboBox вообще в другой панели!
2. Есть две похожие формы, на обеих есть одинаковый (скопированный) объект - TDBCheckBox - в одной форме при открытии (форма без данных) - он выключен, а на другой - включен... нужно чтобы был отключен... фантастика какая-то!
3. Процедура открытия одного нового окна из двух возможных с передачей в это новое окно значения переменной, которая объявлена в том окне, но Delphi всё время ругается на код, не понимаю почему и как же написать правильно?!:
Код:
Procedure ShowF(aGroupId:LongInt;aIsShift:boolean);
 var P:Tform;
begin
   case aGroupId of
    1: begin
        P:=TfBaseForm;
        P.Create(Application);
        P.VarTemp := not aIsShift; (!)
не может найти в Tform переменную VarTemp
=====================  вариант 2
   case aGroupId of
    1: begin
        P:=TfBaseForm.Create(Application);
        If aIsShift=True
            Then TfBaseForm.VarTemp:=False (!)
            Else TfBaseForm.TfBaseForm:=True;
       end;
ругается что ждал метод
===================== вариант 3
 var P:variant и string
не нравится присвоение имени формы varinat, если string не работают методы формы вообще
Я понимаю, что не видя проект сложно сказать наверняка, тем более, что все доступные свойства я перепроверил уже н-раз. Тем не менее, возможно Ваш профессиональный опыт поможет Вам выдвинуть предположения с чем эти баги могут быть связаны?
delphicoding вне форума Ответить с цитированием
Старый 24.07.2011, 06:41   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

3. Какая необходимость объявлять переменную базового класса (P : TForm;), если есть описание класса своей формы (TfBaseForm)?
Код:
 var P:TfBaseForm;
begin
=====================  вариант 2
  case aGroupId of
    1: begin
      P := TfBaseForm.Create(Application);
      If aIsShift 
  //обращение к полям и методам объекта не может быть через тип класса, только через переменную класса
        Then P.VarTemp := False  //TfBaseForm.VarTemp:=False (!)          
        Else P.VarTemp := True; //TfBaseForm.TfBaseForm:=True;
      // или P.VarTemp := not aIsShift;
    end;
  end;
В первом варианте не выдерживает никакой критики синтаксис создания объекта и потому отбрасывается сразу.

Если и остальной код в таком же духе, то не удивительно, что происходят "фантастические" вещи.
По двум первым вопросам ничего нельзя даже предположить без исходных текстов.

Последний раз редактировалось Прик; 24.07.2011 в 06:46.
Прик вне форума Ответить с цитированием
Старый 24.07.2011, 11:56   #3
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

//обращение к полям и методам объекта не может быть через тип класса, только через переменную класса
нде... идиотизм... главное по коду это понять абсолютно невозможно!

одного нового окна из двух возможных
Указывая вначале P:= одному из двух окон, затем не получается присвоить второе окно... вот:
Цитата:
var P:TfBaseFormA;
begin
case aGroupId of
1: P:=TfBaseFormA; (!)
2: P:=TfBaseFormB;
end;
P.Create(Application);
P.VarTemp := not aIsShift;
также не пашет, ругается, что в указанной строке Incompatible types: 'TfBaseFormA' and '(class of TfBaseFormA)'. - даже простым языком это звучит как бред, уж не говоря про код... короче я фигею от этой тупой ситуации и уже не представляю себе как правильно это реализовать ?!?!?!

Последний раз редактировалось delphicoding; 24.07.2011 в 12:07.
delphicoding вне форума Ответить с цитированием
Старый 24.07.2011, 13:06   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

А задача то в чем?
Через одну переменную орудовать в разных формах?
Можно, конечно, но смысла не видно (действительно, задачу поглубже надо знать).
Такой вариант устроит?
Код:
  var PA:TfBaseFormA;
  var PB:TfBaseFormВ;
begin
  case aGroupId of
    1: begin 
      PA := TfBaseFormA.Create(Application); //только так можно создавать объекты
      PA.VarTemp := not aIsShift;
    end; 
    2: begin 
      PB := TfBaseFormB.Create(Application);
      PB.VarTemp := not aIsShift;
    end; 
end;
Прик вне форума Ответить с цитированием
Старый 24.07.2011, 13:18   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> звучит как бред

ну так не создавайте бредовый код ) Кто ж присваивает экземпляру класс.

Делайте как советует Прик, или унаследуйте TfBaseFormA и TfBaseFormB от общего предка, и уже у этого предка добавьте поле VarTemp.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 24.07.2011, 13:46   #6
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Цитата:
Такой вариант устроит?
Так с двумя переменными я и сам могу.
Цитата:
ну так не создавайте бредовый код ) Кто ж присваивает экземпляру класс.
Делайте как советует Прик, или унаследуйте TfBaseFormA и TfBaseFormB от общего предка, и уже у этого предка добавьте поле VarTemp.
Это извращения! Есть простая задача - типа пользователь видит кнопку и список выбора, в списке выбирает нужное окно и жмёт на кнопку... нужно создать заданное пользователем окно на основе готовой формы и передать в него массу данных... при этом разные окна отличаются дизайном формы, параметры и полями тоже отличаются...

Логика проста - присваиваем некой переменной название нужной пользователю формы и через переменную передаём все значения в выбранную пользователем форму... но... видимо в Delphi данная задача из-за кривизны стандартов кода... нерешаема.

Ошибка разработчиков Delphi в том, что они зря всё стали писать через точку - и названия объектов и свойства. Правильно код должен был бы выглядеть так:
Код:
var P:TForm; (ведь КЛАСС переменной - это именно ФОРМА)
 begin
 case aGroupId of
 1: P:=TfBaseFormA; (уточняем название формы из которой создаём окно)
 2: P:=TfBaseFormB; (также)
 end;
 P.[Create(Application)]; (о да, свойство и функция объекта это на самом деле совсем не тоже самое, что путь к объекту, поэтому СТОИЛО ОТДЕЛИТЬ СВОЙСТВА СКОБОЧКАМИ, товарищи разработчики Delphi)
 P.VarTemp := not aIsShift; (тут просто через точку, тк это обычный путь к объекту)
И всё было бы замечательно, удобно и однозначно.

=================================== =============

4. Как TJvDBComboBox или TDBComboBox указать из кода программы, чтобы он ВЫБРАЛ И ПОКАЗАЛ значение из своего списка? Строка cbSpisok.ItemIndex:=1 увы ничего не делает.
delphicoding вне форума Ответить с цитированием
Старый 24.07.2011, 16:29   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Это извращения!

нет, это стройный и понятный ООП, придуманный, слава богу, лет 30-40 назад, и устраивавший, до сегодняшнего дня, миллионы разработчиков.

> присваиваем некой переменной название нужной пользователю формы

только не название, а экземпляр класса

> и через переменную передаём все значения в выбранную пользователем форму

ну так и присваивайте, какие проблемы?

> данная задача из-за кривизны стандартов кода... нерешаема

прежде чем обвинять что-то в кривизне, попытайтесь сами хоть понять, что вы хотите от компилятора. Вот ваш "идеальный" код:

Код:
var P:TForm;
begin
  ...
  P.VarTemp := not aIsShift;
end;
А теперь найдите в описании класса TForm поле VarTemp. Правильно вам компилятор говорит, что такого поля нет. То, что реально P вы пытаетесь присвоить экземпляр класса TfBaseFormA (или TfBaseFormA) уже не важно.

> что они зря всё стали писать через точку - и названия объектов и свойства

боже, ну а точка-то тут при чём? И нет никаких названий у объектов. Есть имена классов.

Вы хоть 10 минут потратьте на изучение основ ООП, прежде чем предлагать сомнительные улучшения в Дельфи )

Ещё раз, если у ваших форм есть общие свойства, вынесите их в общего предка.
Если общих свойст нет, не мучайте компилятор, создайте переменную для каждого класса, или пишите, например, так:

Код:
var
  P: TForm;
begin
  // работаем с P как с TfBaseFormA
  Application.CreateForm(TfBaseFormA, P);  // или  P := TfBaseFormA.Create(Application);
  (P as TfBaseFormA).VarTemp := aIsShift;

  // работаем с P как с TfBaseFormB
  Application.CreateForm(TfBaseFormB, P);  // или  P := TfBaseFormB.Create(Application);
  (P as TfBaseFormB).VarTemp := aIsShift;

end;
> И всё было бы замечательно, удобно и однозначно

Это вы про этот ужос?

Код:
P.[Create(Application)];
Вирт бы повесился на первой берёзе, увидев такое )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 24.07.2011, 17:09   #8
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Цитата:
прежде чем обвинять что-то в кривизне, попытайтесь сами хоть понять, что вы хотите от компилятора. Вот ваш "идеальный" код:
Ты прикалываешься? Повторяю - есть ДВА разных окна, ДВЕ разные формы... не получится всё через P, тк "в супер удобном delphi" как минимум нужно вначале объявить PA и PB...
Цитата:
Если общих свойст нет, не мучайте компилятор, создайте переменную для каждого класса, или пишите, например, так:
var P: TForm;
Товарищ профессионал Delphi, сколько раз повторять, что при задании var P:TForm компилятор не пропускает, тк в TForm Delphi не может найти VarTemp!!
Тут кстати возникает вопрос, почему тогда Delphi при объявлении например Var S:String не пытается найти строки в S сам по себе и позволяет присваивать переменной любые строковые значения, а при var P:TForm и переменные ищет и переназначать не даёт?! Недоделка!
Цитата:
То, что реально P вы пытаетесь присвоить экземпляр класса TfBaseFormA (или TfBaseFormA) уже не важно.
Одной этой фразы достаточно, чтобы правильно оценить следующую фразу...
Цитата:
нет, это стройный и понятный ООП, придуманный, слава богу, лет 30-40 назад, и устраивавший, до сегодняшнего дня, миллионы разработчиков.
учитывая, что var P нельзя задать и как String, хотя вполне был бы вариант, ведь в дальнейшем в коде происходит просто подстановка текста пути/имени, "удобства Delphi" под огромным сомнением...
Цитата:
Это вы про этот ужос?
Давай без бреда.
Код:
Может ты и в адресной строке интернет браузера пишешь всё через слеш? типа //programmersforum.ru/showthread/php/p/849787/post849787 , 
или в ОС у тебя свойства и параметры файлов в одну строку и с одинаковыми разделяющими символами с названием файла? типа C\Windows\explorer\exe\tn\1\l\d\hidden\readonly
Вот ЭТО ужас...

=================================== =================================== ====

5. Нужно назначить событие на момент формы ввода данных. Какое событие-момент подойдёт, чтобы обработка запускалась: а) при первом открытии пустой формы и б) когда данные отправляются в БД и форма ввода очищается и в) когда форма открывается загружая во все поля данные из БД ?
Какое выбрать событие формы? AfterOpen? Или лучше что-то другое? Может из событий БД?

Последний раз редактировалось delphicoding; 24.07.2011 в 17:29.
delphicoding вне форума Ответить с цитированием
Старый 24.07.2011, 19:24   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

а) при первом открытии пустой формы
OnCreate, если форма создается и показывается. OnShow, если форма предварительно создана и ее нужно только показать (методом Show).

б) когда данные отправляются в БД и форма ввода очищается
Кто же знает когда у вас данные отправляются в БД.
Момент записи данных зависит от разработчика.

в) когда форма открывается загружая во все поля данные из БД?
Какое выбрать событие формы? AfterOpen?

AfterOpen - событие компонента Dataset и ни малейшего отношения к формам не имеет.

Или лучше что-то другое?
А в чем проблема?
Опять же нет четко поставленной задачи. Приходиться гадать чего человеку надо.

Может из событий БД?
У БД нет событий, если под БД подразумевается сервер БД (СУБД) или файл, содержащий базу данных. Если что-то другое, то надо бы уточнять.

Я вам вот что скажу: здесь на форуме вы не сможете научится программировать на Дельфи. На невнятные вопросы вы будете получать такие же невнятные ответы. И к чему это приведет? Разве только к затяжному выяснению своих отношений к Дельфи.
Напишите мне на мыло, если есть желание разобраться со своими проблемами.
Прик вне форума Ответить с цитированием
Старый 25.07.2011, 01:57   #10
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> не получится всё через P

получится

> как минимум нужно вначале объявить PA и PB

не нужно

> что при задании var P:TForm компилятор не пропускает, тк в TForm Delphi не может найти VarTemp!!

может, если мы ему поможем. Есть даже специальный оператор with:

Код:
with (P as TfBaseFormA) do begin
  VarTemp := aIsShift;
end;
> "удобства Delphi" под огромным сомнением

похоже, вас кто-то насильно заставляет пользоваться столь нелюбимым продуктом )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько вопросов phphel Общие вопросы Delphi 19 30.01.2011 21:24
несколько вопросов по C Horus92 Общие вопросы C/C++ 2 15.11.2009 16:08
БД - Несколько вопросов lutdan БД в Delphi 3 11.10.2009 20:22
Несколько вопросов pix_l Общие вопросы Delphi 1 29.03.2009 22:26
Несколько вопросов Зубоскалик Общие вопросы Delphi 14 20.11.2008 14:28