Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
1

Вопрос о RadioGroup

30.03.2010, 07:31. Просмотров 3939. Ответов 54
Метки нет (Все метки)

Почему когда на форме onClose пишешь: Glavnoe.RadioGroup2.ItemIndex:=-1; выводится ошибка: Cannot change Visible in OnSow or OnHide?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2010, 07:31
Ответы с готовыми решениями:

вопрос по RadioGroup
Нужен совет по использованию RadioGroup. Есть форма, на которой RadioGroup и в...

Вопрос по RadioGroup и SaveDialog
Вообщем в радиогруп есть три итемса "1" "2" "3" когда я жму на кнопку должно...

if radioGroup
Почему не компилит мой быдло код? if RadioGroup1.ItemIndex = 0 then...

RadioGroup
Разработайте приложение из главной и одной немодальной подчиненной формы. На...

Radiogroup
Здравствуйте, имеется 2 radiogroup, в каждом по 2 строчки, как написать условие...

54
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
30.03.2010, 12:40 2
Надо код посмотреть, который это действие выполняет.
0
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
31.03.2010, 07:48  [ТС] 3
Mawrat, Я же написала. На форме OnClose одна строка - Glavnoe.RadioGroup2.ItemIndex:=-1
0
_zz_
49 / 48 / 16
Регистрация: 12.03.2009
Сообщений: 133
31.03.2010, 08:31 4
Потому, что при закрытие окна формы вызывается автоматическое событие onHide, то есть форма скрывается в этом режиме нельзя рисовать на canve формы, а радиогруп после изменения активности выбранной itema пытается всегда перерисовать свое изображение, что не позволяет сделать форма. Вот вам и ошибка.

Хотя написал похожий код что и Вас. Ошибок нет. Возможно Mawrat прав, и необходимо смотреть код программы, где вы вызываете саму форму Glavnoe.
0
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
31.03.2010, 08:41  [ТС] 5
Форма главная появляется после заставки:

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
program Applicant;
 
uses
  Forms,
  SysUtils,
  UZastavka in 'UZastavka.pas' {Zastavka},
  UGlav in 'UGlav.pas' {Glavnoe},
  UFak in 'UFak.pas' {Fakultet},
  USpec in 'USpec.pas' {Specialnost},
  UPred in 'UPred.pas' {Predmet},
  UAbitur in 'UAbitur.pas' {Abiturient},
  UDataModule1 in 'UDataModule1.pas' {DataModule1: TDataModule},
  UDiag in 'UDiag.pas' {Diagramma},
  UKolPoVuzu in 'UKolPoVuzu.pas' {KolPoVuzu},
  USved in 'USved.pas' {Svedeniya},
  ReportFormUnit in 'ReportFormUnit.pas' {ReportForm},
  URedactData in 'URedactData.pas' {RedactData},
  URedactDataSpec in 'URedactDataSpec.pas' {RedactdataSpec},
  URedactAbitur in 'URedactAbitur.pas' {RedactAbitur},
  UVvodOcenok in 'UVvodOcenok.pas' {VvodOcenok},
  URedactOcen in 'URedactOcen.pas' {RedactOcen},
  UPostup in 'UPostup.pas' {Postup},
  URedactPostup in 'URedactPostup.pas' {RedactPostup},
  URedactPredmet in 'URedactPredmet.pas' {RedactPredmet},
  UOtcheti in 'UOtcheti.pas' {Otcheti},
  UProhodnoyBall in 'UProhodnoyBall.pas' {ProhodnoyBall},
  USummaNabrBall in 'USummaNabrBall.pas' {SummaNabranBallov};
 
{$R *.res}
 var ExB: WORD;
