Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Одинаковые действия на разных формах


Автор: mmv 28.1.2004, 23:25
Как сделать, чтобы действия, одинаковые для одинаковых компонентов различных форм выполнялись одной процедурой? Например, есть Image1 на каждой из форм Form1, Form2, Form3. Нужно загрузить в них картинку. Но, например, так как я было написал, выполнить нельзя. А как можно?

procedure Fill (F : TForm);
begin
With F do
Image1.Picture.LoadFromFile('1.jpg');
end;

Автор: Полудненко Олег 29.1.2004, 00:05
Поидее надо юзать FindComponenet

Автор: mmv 29.1.2004, 00:41
Если на одной форме – можно. Например, назначением в массив.
For i := 1 to 10 do
MyImage[i]:=FindComponent(Format('Image%d',[i])) as TImage;
Но это же не совсем то. Неужели нельзя сделать как-то иначе?

Автор: Fedor 29.1.2004, 01:16
Код

For i:=1 to Screen.FormCount do
begin
  Screen.Forms[i].I.Picture.LoadFromFile('..');
  .......
end;

Автор: mmv 29.1.2004, 03:40
Если я правильно понял, здесь I - название Image? По-моему, так мы получим 'Undeclared identifier'.

Автор: <Spawn> 29.1.2004, 07:22
Можно, например, так сделать:

Код
procedure TForm1.Button1Click(Sender: TObject);
var
 i, j: integer;
begin
if OpenDialog1.Execute then
 for i := 0 to Screen.FormCount - 1 do
   for j := 0 to Screen.Forms[i].ComponentCount - 1 do
     if (Screen.Forms[i].Components[j] is TImage) and
        (Screen.Forms[i].Components[j].Tag = 100) then // Для идентификации нужного TImage можешь в его свойство Tag поместить нужное тебе значение
        begin
          TImage(Screen.Forms[i].Components[j]).Picture.LoadFromFile(OpenDialog1.FileName);
          TImage(Screen.Forms[i].Components[j]).Width :=
            TImage(Screen.Forms[i].Components[j]).Picture.Bitmap.Width;
          TImage(Screen.Forms[i].Components[j]).Height :=
            TImage(Screen.Forms[i].Components[j]).Picture.Bitmap.Height;
        end;
end;

Автор: <Spawn> 29.1.2004, 07:26
Можно сделать сохранения нужных указателей на экземпляры TImage в массиве, но если формы будут динамически создаваться\уничтожаться, то прийдется этот массив динамически корректировать.

Автор: Петрович 29.1.2004, 08:18
Может чего и не понял, но автору похоже требуется следующее:
Код
// это один на всех экземпляр действия
procedure Fill (Img :TImage);
begin
 Img.Picture.LoadFromFile('1.jpg');
end;

Соответственно в форме 1:
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
 Fill(Image1);
end;

в форме 48:
Код
procedure TForm48.Button36Click(Sender: TObject);
begin
 Fill(Image56);
end;

Автор: Fedor 29.1.2004, 13:32
Цитата
Если я правильно понял, здесь I - название Image? По-моему, так мы получим 'Undeclared identifier'.


Да. Правильно понял.

<Spawn> Неплохой вариант, но Я так не люблю писать.... smile.gif

Автор: oomneeq 29.1.2004, 19:55
Цитата(mmv @ 28.1.2004, 23:25)
Как сделать, чтобы действия, одинаковые для *одинаковых* компонентов *различных* форм выполнялись одной процедурой? Например, есть Image1 на каждой из форм Form1, Form2, Form3. Нужно загрузить в них картинку. Но, например, так как я было написал, выполнить нельзя. А как можно?

procedure Fill (F : TForm);
begin
  With F  do
  Image1.Picture.LoadFromFile('1.jpg');
end;

IMHO, общевата формулировочка для хорошего ответа smile.gif, смотря что подразуметь под степенью одинаковости компонент и различности форм.
Одинаковй класс или одинаковое имя?

Может я угадаю хоть приблизиттельно твою нужду

>Например, есть Image1 на каждой из форм Form1, Form2, Form3

При таком раскладе стОит создать общий предок TFormWithAnImage, содержащий Image
а формы Form1, Form2, Form3 унаследовать от него (хоть напрямую, хоть через друг дружку)
через визюальное наслед-е форм.
В этой TFormWithAnImage определяшь свою Fill в разделе public
после этого любой Form1, Form2, Form3 знают FIll и могут его вызвать.
Соответственно если передавать кудато параметр как TFormWithAnImage то также можно обращаться к евойному FIll

Более того, если речь к примеру только об одинаковом имаже для всех форм, н то можно в общем предке оперделить ImageList и сразу прописать в нем нужные имажи, тогда при наследовании одинаовый имаж будет у всех автоматычно.


Сорри если не угадал хода мыслей или
изложил тривиальности smile.gif





Автор: mmv 30.1.2004, 14:48
[QUOTE=Петрович,29.1.2004, 08:18]
Код
// это один на всех экземпляр действия
procedure Fill (Img :TImage);
begin
 Img.Picture.LoadFromFile('1.jpg');
end;

Простите за, очевидно, глупый вопрос. А куда я должен поместить саму процедуру Fill, чтобы таким образом ее вызывать?

Автор: Петрович 30.1.2004, 21:55
Цитата
Простите за, очевидно, глупый вопрос. А куда я должен поместить саму процедуру Fill, чтобы таким образом ее вызывать?

А куда угодно. В данном случае она не требует ссылки ни на одну форму, ведь она оперирует тем компонентом который ей передаст вызывающий. Т.е. если хочешь, можешь поместить ее в отдельный модуль, и сослаться на него в модулях форм, а можешь сапихнуть в модуль одной из форм, тогда ссылку на него надо будет добавить в список uses остальных форм.
Естественно, в том модуле где ты ее разместишь, не забудь вставить определение этой функции в интерфейсную часть.

Автор: mmv 31.1.2004, 02:05
Может, я что-то не понимаю, но если я поместил этот код в unit1 (Form1), то вызывать я его буду как
Код
procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.Fill(Image1);
end;

А ведь процедура передает только TImage.

Автор: Fedor 31.1.2004, 09:33
Если ты его поместил в класс формы, то да.
А если просто как отдельную процедуру, то нет. Тогда нужно так:
Код

procedure TForm2.Button1Click(Sender: TObject);
begin
unit1.Fill(Image1);
end;


И причем еще нужно указывать, к какой форме принадлежит Image:

procedure TForm2.Button1Click(Sender: TObject);
begin
unit1.Fill(Form1.Image1);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
unit1.Fill(Form2.Image1);
end;


Автор: mmv 31.1.2004, 12:42
Спасибо, Morpheus, это я что-то протормозил.

Автор: Петрович 31.1.2004, 22:18
Цитата
И причем еще нужно указывать, к какой форме принадлежит Image:

А вот это не всегда. Например в твоих примерах во втором случае ты вызываешь Fill внутри метода формы Form2, а следовательно можешь ссылаться на свойства этой формы не квалифицируя их. Т.е. вполне можно его переписать и так:
Код
procedure TForm2.Button1Click(Sender: TObject);
begin
 unit1.Fill(Image1);
end;


Но и квалифицировать не возбраняется, естественно если у тебя в программе лишь один экземпляр формы tForm2.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)