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


Автор: Klio 17.2.2011, 16:05
Здравствуйте господа программисты!!!
есть такая проблема: есть модуль в котором описана форма, в CreateForm(...) записаны все компоненты которые добавляются на форму, а также их параметры...
Код

TLstForm = class(TForm)
    ALab:TLabel;
    ...
    procedure FormCreate(Sender: TObject);   // + другие обработчики
end;

procedure TListForm.CreateForm(...);
begin
ALab:TLabel.create(LstForm);
ALab.pernt:=LstForm; Alab.caption:='kjfsdhijf';  // и т.д. и т.п.
end;

в главной форме вызываю создание
Код

procedure TMForm.ButClick(...)
var LstFrm:TLstForm;                               //  в uses модуль добавлял
begin
LstFrm := TLstForm.CreateNew(Application);
LstFrm.Show; // и другие обработчики данных этой формы
LstFrm.free;

но при выполнении CreateNew, или Show вызова CreateForm не роисходит и отображается лишь пустая авто форма, (пытался и подругому Application.FormCreate(TLstForm,LstForm), и добавлял конструктор к форме,и просто LstFrm:=TLstForm.Create(Appl...) но ничего не срабатывает)
КАК можно сделать чтобы это работало, и таких окон могло запускаться несколько?...
Заранее спасибо!!!

Автор: SPrograMMer 17.2.2011, 18:32
Пример из рабочего исходника:
Код

procedure TFormSimpleList.FormShow(Sender: TObject);
  var
    I:integer;
    S:String;
    Ins:String;
    InsVal:String;
    Updt:String;
    Col:TColumnEh;
    LX:TLabel;
    DBX:TDBEdit;
begin
  Height := MinHeight ;
  /// подготовим список полей
  Ins:='';InsVal:='';Updt:='';
  if ListFields.Count>0 then begin
    for I:=0 to Pred(ListFields.Count) do Begin
      S:=Trim(ListFields.Names[I]);
      Ins:=Ins + ', '+S;
      InsVal := InsVal + ', :'+S;
      Updt := Updt + ', '+S+' = :'+S
    End;
    S := ExtForSQLs;
    if S<>'' then Begin
      Ins:=Ins + ', '+S;
      InsVal := InsVal + ', :'+S;
      Updt := Updt + ', '+S+' = :'+S
    End;
    Delete(Ins,1,2);
    Delete(InsVal,1,2);
    Delete(Updt,1,2)
  end;
  /// сгенерируем запросы
  GenerateSelect(Ins,InsVal);
  IBDataSet1.InsertSQL.Text := 'insert into '+SourceName+
    ' ('+Ins+') values ('+InsVal+')';
  IBDataSet1.DeleteSQL.Text := 'delete from '+SourceName+
    ' where ID = :OLD_ID';
  IBDataSet1.RefreshSQL.Text :='select * from '+SourceName+
    ' where ID = :ID';
  IBDataSet1.ModifySQL.Text := 'update '+SourceName+' set '+Updt+
    ' where ID = :OLD_ID';
  IBQuery1.SQL.Text := 'Select Max(ID) As MAX_ID From '+SourceName;
  /// настроем визуальный элемент
  if ListFields.Count>0 then Begin
    SetLength(LabelX,ListFields.Count);
    SetLength(DBEditX,ListFields.Count);
    for I:=0 to Pred(ListFields.Count) do Begin
      S:=ListFields.Names[I];
      Col := DBGridEh1.Columns.Add;
      Col.Title.Caption := Trim(ListFields.Values[S]);
      Col.Title.Alignment := taCenter;
      Col.Title.TitleButton := True;
      Col.FieldName := Trim(S);
      Col.Width := StrToInt(FieldsWidth.Values[S]);
      if Col.FieldName = FBoolField then
        begin // Логическое поле
          Col.Checkboxes := True;
          With Col.KeyList Do Begin
            Clear;
            Add('Y');
            Add('N')
          End;
          DBCheck := TCheckBox.Create(GroupBox1);
          DBCheck.Parent := GroupBox1;
          DBCheck.Caption := Col.Title.Caption;
          DBCheck.Left := 10;
          DBCheck.Top := 20 + 30*I;
          DBCheck.Width := GroupBox1.Width - 40;
          DBCheck.OnClick := OnChangeDBCheckBox;
        End
      Else begin
        /// ==========================================
        LX := TLabel.Create(GroupBox1);
        LX.Parent := GroupBox1;
        LX.Caption := Col.Title.Caption;
        LX.Left := 10;
        LX.Top := 20 + 30*I;
        LabelX[I] := LX;
        /// ==========================================
        DBX := TDBEdit.Create(GroupBox1);
        DBX.Parent := GroupBox1;
        DBX.DataSource := DataSource1;
        DBX.DataField := Trim(S);
        DBX.Left := 200;
        DBX.Width := 320;
        DBX.Top := 15 + 30*I;
        DBEditX[I] := DBX
      End
    end;
    BitBtn4.Top := 50 + 30*Pred(ListFields.Count);
    BitBtn5.Top := 50 + 30*Pred(ListFields.Count);
    GroupBox1.Height := 85 + 30*Pred(ListFields.Count);
    MaxHeight := 250 + 30*Pred(ListFields.Count)
  end;
  /// собственно откроем набор данных
  IBDataSet1.Active := True;
  EditMode(True);
  Caption := NameOfRef
end;

Автор: Klio 17.2.2011, 19:13
перемещение объявлений в FormShow не проходит
CreateForm и Show просто не вызываются

может необходимо их задавать

(если можно напиши свой вызов этого окна и конструктор класса формы)

Автор: kami 17.2.2011, 19:26
Цитата(Klio @  17.2.2011,  16:05 Найти цитируемый пост)
ALab.pernt:=LstForm; Alab.caption:='kjfsdhijf';  // и т.д. и т.п.

Код

Alabel.Parent:=Self;

Автор: Klio 17.2.2011, 19:47
kami спасибо за совет, получилось добиться исполнения этих процедур
Код

constructor TLstForm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
self.OnCreate:=FormCreate;
self.OnShow:=FormShow;
end;

но только вот ни один из создаваемых контролов не отображается
Код

Ldate:=TLabel.Create(self);          //  область private   Ldate:TLabel;
  Ldate.Visible:=true;
  Ldate.AutoSize:=true;
  Ldate.Caption:='Дней';
  Ldate.Left:=16;
  Ldate.Top:=0;

Автор: Klio 17.2.2011, 20:53
Код

constructor TLstForm.Create(AOwner: TComponent);
begin
self.OnCreate:=FormCreate;
inherited Create(AOwner);
self.OnShow:=FormShow;
end;

поменял местами и всё стало отображаться...
всем спасибо за помощь

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