begin
  Application.Initialize;
  Zastavka := TZastavka.Create(Application);
  Zastavka.Show;
  Zastavka.UpDate;
  Application.Title := 'Абитуриенты';
  Application.CreateForm(TGlavnoe, Glavnoe);
  Application.CreateForm(TFakultet, Fakultet);
  Application.CreateForm(TSpecialnost, Specialnost);
  Application.CreateForm(TPredmet, Predmet);
  Application.CreateForm(TAbiturient, Abiturient);
  Application.CreateForm(TDataModule1, DataModule1);
  Application.CreateForm(TDiagramma, Diagramma);
  Application.CreateForm(TKolPoVuzu, KolPoVuzu);
  Application.CreateForm(TSvedeniya, Svedeniya);
  Application.CreateForm(TReportForm, ReportForm);
  Application.CreateForm(TRedactData, RedactData);
  Application.CreateForm(TRedactdataSpec, RedactdataSpec);
  Application.CreateForm(TRedactAbitur, RedactAbitur);
  Application.CreateForm(TVvodOcenok, VvodOcenok);
  Application.CreateForm(TRedactOcen, RedactOcen);
  Application.CreateForm(TPostup, Postup);
  Application.CreateForm(TRedactPostup, RedactPostup);
  Application.CreateForm(TRedactPredmet, RedactPredmet);
  Application.CreateForm(TOtcheti, Otcheti);
  Application.CreateForm(TProhodnoyBall, ProhodnoyBall);
  Application.CreateForm(TSummaNabranBallov, SummaNabranBallov);
  sleep(1500);
  Application.MessageBox(pchar('Прежде чем работать, выберите базу данных!'),pchar('Внимание!'),64);
  Zastavka.Hide;
  Zastavka.Free;
  Application.Run;
end.
0
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
31.03.2010, 10:19 6
Цитата Сообщение от _zz_ Посмотреть сообщение
Хотя написал похожий код что и Вас. Ошибок нет.
Да, при обычном построении, должно всё рабоать. ItemIndex можно свободно менять даже в случае, когда форма скрыта, или скрыт сам компонент.
Цитата Сообщение от AlenaIvanova Посмотреть сообщение
На форме OnClose одна строка - Glavnoe.RadioGroup2.ItemIndex:=-1
Событие OnClose для какой формы обрабатывается?
---
Надо иметь в виду, что для создания формы TGlavnoe вызов метода:
Application.CreateForm(TGlavnoe, Glavnoe);
выполняется раньше других Application.CreateForm(). Это означает, что в приложении главной формой будет именно TGlavnoe. Т. е. закрытие главной формы автоматически влечёт за собой закрытие всех остальных форм приложения и завершение самого приложения.
В связи с этим вопрос - зачем менять ItemIndex, если приложение всё равно закрывается? Или есть ещё какой-то код, скажем, в OnDestroy формы TGlavnoe, который как-то использует значение ItemIndex?
---
С технической точки зрения, конечно интересно, почему возникла эта ошибка. Надо разбираться в архитектуре приложения. Что и откуда вызвается и в какой момент. Рассмотреть последовательность событий.
0
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
31.03.2010, 10:31  [ТС] 7
Цитата Сообщение от Mawrat Посмотреть сообщение
Событие OnClose для какой формы обрабатывается?
Для всех форм.

На главной форме у меня есть две радиогруппы, которые открывают формы. Я при закрытии этих форм на кнопку закрыть пишу код
Delphi
1
Glavnoe.RadioGroup2.ItemIndex:=-1
, т.о. у меня при закрытии формы можно сново выбрать эту же форму потому как радиокнопка не активна. Но если форму закрыть не кнопкой, а стандартным образом, то радиокнопка активна и сново ее открыть становится невозможно.
0
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
31.03.2010, 12:27 8
Понятно, тут пробема, видимо, связана с архитектурой. Надо посмотреть весь проект, поразбираться...
0
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
31.03.2010, 12:31  [ТС] 9
Если я Вам скину проект, Вы можете посмотреть почему с OnClose не получается и запрос на обновления данных таблицы Svedeniya (ADOObrabotka)?
0
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
31.03.2010, 15:49 10
В полноценном отладочном режиме я проверить не смогу - у меня Базы Данных такой нет. Тем не менее, попытаюсь. По поводу запроса на обновление я ответил здесь.
Если проект не желательно в общий доступ выкладывать, можно поступить так - проект выкладывается на файлообменник с запароленным доступом на скачивание. Пароль и ссылку можно кинуть мне в личку.
0
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
05.04.2010, 23:47 11
AlenaIvanova, я посмотрел проект. Там TRadioGroup на форме TGlavnoe надо заменить на что-нибудь другое. Можно создать главное меню. Его можно сделать на основе TMainMenu или с помощью TListBox или даже на основе набора TLabel. А TRadioGroup для этой цели подходит меньше всего. Тот механизм на основе TRadioGroup глючит. Возможно есть баги в самом TRadioGroup.
В общем, происходит следующее. TRadioGroup как-то по особенному обрабатывает первый элемент списка: RadioGroup1.Items[0]. При закрытии формы TFakultet радио группа сама собой переключается на ItemIndex = 0 и генерируется событие OnClick. Этого вроде не должно быть, но это происходит. В результате при закрытии формы TFakultet выполняется код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TGlavnoe.RadioGroup1Click(Sender: TObject);
begin
  if RadioGroup1.ItemIndex=0 then
    Fakultet.Show;
  if RadioGroup1.ItemIndex=1 then
    Specialnost.Show;
  if RadioGroup1.ItemIndex=2 then
    Predmet.Show;
  if RadioGroup1.ItemIndex=3 then
    Svedeniya.Show;
  if RadioGroup1.ItemIndex=4 then
    ProhodnoyBall.Show;
