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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.08.2009, 00:11
mskvkin mskvkin вне форума
Новичок
 
Регистрация: 31.08.2008
Сообщения: 99
Репутация: 10
Вопрос Помогите разобраться с вызовом процедуры

Мне необходимо со всеми компонентами определенного типа выполнить одно и тоже действие при этом хочу написать уникальную процедуру которая бы получала имя формы

Код:
procedure TForm1.Update_Table_Query(formName :TForm);
var
  i: Integer;
begin
  for i := 0 to formName.ComponentCount-1 do
    begin
      if (formName.Components[i] is TTable) then
        begin
          TTable(formName.Components[i]).Refresh;//Обновляем
        end;
    end;
end;

как мне оптимизировать код так чтобы при вызове процедуры не нужно было указывать имя формы вот в таком виде:

Form1.Update_Table_Query(Form2);

а можно было бы указать это примерно в таком виде:

Form1.Update_Table_Query(form.name);
где form.name имя нужной нам формы если я так пишу то при компиляции выдается сообщение :
[DCC Error] Unit15.pas(57): E2010 Incompatible types: 'TForm' and 'TComponentName'

как мне приобразовать типы или кто нибудь подскажите тогда как это же можно реализовать по другому

Заранее огромное спасибо!!!
Ответить с цитированием
  #2  
Старый 04.08.2009, 09:00
PiboDIE PiboDIE вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 28
Репутация: 10
По умолчанию

Цитата:
Сообщение от mskvkin
Мне необходимо со всеми компонентами определенного типа выполнить одно и тоже действие при этом хочу написать уникальную процедуру которая бы получала имя формы

Код:
procedure TForm1.Update_Table_Query(formName :TForm);
var
  i: Integer;
begin
  for i := 0 to formName.ComponentCount-1 do
    begin
      if (formName.Components[i] is TTable) then
        begin
          TTable(formName.Components[i]).Refresh;//Обновляем
        end;
    end;
end;

как мне оптимизировать код так чтобы при вызове процедуры не нужно было указывать имя формы вот в таком виде:

Form1.Update_Table_Query(Form2);

а можно было бы указать это примерно в таком виде:

Form1.Update_Table_Query(form.name);
где form.name имя нужной нам формы если я так пишу то при компиляции выдается сообщение :
[DCC Error] Unit15.pas(57): E2010 Incompatible types: 'TForm' and 'TComponentName'

как мне приобразовать типы или кто нибудь подскажите тогда как это же можно реализовать по другому

Заранее огромное спасибо!!!

Попробуй
Код:
TForm1.Update_Table_Query(form: TObject);
...
for i := 0 to (form as TForm).ComponentCount-1 do
...
Только зачем имя формы, если процедура принадлежит вполне конкретной форме? Если эта процедура должна работать с разными формами, то её лучше вынести в отдельный модуль (общий для всех форм) и при вызове в какой-либо форме обращаться к процедуре так
Код:
Update_Table_Query(CurrentFormVariable);
Если вызов процедуры будет происходить только из процедур, принадлежащих непосредственно форме (в процедурах/функциях кнопок и других компонент лучше всетаки использовать переменную, описывающую форму), то "CurrentFormVariable" можно заменить на "self".

Если Вам всеже нужен вариант обращения к форме непосредственно по имени формы, то могу только направить по следующему пути: передавать процедуре имя формы в формате строки (FormName: string) и, соответственно перед работой с элементами формы, её необходимо найти по этому имени (на память подсказать не могу).

Последний раз редактировалось PiboDIE, 04.08.2009 в 09:05.
Ответить с цитированием
  #3  
Старый 04.08.2009, 09:29
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Вот такой код срабатывает :
Код:
function My_FormFind(FormName : string) : TForm;
Var
  Comp : TComponent;
begin
  Result:=nil;
  FormName:=trim(FormName);
  if length(FormName)>0 then begin
     Comp:=Application.FindComponent(FormName);
     if Comp<>NIL then begin
        if (Comp is TForm) then begin
           Result:=(Comp as TForm);
        end;
     end;
  end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
Var
  FormX : TForm;
begin
  FormX:=My_FormFind('Form1');
  if FormX<>NIL then begin
     ShowMessage(FormX.Name);
  end;
end;
Ответить с цитированием
  #4  
Старый 04.08.2009, 22:07
mskvkin mskvkin вне форума
Новичок
 
Регистрация: 31.08.2008
Сообщения: 99
Репутация: 10
Хорошо Всем спасибо

Всем спасибо за помощь но я уже сделал по другому
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter