Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.07.2011, 17:26
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
Вопрос RadioButton простые вопросы

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

Пара вопросов по RadioButton.
1. Есть ли автосвязанные батоны, когда добавив хоть 100 штук на форму - автоматически контролируется, что выбранным может быть только один батон?
2. Если нужно не только выбрать лишь один из вариантов, но и скрыть все неактуальные для данного варианта поля ввода - есть ли что-то более автоматизированное, чем радио батоны? (типа вкладок с ограничением выбора одной вкладки, или тп)
3. Как наиболее кратко написать аналогичное действие на радио батон для скрытия полей?
Я пишу так, но утомляет кол-вом строк
EditField1.Enabled := rb1.Checked;
EditField2.Enabled := rb1.Checked;
EditField3.Enabled := rb1.Checked;
Можно ли это как-то в одну строку? типа [EditField1,EditField2,EditField3].Enabled := rb1.Checked; ?
4. Также что-то не могу понять как написать обращение boolean переменной? То есть если "a :=true", как "b" присвоить значение обратное "a", то есть false в одну строку?

Последний раз редактировалось delphicoding, 21.07.2011 в 17:46.
Ответить с цитированием
  #2  
Старый 21.07.2011, 18:06
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

1. Если RadioButton на одном и том же родителе то ты сможешь использовать только один.
2. Не выехал, но предполагаю что в стандартных средсвах нет.
3. Цыкл с использованием FindComponent
4.
Код:
1
2
3
4
function ObrBool(B:Boolean):Boolean;
begin
  if B then Result:=false else Result:=true;
end;
Ответить с цитированием
  #3  
Старый 21.07.2011, 18:37
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

1. Ок
2.
3. Не катит, тк объекты на форме с разным названием, просто в примере написал с разными цифрами. Нужно именно перечисление через запятую или типа того. Может массив создать? Но хотелось бы проще...
4. Ой как страшно. А в одно действие в Delphi никак что-ли?!?!?!
Ответить с цитированием
  #4  
Старый 21.07.2011, 19:02
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

2. Заводишь массив, в котором описываешь варианты и соответсвующие связи. Потом у еомпонентов расставляешь св-во Tag. Ну а дальше при выборе варианта в соотв. со свойством Tag и вышеописанной таблицы просто скрываешь все ненужные компоненты (цикл по всем компонентам).
3. Если радиокнопка и соов. Edit имеют одинаковую схему названия, то соотв. можно на основе одного название сконструировать другой и потом findComponent. Еще есть TActionList. Может получится его задействовать.
4.
Код:
1
B := Not B;
Ответить с цитированием
  #5  
Старый 21.07.2011, 20:25
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

2. Ну это да, массив... думал может можно побыстрее как-то одним действим через запятую. Типа "SetAll (Field1,Filed2,Field3+[.Enable]) := False", жалко, что нет такой конструкции
3. FindComponent да, но названия разные, лучше назвать нормально, чем потом ковыряться пытаясь понять что обозначает название Tlabel100500. TActionList похоже не подходит, да и разницы видимо нет со списком/массивом в коде, а поскольку это компонент формы - код будет хуже читаться.
4. Круто, я знал, что такое должно быть! Спасибо.
Ответить с цитированием
  #6  
Старый 21.07.2011, 21:08
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Кстати в продолжение темы со скрытием объектов, подскажите, пожалуйста, для ряда объектов, например TDBEdit, TJvDBSpinEdit, TJvDBComboBox, идр, не подходит строка вида:
TDBEdit1.Value=null;
Как правильно очищать такие объекты от значений?
Ответить с цитированием
  #7  
Старый 21.07.2011, 21:38
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Janom
...
Код:
1
2
3
4
function ObrBool(B:Boolean):Boolean;
begin
  if B then Result:=false else Result:=true;
end;

Зачот, парень!
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #8  
Старый 21.07.2011, 21:49
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от delphicoding
2. Ну это да, массив... думал может можно побыстрее как-то одним действим через запятую. Типа "SetAll (Field1,Filed2,Field3+[.Enable]) := False", жалко, что нет такой конструкции
3. FindComponent да, но названия разные, лучше назвать нормально, чем потом ковыряться пытаясь понять что обозначает название Tlabel100500. TActionList похоже не подходит, да и разницы видимо нет со списком/массивом в коде, а поскольку это компонент формы - код будет хуже читаться.
2, 3. Ещё вариант, весьма универсальный.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #9  
Старый 22.07.2011, 01:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от delphicoding
2. Ну это да, массив... думал может можно побыстрее как-то одним действим через запятую. Типа "SetAll (Field1,Filed2,Field3+[.Enable]) := False", жалко, что нет такой конструкции
3. FindComponent да, но названия разные, лучше назвать нормально, чем потом ковыряться пытаясь понять что обозначает название Tlabel100500. TActionList похоже не подходит, да и разницы видимо нет со списком/массивом в коде, а поскольку это компонент формы - код будет хуже читаться.
4. Круто, я знал, что такое должно быть! Спасибо.

2. Ну, например, можно изголяться так:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
const
  A : Array [1..2] Of Array [1..5] Of String =
   (('Edit1','Edit2','Edit3','Edit4','Edit5'),
    ('Edit1','edMyEdit','TheOtherEdit','',''));
 