end;
Как я выше писал, в этот момент: RadioGroup1.ItemIndex = 0. Поэтому происходит вызов метода: Fakultet.Show. Во время закрытия TFakultet это конечно приводит к ошибке.
В общем, надо отказаться от использования компонента TRadioGroup в качестве главного меню программы.
1
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
06.04.2010, 04:42  [ТС] 12
Спасибо. А что с запросом на обновления?
0
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
06.04.2010, 10:44 13
Запрос на обновление я здесь протестировал. Надо его испытать на реальной базе. При добавлении запроса в проект необходимо провести выверку имён полей (и таблиц) - чтобы они точно соответствовали именам в базе данных.
0
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
06.04.2010, 11:51  [ТС] 14
Сделала так:
SQL
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
UPDATE Svedeniya SET Zachislen =
(
SELECT
  CASE
    WHEN SumBall.SumBall >= ProhodnoyBall.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
FROM
  Abiturient
  ,ProhodnoyBall
  ,(
    SELECT
      Abiturient.CodFIOAbiturSvedeniya
      ,SUM(Ocenki.Ocenka) AS SumBall
    FROM
      Abiturient
      ,Ocenki
    WHERE
      Abiturient.CodFIOAbiturSvedeniya = Ocenki.CodAbitur
    GROUP BY
      Abiturient.CodFIOAbiturSvedeniya
 )  SumBall  
WHERE
  Abiturient.CodFIOAbiturSvedeniya = Svedeniya.FIOAbitur
  AND Abiturient.CodSpecialnost = ProhodnoyBall.Spec
  AND Abiturient.CodFIOAbiturSvedeniya = SumBall.CodFIOAbiturSvedeniya
)
Не выходит. Я только учусь программировать базы данных и поэтому многого еще не понимаю. SumBall - это у вас еще одна таблица (созданная в access) или это так называемое динамическое поле для вычислений? И Result - это поле в таблице, или тоже динамическое?

