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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2012, 17:06   #1
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
Вопрос Динамическое создание компонентов с динамически задаваемыми именами - возможно ли это??

Здравствуйте!
Вопрос элементарный, но решить не получается хотя интернет весь прочитал.
Есть некая родительская форма которая затем наследуется кучей форм (назовём BaseForm).
Из этой формы создано много дочерних inherited форм (назовём FormA,FormB,FormX..), в каждой уже свои дела.
Есть некий единый объект DataMaster отдельный от всех этих форм, к нему обращаются все дочерние формы во время работы.
Задача - нужно из дочерних форм OnCreate создавать в DataMaster некий Dataset с заданным именем, чтобы все формы могли к нему обратиться, а после использования уничтожать.
Вопрос - какой код написать в BaseForm, чтобы при открытии FormA,FormB,FormX.. в DataMaster создавался Dataset с именем соответствующим Form вида DatasetFormA,DatasetFormB,DatasetFo rmX... ??? (чтобы можно было к нему обращаться)

PS Получается сделать всё, кроме как главное - Delphi никак не даёт указать динамическое название для создаваемого объекта вида ['Dataset'+Self.Name := fDataMaster.Create(TDataset)]. Пробовал через AS ['Dataset'+Self.Name as DatasetDef:= fDataMaster.Create(TDataset)] и соот наоборот - тоже не пропускает.
Пробовал иначе - создавать через единую переменную DatasetDef, а затем [DatasetDef.Name:='Dataset'+Self.Nam e] - но программа на этом вылетает с критической ошибкой, кроме того, этот код видимо не подойдёт для созданных Dataset начиная со второго, тк название переменной как у первого созданного.
delphicoding вне форума Ответить с цитированием
Старый 28.03.2012, 17:50   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

компоненты разных форм могут иметь одинаковое название.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.03.2012, 17:55   #3
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Все компоненты создаются в ОДНОЙ ЕДИНОЙ ФОРМЕ!
(По примеру - компоненты Dataset из всех окон нужно создать в одном объекте DataMaster!)
delphicoding вне форума Ответить с цитированием
Старый 28.03.2012, 21:26   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...кто мешает объявить глобальный динамический массив компонентов и при создании каждой формы просто индексировать новый элемент?
Цитата:
var ds: array of Dataset;

...
setlength(d, length(d)+1);
Обращаться просто d[i]
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 28.03.2012, 21:40   #5
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Не понял, что Вы предложили, но мне кажется это работать не будет. :D
Или вы предлагаете заранее их определить? Это не решение задачи, это и так понятно, можно и в каждой форме свой код написать...
delphicoding вне форума Ответить с цитированием
Старый 29.03.2012, 00:45   #6
Triplecool
Пользователь
 
Регистрация: 25.03.2012
Сообщений: 15
По умолчанию

Вместо memo можно подставить любой другой компонент:
Код:
function TForm1.NewMemo(Memo: TMemo; AOwner: TComponent): TMemo;
var Stream: TMemoryStream;
begin
 Stream := TMemoryStream.Create;
 try
   Stream.WriteComponent(Memo);
   Stream.Position := 0;

   Result := TMemo.Create (nil);
   Result.Parent := Memo.Parent;
   Stream.ReadComponent(Result);
 finally
   Stream.Free;
 end;
end;
Вот как этим пользоваться:

Код:
procedure ...
var MemoN:TMemo;
begin
MemoN:=NewMemo(Memo1,self); //где MemoN наследует все свойвства Memo1 (свойвства           MemoN можно изменять) 
end;
Triplecool вне форума Ответить с цитированием
Старый 29.03.2012, 23:16   #7
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Код:
procedure ...
var MemoN:TMemo;
begin
MemoN:=NewMemo(Memo1,self); //где MemoN наследует все свойвства Memo1 (свойвства           MemoN можно изменять) 
end;
Круто, но в базовой форме ещё никакого MemoN (FormA,FormB,FormX итд), они после наследуются!
Вот и не понятно как написать в базовой форме BaseForm универсальный код работающий во всех inherited формах FormA,FormB,FormX динамически создающий объекты в другом общем объекте DataMaster с использование названий inherited форм вида DatasetA,DatasetB,DatasetX... ???
delphicoding вне форума Ответить с цитированием
Старый 30.03.2012, 00:21   #8
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

можно попробовать как-то так оформить (процесс удаления по-хорошему дорабатывать нужно, но смысл очевиден)
Код:
unit Unit2;

interface

uses
  SysUtils, Classes, DB, DBTables;

type
  TDataModule2 = class(TDataModule)
  private
    { Private declarations }
    Datasets: array of TDataset;
    function GetCount : integer;
  public
    { Public declarations }
    property DatasetsCount : integer read GetCount;
    function AddDataset() : TDataset;
    procedure CloseDataset(Ds : TDataset);
  end;

var
  DataModule2: TDataModule2;

implementation

{$R *.dfm}

procedure TDataModule2.CloseDataset(Ds : TDataset);
var I, J : integer;
begin
  J := -1;
  For I := 0 to GetCount - 1 do
    if Ds = Datasets[I] then
      J := I;
  if J > 0 then
    begin
      DataSets[J] := Datasets[GetCount - 1];
      SetLength(Datasets, GetCount -1);
      Ds.Destroy;
    end;
end;

function TDataModule2.AddDataset: TDataset;
begin
  SetLength(Datasets, GetCount + 1);
  Datasets[GetCount-1] := TDataset.Create(nil);
  Result := Datasets[GetCount-1];
end;

function TDataModule2.GetCount: Integer;
begin
  GetCount := Length(Datasets);
end;

end.
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 30.03.2012 в 00:27.
DiemonStar вне форума Ответить с цитированием
Старый 30.03.2012, 07:39   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
в DataMaster создавался Dataset с именем соответствующим Form
Зачем? Вынеси это поле в класс формы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2012, 08:46   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Задача - нужно из дочерних форм OnCreate создавать в DataMaster некий Dataset с заданным именем, чтобы все формы могли к нему обратиться, а после использования уничтожать.
По этому описанию получается, что дочерняя форма создаёт глобальный объект.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание и удаление компонентов на форме The SCS Общие вопросы Delphi 1 11.02.2012 13:11
[Новичёк]Динамическое создание компонентов из бд Detka.i.alex Общие вопросы Delphi 3 04.04.2011 16:23
динамическое создание компонентов DOLBY Компоненты Delphi 10 17.10.2010 14:03
Динамическое создание компонентов Nice42ru Помощь студентам 4 03.01.2010 20:51
Как динамически добавить Мемо на форму? Динамическое создание компонентов! werser Помощь студентам 1 14.06.2007 00:39