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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2011, 21:45   #1
abzhapparovmaxat
Пользователь
 
Регистрация: 05.10.2011
Сообщений: 33
По умолчанию Процедура или функция для повторного действия для разных объектов на форме

Доброго времени суток!
Возник вопрос для упрощения работы с кодом, после долгого поиска в сети, не смог найти ответов, наверно из-за того что не знаю как правильно спросить и поиск не умеет читать мои мысли. Вообщем...
Мне нужна то ли процедура то ли функция которая выполняет одно и тоже действие, одно только НО! это действие должно выполнятся для разных объектов на форме, то есть я укажу переменную которая в теле процедуры(функции) будет подставлятся к ИМЕНИ объекта (как-то так Edit[x], где x это переменная которая будет входящим значением в процедуре(функции).
Если Вам непонятно можете задать вопрос, Я постораюсь конкретезировать.
abzhapparovmaxat вне форума Ответить с цитированием
Старый 06.10.2011, 21:48   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А Sender: TObject чем не устраивает? Анализируйте в процедуре какой класс, имя или значение TAG (в нем можно прописать любое int-значение) и делайте соответствующие действия
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.10.2011, 21:54   #3
abzhapparovmaxat
Пользователь
 
Регистрация: 05.10.2011
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А Sender: TObject чем не устраивает? Анализируйте в процедуре какой класс, имя или значение TAG (в нем можно прописать любое int-значение) и делайте соответствующие действия
А можно примерчик.
Допустим на форме три кнопки(button1, button2, button3), три эдитполя(edit1, edit2, edit3) и три лэйбла(label1, label2, label3). Надо сделать так чтоб на нажатие кнопки текст в эдитполе копировался в лэйбл соответственно последней цифре в имени) Просто примерно такой код, у меня в проге будет повтрятся раз 15, и чтобы поменять его мне приходится меня во всем коде.
Помогите пожалуйсята на примере.
abzhapparovmaxat вне форума Ответить с цитированием
Старый 06.10.2011, 23:37   #4
Asinkrit
Пользователь
 
Аватар для Asinkrit
 
Регистрация: 02.04.2011
Сообщений: 48
По умолчанию

Можно к примеру так:
Код:
procedure TForm1.ButtonClick(Sender: TObject);
var
  i:integer;
  aLabel:TLabel;
  aEdit:TEdit;
begin
  aLabel:=nil;
  aEdit:=nil;
  if (Sender is TButton) then
    if ControlCount > 0 then
      for i:=0 to ControlCount-1 do
        begin
        if not Assigned(aLabel) then
          if (Controls[i] is TLabel) then
            if (Controls[i] as TLabel).Tag = (Sender as TButton).Tag then
              aLabel:=(Controls[i] as TLabel);
        if not Assigned(aEdit) then
          if (Controls[i] is TEdit) then
            if (Controls[i] as TEdit).Tag = (Sender as TButton).Tag then
              aEdit:=(Controls[i] as TEdit);
        if Assigned(aLabel) and Assigned(aEdit) then Break;
        end;
  if Assigned(aLabel) and Assigned(aEdit) then
    aLabel.Caption:=aEdit.Text;
end;
Достаточно назначить данный обработчик всем кнопкам на форме. но всем объектам одной группы, нужно назначить один и тот же Tag; то есть, Button1.Tag:=1; Label1.Tag:=1; Edit1.Tag:=1; Button2.Tag:=2; Label2.Tag:=2; Edit2.Tag:=2; и т. д. и т. п.
Asinkrit вне форума Ответить с цитированием
Старый 07.10.2011, 07:54   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Я нередко решаю такую проблему без динамического поиска компонентов.
Завожу разные массивы контролов со сквозной индексацией. В них складываю (обычно в FormCreate) нужные контролы, потом просто работаю по единому индексу. Складывать в массивы можно тем же findcomponent/ controls, а можно и вручную(если не оч много их)
Код:
const 
  CC = 3 // components count
var
EdAr : [1..cc] of tedit;
LaAr : [1..cc] of tlabel;
BtAr : [1..cc] of tbutton;
...
procedure tform1.formcreate(sender : tobject);
begin
edar[1] := edit1;
laar[1] := label1;
btar[1] := button1;
btar[1].tag := 1;
// также и остальные, можно всё это и через цикл и findcomponent занести
end;
...
procedure tform1.buttonclick(sender : tobject); // всем кнопкам назначено это 
 //событие, его, кстати, тоже можно назначить им в том же formcreate
var 
  t : integer;
begin
t := (sender as tbutton).tag;
laar[t].caption := edit[t];
end;
Ещё могу посоветовать не плодить на форме все 15 наборов контролов мышаком, задавать вагон свойств, лучше напишите их создание динамически - и сразу в массиве, и выравнивание/размещение на форме, и кучу характеристик - в достаточно простом куске кода. Примеры ищите по запросу в поиске форума - "динамическое создание компонентов"

