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


Автор: Sharl 21.1.2005, 12:31
Программное создание объектов класса TField в TTable или TQuery
Как это делается???

Автор: Дрюча 21.1.2005, 12:52
Создать TField... может так...
Код

var
Fld: TField;
begin
Fld:=TField.Create(Query1);
<...>
end;

Может конкретнее задачу поставите... smile

Автор: Akella 21.1.2005, 13:41
Код

procedure...
var
tTable1:TTable;
qQuery1.TQuery;
begin
try
  tTable1:=TTable.Create(Form1);//или TForm1
//можно написать так
  tTable1:=TTable.Create(self);
//также и TQuery
//а сполем TField может быть так, а может и нет. Delphi нет под рукой
//у таблицы или запроса есть множество TFieldDefs типа TStrings, которое содержит список полей
  tTable1.FieldDefs.update;
finally//уничтожаем объекты даже если не было исключительной ситуации
FreeAndNil(tTable1);
FreeAndNil(qQuery1);
end;

end;

Автор: Bes 21.1.2005, 13:49
Было бы интересно узнать, для чего это может понадобиться?
Не разу не задавался таким вопросом....

Автор: Sharl 21.1.2005, 14:29
Конечная цель токова.

Отображать в DBGrid -е только те поля таблицы, которые заданы извне.
Т.е. поля должны быть выявлены только по ходу работы приложения.

Для этого, думаю, в таблице ( TTable ) эти поля добавлять динамичевки.

var
f:TIntegerField;
begin
ff := TIntegerField.Create(Table1);
ff.FieldKind := fkData;
ff.DisplayLabel := 'NewField';
ff.FieldName := 'aa';
Table1.Fields.Add(ff);

.................

Ну и что потом???

Как создать ссылку на это поле ( если конечно таким образом это поле в Table1 создано) в DBGrid -е???

Автор: Дрюча 21.1.2005, 14:45
А не проще бы завести какой-нибудь другой идентификатор? Например:

Код

var
S: string;
begin
s:='';
If CheckBox1.Checked
 then
  s:=s + 'Field1, ';
if CheckBox2.Checked
 then
  s:=s + 'Field2, ';
<...>
if s <> ''
 then
  begin
   Delete(s, Length(s)-2, 2);
   with query1 do
    begin
     Close;
     SQL.Text:='SELECT ' + s + ' FROM TableName;';
     Open;
    end;

smile

Автор: Bes 21.1.2005, 15:45
2Sharl:
Слушай, дак не проще ли выбирать только нужные поля select-ом если работаешь через Query (что на мой взгляд предпочтительнее) или добавить в dbGrid все поля сразу и потом делать их видимыми-невидимыми....
Или я чего-то не пойму...

Автор: Sharl 21.1.2005, 16:50
Bes и Дрюча
Да, конечно, то что вы описываете, и проще и удобнее,
но нужно, чтобы некоторые поля в grid-е показывались как lookup combobox.
вот в этом и вся проблема,
т.е. нужно динамически менять свойства поля query типа LookupKeyFields и т.п., что и не удается.


Автор: Дрюча 21.1.2005, 16:59
А что именно не удается? Создать или еще что-нить... привиди неработающий свой пример... smile

Автор: Sharl 21.1.2005, 17:24
Нашел способ для удовлетворения моих нужд.
Это компонент TDBCtrlGrid.
На нем можно динамически создавать ту функциональность, что требовалась от меня.

Но все-таки , попробуем получить такое.

В DB1 базе есть таблица "TA"с полями "F1,F2,F3".

В форме есть компонент
Table1 : TTable.

Table1.DataBaseName := 'DB1';
Table.TableName := 'TA' ;
Table1.Fields.Remove(Table1.FieldByName('F1'));

Как потом снова запихнуть поле 'F1' обратно в Table1 ?






Автор: Дрюча 21.1.2005, 17:26
Обновить таблицу и спихнуть ненужное... smile Вот в этом случае лучше все-таки юзать query

Автор: Akella 21.1.2005, 17:35
Table1.Fields.add

попробуй такое или

Table1.Fields.insert

Автор: Sharl 23.1.2005, 14:29
Так вот, это все делается вот так.

Код

procedure TForm1.InsertNewField( Field : TField; FieldName, KeyFields, LookupKeyFields, LookupResultField  : string; FieldKind:TFieldKind; MainTable : TTable; LookupTable : TTable );
begin
 Field.FieldName := FieldName;
 Field.LookupDataSet := LookupTable;
 Field.LookupKeyFields := LookupKeyFields;
 Field.LookupResultField := LookupResultField;
 Field.KeyFields := KeyFields;
 Field.FieldKind := FieldKind;
 MainTable.Close;
 Field.DataSet := MainTable;
//  MainTable.FieldByName(FieldName).Index := 0; //если нужно его вставить на первую позицию
 MainTable.Open;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 fld : TField;
begin

 fld := TStringField.Create(Self);
 InsertNewField( fld, 'Lookup field','KeyFields', 'LookupKeyFields', 'LookupResultField', fkLookup,   Table1,Table2 );

end;



разумеется 'Lookup field','KeyFields', 'LookupKeyFields', 'LookupResultField' это имена полей таблиц.

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