Динамическое Создание Компонентов

Katyha1706

New member
18.01.2014
3
0
#1
Здравствуйте!Не могли бы вы помочь.
Мне нужно динамически создать 5 Label'ов, 3 Edit'a и 2 ComboBox'a.
Сделать как бы анкету,которая берет свои вопросы из одного текста(Task) и помещает ответы в другой(Otvet).
Также в ComboBox'e должно быть два варианта ответов.
Не получается создать их,что не так?


Код:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
NewButton: TButton;
NewLabel: TLabel;
NewEdit: TEdit;
NewComboBox: TComboBox;
procedure NewButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

FileName:String;
f:TextFile;
buf:String;
i:Integer;
NewFileName:String;
//ff:TextFile;
k:integer;
implementation

{$R *.dfm}

procedure TForm1.NewButtonClick(Sender: TObject);
var
i,k:integer;
FileName:string;
NewFileName:String;
f:TextFile;
//ff:TextFile;
begin
For i:=0 to ComponentCount-1 do
begin
If Components[i] is TEdit then
begin
FileName:='Otvet.txt';
AssignFile(f,FileName);
Append(f);
Writeln(f,TEdit(Components[i]).text);

CloseFile(f);
end;

begin
For k:=0 to ComponentCount-1 do
begin
If Components[i] is TComboBox then
begin
FileName:='Otvet.txt';
AssignFile(f,NewFileName);
Append(f);
Writeln(f,TComboBox(Components[k]).text);

CloseFile(f);
end;
end;
end;
end;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
FileName:='Task.txt';
AssignFile(f,FileName);
reset(f);
i:=1;

while not eof(f) do
begin
readln(f,buf);
NewLabel:=Tlabel.create(self);
NewLabel.Parent:=self;
NewLabel.left:=100;
NewLabel.top:=50*i;
NewLabel.caption:=buf;
NewEdit:=Tedit.create(self);
NewEdit.Parent:=self;
NewEdit.Left:=300;
NewEdit.top:=50*i;
inc(i)

end;
CloseFile(f);

begin
NewFileName:='Task2.txt';
AssignFile(f,NewFileName);
reset(f);
k:=1;

while not eof(f) do
begin
readln(f,buf);
NewLabel:=Tlabel.create(self);
NewLabel.Parent:=self;
NewLabel.left:=100;
NewLabel.top:=50*i;
NewLabel.caption:=buf;
NewComboBox:=TComboBox.create(self);
NewComboBox.Parent:=self;
NewComboBox.Left:=300;
NewComboBox.top:=50*i;
inc(k)
end;
CloseFile(f);
end;
end;
end.
 

sinkopa

Well-known member
17.06.2009
344
4
#2
Здравствуйте!Не могли бы вы помочь.
Мне нужно динамически создать 5 Label'ов, 3 Edit'a и 2 ComboBox'a.
Сделать как бы анкету,которая берет свои вопросы из одного текста(Task) и помещает ответы в другой(Otvet).
Также в ComboBox'e должно быть два варианта ответов.
Не получается создать их,что не так?
Имя контрола который Вы создаёте динамически должно быть уникальным и форму целиком (либо новые контролы по отдельности) возможно следует перерисовать чтобы они "проявились".
Код:
 //...
NewLabel:=Tlabel.create(self);
NewLabel.Name := 'label_'+ IntToStr(i);
NewLabel.Parent:=self;
//...
NewLabel.Invalidate; // новый лабел перерисуется по окончании процедуры

NewEdit:=Tedit.create(self);
NewEdit.Name := 'edit_'+ IntToStr(i);
//...
NewComboBox := TComboBox.create(self);
NewComboBox.Name := 'сombo_'+ IntToStr(i);
//...

// или перерисовать форму целиком (если надо)
Invalidate;
Остальное вроде всё правильно у Вас в коде.
И желательно чтобы NewLabel, NewEdit и NewComboBox были объявлены как локальные переменные (у Вас они сейчас поля класса).
Это в общем не критично, но обычно так делают :)