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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое(?) добавление компонентов 
:(
    Опции темы
SanLLIer
  Дата 14.1.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня созрел новый вопрос и наверное он снова из "тупых"... smile 
Допустим у меня есть форма на которой расположены поля ввода (ну пусть Edit) примерно так:

-----Блок 1-----
Поле 1
Поле 2
Поле 3
Поле 4
     [Добавить поле]
-----Блок 2-----
Поле 1
Поле 2
Поле 3
Поле 4
     [Добавить поле]

[Новый блок]

Как сделать так, чтобы при нажатии на кнопку "Добавить поле" в блоке создавалось новое поле ввода (например "Поле 5"), а по нажатию на кнопку "Новый блок", создавался соответственно новый блок (например "Блок 3")?
Заранее спасибо!

PM MAIL   Вверх
SanLLIer
Дата 14.1.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Так... С добавление новых компонентов вроде разобрался... smile 
Но теперь такая проблема... Как использовать эти свеже испеченные "эдиты"? smile Где их объявлять или что  сними вообще делать-то?
PM MAIL   Вверх
amsoft
Дата 15.1.2010, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



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

procedure TForm1.Button1Click(Sender: TObject);
begin
//создаем объект - кнопку, при этом владельцем назначаем форму
//т.е. кнопка будет уничтожаться при уничтожении формы
with TButton.Create(Form1) do
     begin
     //родителем будет форма
     parent:=self;
     //назначаем процедуру, которая будет выполняться при нажатии
     //на данную кнопку
     OnClick:=clicking;
     //отображаем кнопку
     visible:=true;
     //задаем дополнительные параметры
     Caption:='Закрыть приложение';
     Left:=8;
     Top:=50;
     width:=250;
     end;
end;

procedure tform1.clicking;
begin
close;
end;

--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
kami
Дата 15.1.2010, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(SanLLIer @  14.1.2010,  20:24 Найти цитируемый пост)
Как использовать эти свеже испеченные "эдиты"?

Я бы сделал как-то так:
Код

TBlock=class(TObjectList)
... // здесь хранятся ссылки на едиты одного блока
   // и реализован функционал для работы с ними.
end;

TBlockList=class(TObjectList)
// а здесь хранятся TBlock`s
// и реализуется работа с ними
end;


Примерный вариант реализации (начало, смотреть только идею, пишу в браузере):

Код

constructor TBlock.Create(VisualOwner:TControl);
begin
  inherited Create(False);
  FVisualOwner:=VisualOwner;
  // здесь же можно подобавлять нужное количество начальных едитов, вызывая AddEdit;
end;

function TBlock.AddEdit:integer;
var
  tmpEdit:TEdit;
begin
  tmpEdit:=TEdit.Create(FVisualOwner);
  tmpEdit.Parent:=FVisualOwner;
  // тут же устанавливаем позицию и размеры едита, и все нужные для работы с ними события.
  // реализации событий должны быть в этом же классе - TBlock
  Result:=Add(tmpEdit);
end;

// обращаться к едитам - TEdit(myBlock[i]).
// примерно то же - для TBlockList, но поставить OwnObjects:=True, и в качестве объектов будут не TEdit а TBlock.



Цитата(SanLLIer @  14.1.2010,  19:05 Найти цитируемый пост)
 новый вопрос и наверное он снова из "тупых"

Совсем нет, кстати. Весьма хороший вопрос, требующий творческого подхода smile
PM MAIL WWW   Вверх
SanLLIer
Дата 15.1.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Попробовал сделать способом amsoft`a. Выдает ошибку 48: Incompatible types: 'Parameter lists differ' и тыкает на строку OnClick:=clicking;
PM MAIL   Вверх
SanLLIer
Дата 15.1.2010, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Попробовал сделать так:
-создал кнопку
-написал ей процедурку на OnClick
-потер эту кнопку за ненадобностью
А вот оставшуюся процедуру присваиваю динамически создаваемой кнопке (в нете такое решение нашел)

Но при нажатии на кнопку вместо создания второй кнопки выскакивает ошибка: rised exception class EStackOverflow with message "stack overflow".
Код

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var btn: TButton;
begin
with btn.Create(Form1) do
     begin
     parent:=self;
     OnClick:=BitBtn2Click;
     visible:=true;
     Caption:='Close';
     Left:=8;
     Top:=50;
     width:=250;
     end;
end;


end.




PM MAIL   Вверх
artsb
Дата 15.1.2010, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата

Как использовать эти свеже испеченные "эдиты"?

Взял пример из другой темы:
Код

var
TabSheet : TTabSheet;
i, TabIndex: integer;
begin
 TabIndex := 0;
 for i:=0 to 1000 do
 begin
  TabSheet := nil;
  TabSheet := TTabSheet.Create(Self);
  TabSheet.Name := 'TabSheet' + IntToStr(TabIndex); // TabIndex - счётчик табов
  TabSheet.Caption := 'TabSheet' + IntToStr(TabIndex);
  TabSheet.PageControl := PageControl; 
  Inc(TabIndex);
 end;
end;

Теперь к табам можно обращаться из любого места:
Код

 (TTabSheet(frmMyExport.FindComponent('TabSheet'+IntToStr(i)))).Caption := 'bla-bla-bla'; // i - номер созданного таба
 // конечно же, можно юзать указатели

С едитами работать также.

Это сообщение отредактировал(а) artsb - 15.1.2010, 20:47


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
bems
Дата 16.1.2010, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(SanLLIer @  15.1.2010,  20:27 Найти цитируемый пост)
with btn.Create(Form1) do

Ошибка: btn не инициализирована


--------------------
Обижено школьников: 8
PM MAIL   Вверх
SanLLIer
Дата 16.1.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(bems @ 16.1.2010,  00:51)
Ошибка: btn не инициализирована

В смысле? Я в процедуре объявляю...
PM MAIL   Вверх
bems
Дата 16.1.2010, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Прочитай какой-нибудь учебник, где написано, как создавать объекты.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
SanLLIer
Дата 16.1.2010, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня есть учебник, но там ничего дельного не нашел... Может можешь что-нить посоветовать?
PM MAIL   Вверх
artsb
Дата 16.1.2010, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



SanLLIer, для начала, можно мой пост глянуть.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
SanLLIer
Дата 16.1.2010, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А кнопки как сделать? Обработчик OnClick event... smile 
PM MAIL   Вверх
artsb
Дата 16.1.2010, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Код

  NewBtn := nil;
  NewBtn := TButton.Create(Self);
  NewBtn.Name := 'Button' + IntToStr(BtnIndex);
  NewBtn.Caption := 'Button' + IntToStr(BtnIndex);
  NewBtn.OnClick := ButtonClickEvent;



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
SanLLIer
Дата 16.1.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Incompatible types: 'Parameter lists differ'
на   NewBtn.OnClick := ButtonClickEvent
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.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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