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


Автор: User 4.2.2005, 09:57
У меня есть Form1. На ней лежит кнопка Button1. Как можно сделать что бы при запущенной программе, при нажатии на кнопку Button1, создавался обьект Edit1, Edit2 и т.д. - c определенными координатами по X, Y (но так что бы они скажем выстраивались в строку или в столбец); или Label1, Label2 и т.д.

Не где не встречал на такой вопрос ответа. Если можно то приведите попадробнее код. Это важно для меня, что бы разобраться. - Для вас я надеюсь, кто с этим работал не составит труда..
Заранее спасибо! smile

Автор: User 4.2.2005, 10:24
Пример если можно приведите

Автор: Snowy 4.2.2005, 12:02
По вопросу:
Код

var
 y: integer=100;

procedure TForm1.Button1Click(Sender: TObject);
begin
 with TEdit.Create(Form1) do begin
   Top:=y; Left:=Button1.Left;
   ParentWindow:=Self.Handle;
   y:=y+Height+4;
 end;
end;

Автор: Alex 4.2.2005, 12:47
Модератор: все сообщения не относящиеся к вопросу удалены.

Автор: User 4.2.2005, 12:49
И для Label как ?



Автор: ~FoX~ 4.2.2005, 12:52
User
DRKB, FAQ, поиск, help, etc.
Динамическое создание объектов. Создание объектов run-time или что то в этом роде.
Ну хватит уже лениться то.

Код

........
with TLabel.Create(Form1) do begin
........

Автор: NiJazz 4.2.2005, 13:45
Код

procedure TForm1.Button1Click(Sender: TObject);
var EditList: array[1..5] of TLabeledEdit;
   caps: array[1..5] of string;
   i: integer;
   t: integer;
begin
caps[1] := 'First';
caps[2] := 'Second';
caps[3] := 'Third';
caps[4] := 'Fourth';
caps[5] := 'Fifth';
t := 30;
for i:=1 to 5 do begin
  EditList[i] := TLabeledEdit.Create(Self);
  with EditList[i] do begin
    Top := t;
    Left := 10;
    EditLabel.Caption := caps[i];
    Parent := Self;
    t := Top + Height+30;
  end;
end;
end;

Не забудь в uses добавить ExtCtrls.

Автор: FRAGNATIC 4.2.2005, 14:11
а почему бы просто не поставить сразу пару эдитов и их visible:=false а по нажатию кнопки visible:=true;

Автор: User 4.2.2005, 14:38
А ссылки можно поподробнее где такое искать?

Автор: Alex 4.2.2005, 14:48
http://forum.vingrad.ru/index.php?act=module&module=vingradfaq§ion=627

Автор: NiJazz 4.2.2005, 15:15
User
А где спасибо? Помогло хоть?

Автор: User 4.2.2005, 15:46
А сохранить созданные динамически компонент можно? и как?
Отвечаю на вопрос: Я хочу програмно создавать в таблице новый столбец, и автоматически, в окне добавления/редактирования полей, хочу добавлять компонент. А количество столбцов, сами понимаите может быть разное.
Добавлено @ 15:47
Спасибо....

Автор: Snowy 4.2.2005, 16:04
Что значит сохранить? Они никуда не убегают.
Если ты имеешь ввиду, что хочешь обращаться к ним по имени, то тут нескольно способов:
  • Массив элементов типа TEdit
  • Использовать TList
  • При создании задавать едиту имя с номером, а потом обращаться к нему через FindComponent
  • Нарисовать компонентов про запас и программно регулировать свойство visible.
Рекомендую второй вариант. Хотя первый проще. А 4-й для балбесов smile

Автор: ~FoX~ 4.2.2005, 16:50
Цитата(User @ 4.2.2005, 15:46)
А сохранить созданные динамически компонент можно? и как?


Цитата(Snowy @ 4.2.2005, 16:04)
Что значит сохранить? Они никуда не убегают.


После закрытия и открытия формы динамические компаненты исчезают, может он про это спрашивает?

