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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.05.2015, 01:57
gewasop gewasop вне форума
Прохожий
 
Регистрация: 05.05.2015
Сообщения: 26
Версия Delphi: Delphi XE7
Репутация: 10
По умолчанию Создание компонентов по ивенту

Как такое реализовать? Пример бы. Например, чтобы я нажимал на кнопку и появлялись компоненты. Например FDQuery или DataSource.
Ответить с цитированием
  #2  
Старый 22.05.2015, 02:08
gewasop gewasop вне форума
Прохожий
 
Регистрация: 05.05.2015
Сообщения: 26
Версия Delphi: Delphi XE7
Репутация: 10
По умолчанию

А также интересует их уничтожение.
Ответить с цитированием
  #3  
Старый 22.05.2015, 03:02
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,100
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну так и напиши код, который их будет создавать...
Код:
var
  FDQuery : TQuery;
  FDataSource : TDataSource;

procedure TForm1.Button1Click(Sender : TObject);
begin
  if not Assigned(FDQuery) Then FDQuery := TQuery.Create(Nil);
  if not Assigned(FDataSource) Then FDataSource := TDataSource.Create(Nil);
end;

procedure TForm1.Button2Click(Sender : TObject);
begin
  if Assigned(FDQuery) Then FreeAndNil(FDQuery);
  if Assigned(FDataSource) Then FreeAndNil(FDataSource);

end;
Ответить с цитированием
  #4  
Старый 22.05.2015, 09:33
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Вот сразу проблемы.
Код:
var
  FDQuery : TQuery;
  FDataSource : TDataSource;
В этом случае начальное значение будет неопределено, и поэтому IfAssigned может выдать истину, даже если туда ничего не присвоили. Поэтому надо делать начальную инициализацию
Код:
var
  FDQuery : TQuery:=nil;
  FDataSource : TDataSource=nil;
, или сделать эти переменные приватными полям формы, тогда они будут гарантировано обнулены.
Далее.
Код:
  if Assigned(FDQuery) Then FreeAndNil(FDQuery);
  if Assigned(FDataSource) Then FreeAndNil(FDataSource);
Внутри FreeAndNil делается проверка переданного параметра на nil, поэтому внешняя проверка не нужна.
Код:
  FreeAndNil(FDQuery);
  FreeAndNil(FDataSource);
А так же Жизнь и смерть в режиме run-time
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
gewasop (22.05.2015)
  #5  
Старый 22.05.2015, 10:18
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от icWasya
...В этом случае начальное значение будет неопределено...
Вы не в курсе, что глобальные переменные ВСЕГДА инициируются 0?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 22.05.2015, 13:11
gewasop gewasop вне форума
Прохожий
 
Регистрация: 05.05.2015
Сообщения: 26
Версия Delphi: Delphi XE7
Репутация: 10
По умолчанию

Попробовал. Получаю ошибку.

Когда делаю только...
Код:
if not Assigned(TestQuery) Then 
TestQuery := TestQuery.Create(Nil);
if not Assigned(TestDataSource) Then 
TestDataSource := TestDataSource.Create(Nil);
...ничего не наблюдаю(компоненты ведь не визуальные). Вот и решил проверить:

Код:
var
  fcr_tb: Tfcr_tb;
    TestQuery : TFDQuery=nil;
    TestDataSource : TDataSource=nil;

procedure Tfcr_tb.Button1Click(Sender: TObject);
begin
if not Assigned(TestQuery) Then TestQuery := TFDQuery.Create(Nil);
if not Assigned(TestDataSource) Then TestDataSource := TDataSource.Create(Nil);
TestQuery.Connection := fdm.FDConnection1;
TestQuery.SQL.Add('SELECT * FROM MASTERS');
TestQuery.Active := True;
TestDataSource.DataSet := TestQuery;
DBGrid1.DataSource := TestDataSource;
end;
Изображения
Тип файла: png йй.PNG (48.2 Кбайт, 1 просмотров)

Последний раз редактировалось gewasop, 22.05.2015 в 13:38.
Ответить с цитированием
  #7  
Старый 22.05.2015, 13:19
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Очень символично, разрушить объекты, а затем пытаться обратиться к ним.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #8  
Старый 22.05.2015, 13:32
gewasop gewasop вне форума
Прохожий
 
Регистрация: 05.05.2015
Сообщения: 26
Версия Delphi: Delphi XE7
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Очень символично, разрушить объекты, а затем пытаться обратиться к ним.
Blja. Не то скопировал. Изменил. Спасибо. Все работает. Но как я понял, при следующем запуске программы этого компонента уже не будет? А как сделать так, чтобы он оставался?

Последний раз редактировалось gewasop, 22.05.2015 в 13:40.
Ответить с цитированием
  #9  
Старый 22.05.2015, 13:56
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну и зачем тогда такой гемморой? Может сразу поместить их на форму?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 22.05.2015, 14:17
gewasop gewasop вне форума
Прохожий
 
Регистрация: 05.05.2015
Сообщения: 26
Версия Delphi: Delphi XE7
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Ну и зачем тогда такой гемморой? Может сразу поместить их на форму?
Заранее их количество неизвестно. Хочу вообще вот что сделать(тематика БД). Возьмем за пример будущую таблицу с именем TEST.
По нажатию на кнопку создаются компоненты FDQuery и DataSource.
В компоненте FDQuery выполняется запрос на создание таблицы в БД, структура которой предварительно формируется. После создания таблицы изменяется запрос в компоненте FDQuery на 'SELECT * FROM TEST'.
Далее FDQuery подключается к DataSource. Далее DBGrid и т.д.
Ответить с цитированием
  #11  
Старый 22.05.2015, 19:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,100
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А не проще просто изменять запрос в существующих (созданных в Дизайн-тайм) компонентах? Или сделать создать формочку и потом создавать готовую форму со всеми компонентами и просто донастраивать ее на соотв. таблицу?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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