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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2016, 17:03   #1
zdus2757
vk.com/replog
Пользователь
 
Регистрация: 04.05.2012
Сообщений: 87
Радость FindComponent

Всем привет, такая проблемка у меня возникла с FindComponent
пишу так:
Код:
For N:=2 to 8 do
Begin
if TCheckBox(Form1.Setting.FindComponent('CheckBox' + IntToStr(N)) ).Checked then
begin
Config.WriteString('Настройки',ZagStr3[N-1],'Включены');
Config.WriteInteger('Настройки',ZagStr2[N-1],StrToInt(TEdit(Form1.Setting.FindComponent('Edit' + IntToStr(N-1)) ).Text));
end else begin
Config.WriteString('Настройки',ZagStr3[N-1],'Выключены');
Config.WriteInteger('Настройки',ZagStr2[N-1],0);
end;
End;
это последнее что я написал "пытаясь заставить его работать"
пробовал множество разных способов чтоб он заработал и в итоге 1 способ заработал, но работал только 1 раз, т.е. когда я тыкал кнопку он мне писал ошибку, но не A/V а другую, этот код что сейчас я показал выдает мне A/V

вопрос мой вот в чем: что именно возвращает FindComponent?
пример отсюда я пытался использовать и как раз это и был "рабочий" способ но как сказал при втором нажатии на кнопку вызывает ошибку

код должен записывать исходя из чекбоксов данные в ini файл
zdus2757 вне форума Ответить с цитированием
Старый 20.02.2016, 17:29   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Код:
if TCheckBox(Form1.Setting.FindComponent('CheckBox' + IntToStr(N)) ).Checked
Перепишите это так:
Код:
if (Form1.Setting.FindComponent('CheckBox' + IntToStr(N)) AS TCheckBox).checked then...
Вадим Мошев вне форума Ответить с цитированием
Старый 20.02.2016, 17:42   #3
zdus2757
vk.com/replog
Пользователь
 
Регистрация: 04.05.2012
Сообщений: 87
По умолчанию

Так тоже вроде пытался но не выходило, тестану завтра ещё раз, спасибо)
zdus2757 вне форума Ответить с цитированием
Старый 20.02.2016, 18:01   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
что именно возвращает FindComponent?
Возвращает TComponent.

Если не ошибаюсь, от этого класса наследуются все остальные компоненты (например, TEdit, TMemo и т.д)

Чтобы выполнить преобразование к более конкретному типу, используют оператор AS.
Например:
Код:
var 
	tmp: TComponent;
	st: string;
begin
...
	tmp:=form1.findComponent('тут мы напишем имя компонента');
	// будет работать, если tmp ГАРАНТИРОВАНО ьудет содержать объект TEdit
	st:=(tmp AS TEdit).text; // Обращаемся к полю text найденного компонента, предварительно преобразовав его тип к TEdit
...
end;

Последний раз редактировалось Вадим Мошев; 20.02.2016 в 18:18.
Вадим Мошев вне форума Ответить с цитированием
Старый 20.02.2016, 18:06   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

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

Код:
var xComponent: TComponent;

  xComponent:= Form1.Setting.FindComponent('CheckBox' + IntToStr(N)); // А Ещё вторая закрывающая скобка - прим. Вадим
  if (xComponent is TCheckBox) and TCheckBox(xComponent).Checked then ...
Можно и по массиву-свойству Controls этой панели пробежаться. с тем же результатом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Вадим Мошев; 20.02.2016 в 18:31.
Аватар вне форума Ответить с цитированием
Старый 20.02.2016, 18:17   #6
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
as подымет исключение, если там не то, что ожидается
Да. Будет написано "Invalid typecat (недопустимое преобразование типа)". Хотел было рассказать про IS, да решил остановиться.

Кстати, Евгений.
Цитата:
Код:
xComponent:= Form1.Setting.FindComponent('CheckBox' + IntToStr(N):
Опечатка?

Последний раз редактировалось Вадим Мошев; 20.02.2016 в 18:20.
Вадим Мошев вне форума Ответить с цитированием
Старый 20.02.2016, 18:23   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Опечатка?
Да, подправил. Вечный напряг с регистрами клавиатуры
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.02.2016, 03:35   #8
zdus2757
vk.com/replog
Пользователь
 
Регистрация: 04.05.2012
Сообщений: 87
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
as подымет исключение, если там не то, что ожидается. Если Setting панель или другой контейнер с чекбоксами, то лучше с проверкой так:

Код:
var xComponent: TComponent;

  xComponent:= Form1.Setting.FindComponent('CheckBox' + IntToStr(N)); // А Ещё вторая закрывающая скобка - прим. Вадим
  if (xComponent is TCheckBox) and TCheckBox(xComponent).Checked then ...
Можно и по массиву-свойству Controls этой панели пробежаться. с тем же результатом
подействовало только так, спасибо
да, Setting это панель

Еще вопрос появился, сейчас пытался написать что-то похожее только когда "открываются настройки" он должен загружать из файла в чекбоксы, но тем же финдом что-то не вышло, ошибок нет но и записывает не туда похоже, можно ли так же изменять свойства компонента? У меня мало времени было пытаться что-то написать, поэтому не все опробовал, может быть и сам найду как

Последний раз редактировалось zdus2757; 21.02.2016 в 04:27. Причина: Запись через findcomponent
zdus2757 вне форума Ответить с цитированием
Старый 21.02.2016, 04:40   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Всем привет, такая проблемка у меня возникла с FindComponent
пишу так:
ИМХО, метод FindComponent() надо использовать только в самом крайнем случае.
У тебя тут совершенно не такой случай, судя по коду.

Объясни по-русски, что тебе нужно получить.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 21.02.2016, 06:30   #10
zdus2757
vk.com/replog
Пользователь
 
Регистрация: 04.05.2012
Сообщений: 87
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
ИМХО, метод FindComponent() надо использовать только в самом крайнем случае.
У тебя тут совершенно не такой случай, судя по коду.

Объясни по-русски, что тебе нужно получить.
я нормально объяснил что я хочу

но да, ты прав, я переписал код, засунул чекбоксы и едиты в массивы и без FindComponent сделал циклы, и все работает
zdus2757 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FindComponent WOLFak Общие вопросы Delphi 9 07.07.2012 23:29
FindComponent Enclounter Windows Forms 14 26.04.2012 22:45
Проблема с FindComponent Sullla Общие вопросы Delphi 17 28.09.2011 16:30
findcomponent и tedit zotox Общие вопросы Delphi 12 30.05.2010 04:37
FindComponent StartMis Общие вопросы Delphi 3 15.12.2009 20:03