Автор: Snowy 4.2.2005, 16:50
Вот простой код с использованием Tlist.
Если делать по честному, то нужно создавать объект типа TEditList=class(TList). Но это дольше и сложнее писать. Зато легко и удобно пользоваться.
Код

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 TEds:  TList;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 TEds:=TList.Create;
 with TButton.Create(Form1) do begin
   ParentWindow:=Form1.Handle;
   Left:=0; Top:=0;
   OnClick:=Button1Click;
   Caption:='Add';
 end;
 with TButton.Create(Form1) do begin
   ParentWindow:=Form1.Handle;
   Left:=72; Top:=0;
   OnClick:=Button2Click;
   Caption:='Delete';
 end;
 with TButton.Create(Form1) do begin
   ParentWindow:=Form1.Handle;
   Left:=144; Top:=0;
   OnClick:=Button3Click;
   Caption:='Clear';
 end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 TEds.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 e: TEdit;
begin
 i:=TEds.Add(TEdit.Create(Form1));
 with TEdit(TEds[i]) do begin
   ParentWindow:=Form1.Handle;
   left:=8; Top:=i*20+30;
   Name:='Edit'+IntToStr(i+1);
   Text:=IntToStr(i+1)+'-й Edit';
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 i: integer;
begin
 i:=TEds.Count;
 if i>0 then begin
   TEdit(TEds[i-1]).Free;
   TEds.Delete(i-1);
 end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 i: integer;
begin
 for i:=0 to TEds.Count-1 do
   TEdit(TEds[i]).Free;
 TEds.Clear;
end;

Добавлено @ 16:52
Да, забыл добавить - не кидай ничего на форму - все само создастся.

~FoX~
А зачем закрывть форму? Достаточно TForm.Hide

Автор: gambit 21.3.2007, 22:24
Создали мы компонент, а как потом обратится к его свойствам, например узнать текст который ввел пользователь в созданный компанент?

Автор: VICTAR 21.3.2007, 23:47
Задай ему имя и обращайся по имени, как обычно.
Задай уникальный Tag, затем ищи по Tag`у и проверяй текст.
И еще много-много вариантов... 

Автор: gambit 23.3.2007, 13:36
VICTAR, проблема в том что я пытаюсь так сделать. 
Код

procedure TForm1.Button1Click(Sender: TObject);
var y: integer=100;
begin
 with TEdit.Create(Form1) do begin
   Top:=y; Left:=Button1.Left;
   ParentWindow:=Self.Handle;
   y:=y+Height+4;
   name:='edit1';
 end;


Но так как объект не создан, я не могу написать что то типо
Код

procedure TForm1.Button2lick(Sender: TObject);
begin
label1.caption:=edit1.text;
end;

Он говорит  что индификатор edit1 неизвестен.

Автор: VICTAR 23.3.2007, 14:16
Код

procedure TForm1.Button2Click(Sender: TObject);
begin
label1.caption:=TEdit(FindComponent('Edit1')).Text;
end;

Автор: gambit 23.3.2007, 14:49
Пытаюсь создать label
Код

 with TLabel.Create(Form1) do begin
   Top:=y;
   Left:=x;
   Name:='Label'+IntToStr(namelabel);
   caption:='Label '+IntToStr(namelabel);
   ParentWindow:=self.Handle;
 end;
inc(namelabel);

Но в строчке    ParentWindow:=self.Handle; ошибка

Код

system error. code: 1400
Недопустимый дискриптор окна

Что это?

Добавлено @ 14:51 
VICTAR, спасибо.

Добавлено @ 14:53 
А как обрабатывать процедуры созданных компанентов?

Автор: aktuba 23.3.2007, 14:56
Цитата

А как обрабатывать процедуры созданных компанентов? 


СРОЧНО!!! В магазин за книгой по Delphi!!!

Код

 Edit1.OnChange := EditChange;

procedure TForm1.EditChange(Sender: TObject);
begin
  ShowMessage('Вот и событие...');
end;

Автор: VICTAR 23.3.2007, 15:08
замени
Код

ParentWindow:=self.Handle;

на
Код

Parent:=Form1;

Автор: gambit 23.3.2007, 16:26
Цитата

СРОЧНО!!! В магазин за книгой по Delphi!!!

У меня книг миллион, но не в одной не про динамические компаненты.
Всем спасибо.

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