procedure TForm1.SetMyControls(ACaseNumber : Integer);
var
  I : Integer;
begin
  For I := 1 To 5 Do
    If A[ACaseNumber,I] <> '' Then
       (FindComponent(A[ACaseNumber,I]) As TEdit).Enable := True;
end;
Вот тебе все и будет сделано в один вызов. А имена можно передавать и прямо в массиве, например:
Код:
1
2
3
4
5
6
7
procedure TForm1.SetMyControls(AValue : Boolean; ANames : Array Of String);
var
  I : Integer;
begin
  For I := Low(ANames) To High(ANames) Do
    (FindComponent(ANames[i]) As TEdit).Enabled := AValue;
end;
Опять же один вызов, в котором просто передаются имена компонентов.

3. Вот тебе пара названий:
Код:
1
2
3
4
5
rbDoThis : TRadioButton;
edDoThis : TEdit;
 
rbDoThat : TRadioButton;
edDoThat : TEdit;

Соотв, можно написать что-то вроде этого:
Код:
1
2
3
4
5
6
7
8
9
procedure TForm1.rbClick(Sender : Tobject);
var
  AName : String;
begin
  AName := (Sender As TRadioButton).Name;
  AName[1] := 'e';
  AName[2] := 'd';
  (FindComponent(AName) As TEdit).Enabled := (Sender As TRadioButton).Checked;
end;

И присвоить его всем кнопкам. Соотв. при смене состояния кнопка найдет соотв. компонент и сделает все что нужно.
Ответить с цитированием
  #10  
Старый 22.07.2011, 11:50
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Большое спасибо за ответы, про массивы хорошо объяснили!
Значит подходит только массив или FindComponent или ComponentCount если имена однотипные или объекты расположены подряд, но в данном случае имена разные и одинаково называть обрабатываемые множеством процедур поля я категорически против, а ComponentCount правда элегантное решение, только немного стрёмное, тк в случае добавления/удаления/передвижения объектов всё можно пойти вкривь.
Хотя вопрос был именно "есть ли возможность/функция позволяющая сделать назначение параметра списку объектов в одну строку вида : "SetAll (Field1,Filed2,Field3+[.Enable]) := False". Видимо в Delphi такого нет.

Кстати в продолжение темы со скрытием объектов, подскажите, пожалуйста, для ряда объектов, например TDBEdit, TJvDBSpinEdit, TJvDBComboBox, идр, не подходит строка вида:
TDBEdit1.Value=null;
Как правильно и желательно универсально очищать объекты текстового ввода и выпадающие списки от вписанных или выбранных значений?
Ответить с цитированием
  #11  
Старый 22.07.2011, 13:03
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Массив тоже млять не прокатил, тк у некоторых полей очищение = Clear, а у других очищение = ClearValue.. Козлы, млять, не могут стандарт сделать.
Ответить с цитированием
  #12  
Старый 22.07.2011, 13:31
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Ответ был намного проще. Нужно просто группировать поля на одну Tpanel - которую можно сделать недоступной или вообще скрыть. Всё действие в одну строку - Tpanel.Visible := False.

Но это только блокирует (Enable) или скрывает (Visible), но не очищает поля...

Может есть функция "очистить все поля на панели Tpanel" ? Или типа того?

Последний раз редактировалось delphicoding, 22.07.2011 в 13:35.
Ответить с цитированием
  #13  
Старый 22.07.2011, 21:12
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от delphicoding
... а ComponentCount правда элегантное решение, только немного стрёмное, тк в случае добавления/удаления/передвижения объектов всё можно пойти вкривь...
Это с какого перепугу? Справку/справочку/справище почитай.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #14  
Старый 23.07.2011, 06:25
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Цитата:
Если нужно не только выбрать лишь один из вариантов ... (типа вкладок с ограничением выбора одной вкладки, или тп)
Вкладки подходят - только одну можно выбрать и есть свойство ActivePage
Цитата:
"SetAll (Field1,Filed2,Field3+[.Enable]) := False".
сейчас подобное делаю но выглядит это неособо
так связывается строка в ini с тремя свойствами
PHP код:
ini.define('highlight''background', [Prop(SynEdit1'Color'), Prop(SynEdit1.Gutter'Color'), Prop(SynEdit1.Gutter'BorderColor')]); 
первое - ведущее, когда оно меняется:
Цитата:
ini.unmap
и все три устанавливаются
Ответить с цитированием
  #15  
Старый 23.07.2011, 16:19
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

angvelem
Может и нормально. В общем тоже хорошее решение. Хотя панель ещё проще - вообще ничего прописываь не нужно.
Жалко, только, что если параметр Enebled везде идентичен, то параметр Clear увы различается у разных полей (бывает ClearValue, итд) - поэтому обработка группы/массива получается только по параметру Visible / Enabled, а очищать приходится по одному...

Pyro
Цитата:
Вкладки подходят - только одну можно выбрать и есть свойство ActivePage
Не особо, тк выбирая вкладку 1 вкладка 2 НЕ блокируется и поля НЕ очищаются. Да и визуально ничто не говорит о том, что эти две вкладки подразумеваются как исключающие.

Не понял - без ini это работать вроде как не должно?

Последний раз редактировалось delphicoding, 23.07.2011 в 16:21.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:27.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025