Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с процедурами и переменными, в скопированном окне 
V
    Опции темы
Sunvas
Дата 8.4.2006, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Я копирую форму2 вот так:

Код

var   m:array of tform;
      i:word=0;
implementation
{..........}

procedure TForm1.Button1Click(Sender: TObject);
begin
inc(i);
setlength(m,i);
m[i-1]:=tform2.Create(application);
m[i-1].Show;
m[i-1].Update;
end;

Я оригинале формы есть прописанные мною процедуры и переменные. Как копиям переменных присвоить какое-то значение, а копии процедур выполнить в копиях формы2?



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Snowy
Дата 8.4.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Sunvas @ 8.4.2006, 07:50 Найти цитируемый пост)
Я копирую форму2 вот так:
Это не копирование, а создание экземпляров TForm2.

Цитата(Sunvas @ 8.4.2006, 07:50 Найти цитируемый пост)
Я оригинале формы есть прописанные мною процедуры и переменные. Как копиям переменных присвоить какое-то значение, а копии процедур выполнить в копиях формы2?
Бред какой-то. Ты кто по национальности?

m[i-1].Caption := 'Слон';
m[i-1].Left := 0;
PM MAIL   Вверх
Sunvas
Дата 9.4.2006, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(Snowy @ 8.4.2006, 11:04 Найти цитируемый пост)
Это не копирование, а создание экземпляров TForm2.

Спасибо за поправку.

Цитата(Snowy @ 8.4.2006, 11:04 Найти цитируемый пост)
Бред какой-то.

Тоже спасибо! Я люблю критику. smile smile

Попробую пояснить немного по доступнее. Мне нужно в одном из экземпляров формы2 выполнить процедуру, например button1click (или другую), присвоить зачение переменной. Как это сделать?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Snowy
Дата 9.4.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Теперь понятно.
Только подход с динамическим массивом выбран неудачно.
Грамотно это делается по другому:
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Contnrs, 
  Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton; // кнопка "Добавить форму" 
    Button2: TButton; // кнопка "Действие с формой"
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    FForms: TObjectList; // список форм
    function GetForm2(Index: integer): TForm2;
    function GetCount: integer;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function AddForm2: TForm2;  // создать новую Form2
    procedure CloseForm2(Index: integer); // Удалить Form2 под номером Index
    property Form2[Index: integer]: TForm2 read GetForm2; // Обращение к списку Form2
    property FormsCount: integer read GetCount; // кол-во форм2
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TForm1.Create;
begin
  inherited;
  FForms := TObjectList.Create; // создаем список форм в конструкторе
end;

destructor TForm1.Destroy;
begin
  FForms.Free; // в деструкторе уничтожаем все формы и список
  inherited;
end;

function TForm1.GetCount: integer;
begin
  result := FForms.Count;
end;

function TForm1.GetForm2(Index: integer): TForm2;
begin
  if (Index < 0) or (Index >= FForms.Count) then result := nil
  else result := TForm2(FForms[Index]);
end;

function TForm1.AddForm2: TForm2;
begin
  result := TForm2.Create(nil);
  FForms.Add(result);
  result.Show; // при создании сразу показываем форму 
end;

procedure TForm1.CloseForm2(Index: integer);
begin
  if GetForm2(Index) <> nil then FForms.Delete(Index); // убить форму
end;


// теперь все это пробуем:
procedure TForm1.Button1Click(Sender: TObject);
begin
  AddForm2; // создать новую форму
end;

// взять последнюю созданную форму,
procedure TForm1.Button2Click(Sender: TObject);
begin
  Form2[FormsCount-1].Caption := Edit1.Text; // поменять ей заголовок 
  Form2[FormsCount-1].Button1.Click;  // Нажать ей на кнопку 
end;

end.

PM MAIL   Вверх
Sunvas
Дата 10.4.2006, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



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

Цитата(Snowy @ 9.4.2006, 16:28 Найти цитируемый пост)
Form2[FormsCount-1].Caption := Edit1.Text; // поменять ей заголовок 
Form2[FormsCount-1].Button1.Click;  // Нажать ей на кнопку

Для кнопки все просто - есть процедура click. А как, например (см. в коментарии)
Код

type
  TForm2 = class(TForm)
    procedure mess; //Выполнить эту функцию
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  m:string; //присвоить значение этой переменной
implementation

{$R *.dfm}
 procedure tform2.mess;
 begin
 showmessage(m);
 end;


Для одного из экземпляров формы2?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Snowy
Дата 10.4.2006, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



В твоем примере m - глобальная.
Чтобы она принадлежала экземпляру формы, внеси ее в секцию public формы.
Код
type    
  TForm2 = class(TForm)    
    procedure mess; //Выполнить эту функцию    
  public    
    m:string; //присвоить значение этой переменной    
  end;    
// var Form2: TForm2; а эта строка нам вообще больше не нужна
implementation    
{$R *.dfm}    
 procedure tform2.mess;    
 begin    
   showmessage(m);    
 end;

Соответственно присвоить:
Код
Form2[FormsCount-1].m := Edit1.Text;

PM MAIL   Вверх
Sunvas
Дата 11.4.2006, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Snowy, спасибо!!!


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2719 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.