Добавлено через 43 минуты
Даже знаете, не такой запрос мне нужен. Мне нужно обновлять поле Zachislen таблицы сведения, т.е. если SumBall.SumBall >= ProhodnoyBall.Ball то zachislen:=true
0
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
06.04.2010, 12:29 15
Цитата Сообщение от AlenaIvanova Посмотреть сообщение
Даже знаете, не такой запрос мне нужен. Мне нужно обновлять поле Zachislen таблицы сведения, т.е. если SumBall.SumBall >= ProhodnoyBall.Ball то zachislen:=true
Запрос именно это и делает :
SQL
1
2
3
4
5
6
7
8
UPDATE Svedeniya SET Zachislen =
(
SELECT
  CASE
    WHEN SumBall.SumBall >= ProhodnoyBall.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
...
Цитата Сообщение от AlenaIvanova Посмотреть сообщение
SumBall - это у вас еще одна таблица (созданная в access) или это так называемое динамическое поле для вычислений?
SumBall - это имя подзапроса:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
(
    SELECT
      Abiturient.CodFIOAbiturSvedeniya
      ,SUM(Ocenki.Ocenka) AS SumBall
    FROM
      Abiturient
      ,Ocenki
    WHERE
      Abiturient.CodFIOAbiturSvedeniya = Ocenki.CodAbitur
    GROUP BY
      Abiturient.CodFIOAbiturSvedeniya
 )  SumBall
Т. е. таблицы SumBall нет в базе данных - SumBall это имя подзапроса. Именно этот подзапрос вычисляет сумму балов по каждому конкретному абитуриенту. Подсчитанная сумма балов по каждому абитуриенту записана в поле: SumBall.SumBall.
В главном запросе мы как раз сравниваем сумму балов по абитуриенту (SumBall.SumBall) с проходным балом на заданную специальность: ProhodnoyBall.Ball. Если SumBall.SumBall >= ProhodnoyBall.Ball, то в таблицу Svedeniya, в поле Svedeniya.Zachislen будет записано значение True. Иначе - запишется False. Что нам и требуется.
SQL
1
2
3
4
5
6
7
8
UPDATE Svedeniya SET Zachislen =
(
SELECT
  CASE
    WHEN SumBall.SumBall >= ProhodnoyBall.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
...
Здесь Result это имя поля, в котором возвращается значение = True или False, которое, как раз, записывается в Svedeniya.Zachislen. Поле Result является вычисляемым. Т. е. его нет в базе данных.
---
Предлагаю такой план. Сначала надо добиться, чтобы выполнялся без ошибок вот этот запрос:
SQL
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
SELECT
  Ab.CodFIOAbiturSvedeniya
  ,SumBall.SumBall
  ,Prb.Ball
  ,CASE
    WHEN SumBall.SumBall >= Prb.Ball THEN TRUE
    ELSE FALSE
  END AS Zachislen
FROM
  test_Abiturient Ab
  ,test_ProhodnoyBall Prb
  ,(
    SELECT
      Ab.CodFIOAbiturSvedeniya
      ,SUM(Oc.Ocenka) AS SumBall
    FROM
      test_Abiturient Ab
      ,test_Ocenki Oc
    WHERE
      Ab.CodFIOAbiturSvedeniya = Oc.CodAbitur
    GROUP BY
      Ab.CodFIOAbiturSvedeniya
  ) SumBall
WHERE
  Ab.CodSpecialnost = Prb.Spec
  AND Ab.CodFIOAbiturSvedeniya = SumBall.CodFIOAbiturSvedeniya
;
На моей тестовой Оракловой базе он выполняется правильно (только вместо true и false у меня там, соответственно: 1 и 0).
Если этот запрос заработает в Access, то отладить запрос на Update - дело техники.
1
Андрей Борисови
709 / 397 / 33
Регистрация: 04.10.2009
Сообщений: 1,687
06.04.2010, 12:38 16
попробуйте сделать так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TGlavnoe.RadioGroup1Click(Sender: TObject);
begin
  if RadioGroup1.ItemIndex=0 then
    begin
     Fakultet.Show;
     Glavnoe.RadioGroup2.ItemIndex:=-1; 
    end;
  if RadioGroup1.ItemIndex=1 then
    Specialnost.Show;
  if RadioGroup1.ItemIndex=2 then
    Predmet.Show;
  if RadioGroup1.ItemIndex=3 then
    Svedeniya.Show;
  if RadioGroup1.ItemIndex=4 then
    ProhodnoyBall.Show;
end;
и ".Show" замените на ".ShowModal", т.к. тогда дочернее окно будет висеть поверх всех
0
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
06.04.2010, 12:51 17
Андрей Борисович, там проблема в том, что когда закрывается форма TFakultet, то самопроизвольно RadioGroup1.ItemIndex устанавливается в ноль и вызывается обработчик TGlavnoe.RadioGroup1Click. А так как форма TFakultet закрывается, то вызов Fakultet.Show приведёт к ошибке. В этом проблема.
Что касается установки ItemIndex = -1, то в самом деле удобнее это делать, так как написал Андрей Борисович.
Но RadioGroup1 всё же надо заменить на что-то другое - я об этом писал выше.
1
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
06.04.2010, 12:52  [ТС] 18
Андрей Борисови, Спасибо за совет, но я уже сделала через label. То есть label использовала как ссылки.
0
Андрей Борисови
709 / 397 / 33
Регистрация: 04.10.2009
Сообщений: 1,687
06.04.2010, 13:31 19
Тоже хороший вариант
0
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
07.04.2010, 05:53  [ТС] 20
Mawrat, Цикл верно записан?

SQL
1
2
3
4
  CASE
    WHEN SumBall.SumBall >= ProhodnoyBall.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
0
07.04.2010, 05:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2010, 05:53

RadioGroup
Как написать программу для удаления нечетных символов, через нажатие в...

RadioGroup
procedure TForm1.Button1Click(Sender: TObject); const g=9.8; var h,t:real;...

Combobox и RadioGroup
Есть компонент RadioGroup с тремя кнопками. Нужно чтобы при нажатии в Combobox...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru