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

Тема в разделе "Delphi - Компоненты", создана пользователем Katyha1706, 18 янв 2014.

  1. Katyha1706

    Katyha1706 New Member

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


    Код (Text):
    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.
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Имя контрола который Вы создаёте динамически должно быть уникальным и форму целиком (либо новые контролы по отдельности) возможно следует перерисовать чтобы они "проявились".
    Код (Delphi):
     //...
    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 были объявлены как локальные переменные (у Вас они сейчас поля класса).
    Это в общем не критично, но обычно так делают :)
     
Загрузка...

Поделиться этой страницей