Последний раз редактировалось Stilet; 07.10.2011 в 08:12.
phomm на форуме Ответить с цитированием
Старый 07.10.2011, 09:18   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Допустим на форме три кнопки(button1, button2, button3), три эдитполя(edit1, edit2, edit3) и три лэйбла(label1, label2, label3). Надо сделать так чтоб на нажатие кнопки текст в эдитполе копировался в лэйбл соответственно последней цифре в имени)
Еще один вариант решения (не фреймах) Tframe
К проекту добавляется новый модуль (новый Frame).(file New Frame)
на котором размещается 1 button 1 Edit 1 Label
для них описывается нужный функционал. (OnKeyPress и т.д.).
На нашу форму добавляется нужное количество таких фреймов.(компонент frame на вкладке Standart из предложенного списка выбрать наш (созданный на предыдущем шаге скорее всего он будет там один).
Это можно делать как в дизайн так и программно.
Все!
Из плюсов.
При изменении функционала во фрейме (новые control's) никаких действий на форме (настройки массивов, тегов, соответствия имен и т.п.) проводить не требуется. Достаточно скорректировать функционал собственно фрейма.
единообразное размещение контролов на форме получается автоматически.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 07.10.2011 в 09:42.
evg_m вне форума Ответить с цитированием
Старый 07.10.2011, 09:21   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Допустим на форме три кнопки(button1, button2, button3), три эдитполя(edit1, edit2, edit3) и три лэйбла(label1, label2, label3). Надо сделать так чтоб на нажатие кнопки текст в эдитполе копировался в лэйбл соответственно последней цифре в имени)
Еще один вариант решения (не фреймах) Tframe
К проекту добавляется новый Frame.
на котором размещается 1 button 1 Edit 1 Label
для них описывается нужный функционал. (OnKeyPress и т.д.).
На нашу форму добавляется нужное количество таких фраймов.
Это можно делать как в дизайн так и программно.
Все!
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.10.2011, 11:34   #8
abzhapparovmaxat
Пользователь
 
Регистрация: 05.10.2011
Сообщений: 33
По умолчанию

Asinkrit - Этот вариант не решает как бы проблему глобально, мне так же придется копировать код во все процедуры кнопки ОнКлик. Просто я перехожу с ПБэйсика на Дэльфи, там решалась эта проблема, тем что созданные ГАДЖЕТЫ, а по Дэльфийски КОМПОНЕНТЫ(или ОБЪЕКТЫ) имеют свое ИД, то есть прям в коде можно вместо ИМЕНИ использовать ЧИСЛО(интеджер), которое выполняет абсолютно все функции ГАДЖЕТА к которому оно прикреплено. С помощью не хитрых сложений-вычитаний можно было создать универсальную процедурку в начале кода, и вставлять ее куда угодно, со входящим переменным ИД-значением, то есть я мог свободно одну и туже процедуру использовать как для кнопки1, которая копировала Эдит1 в Лэйбл1, как для кнопки2, которая копировала Эдит2 в Лэйбл2. Примерно так(схематично)
...
Процедура ПроцедураДляКнопок (х)
вставить из Эдит+х в Лэйбл+х
КонецПроцедуры
...
Если нажали на Кнопка1, то ПроцедураДляКнопок (1)
Если нажали на Кнопка2, то ПроцедураДляКнопок (2)
Если нажали на Кнопка3, то ПроцедураДляКнопок (3)
...
Если нажали на Кнопка15, то ПроцедураДляКнопок (15)

Может быть есть подобное в Дэльфи?
___________________________________ _________________________________

phomm Разбираю Ваш пример)

___________________________________ _________________________________

evg_m Прикольно, но я не представляю себе это, можете предоставить примерчик простенький, желательно с комиентариями

Последний раз редактировалось abzhapparovmaxat; 07.10.2011 в 11:43.
abzhapparovmaxat вне форума Ответить с цитированием
Старый 07.10.2011, 13:16   #9
Asinkrit
Пользователь
 
Аватар для Asinkrit
 
Регистрация: 02.04.2011
Сообщений: 48
По умолчанию

Цитата:
Сообщение от abzhapparovmaxat Посмотреть сообщение
Asinkrit - Этот вариант не решает как бы проблему глобально...
...
создать универсальную процедурку в начале кода, и вставлять ее куда угодно, со входящим переменным ИД-значением, то есть я мог свободно одну и туже процедуру использовать как для кнопки1, которая копировала Эдит1 в Лэйбл1, как для кнопки2, которая копировала Эдит2 в Лэйбл2.
Что значит не решает, это одна процедура на все ваши кнопки, ничего копировать не надо, она делает все то что вы хотите.. внимательнее будьте.. вам надо только назначить эту процедуру для всех кнопок в инспекторе объектов, и элементы пронумеровать по группам (свойство Tag у объектов) минимум кода, вполне изящное решение.. В обработчик перелается объект который ее вызвал Sender: TObject - это одна из ваших кнопок, в зависимости от tag-а этой кнопки, находятся на форме label и edit с такими же Tag-ами, и производится копирование текста.

Последний раз редактировалось Asinkrit; 07.10.2011 в 13:20.
Asinkrit вне форума Ответить с цитированием
Старый 07.10.2011, 17:39   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
можете предоставить примерчик простенький, желательно с комиентариями
frames.zipдержи.
комментировать там нечего. Моего кода всего одна строка
Код:
self.Label1.Caption:=self.Edit1.Text;
Все остальное описано в моем посте.
Цитата:
К проекту добавляется новый модуль (новый Frame).(file New Frame)
на котором размещается 1 button 1 Edit 1 Label
у меня это unit2 (Frame2)
Цитата:
для них описывается нужный функционал. (OnKeyPress и т.д.).
у меня это Onclick для кнопки.
Цитата:
На нашу форму добавляется нужное количество таких фреймов.
.
я добавил 3 раза.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 07.10.2011 в 17:51.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Плагин для Windows или действия с контекстным меню при выборе опр. типа файла Человек_Борща Общие вопросы Delphi 7 02.10.2011 21:09
Рекурсивная процедура или функция Homutova_Julia Общие вопросы Delphi 1 29.05.2011 00:57
Нужна функция или процедура для того чтобы программа стала резидентной! star007 Помощь студентам 3 22.03.2010 08:59
Универсальная функция для действия над матрицами devl Общие вопросы C/C++ 10 30.01.2010 18:49
Одна функция для нескольких объектов Salomon Помощь студентам 2 25.11.2008 16:32