powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MemTableEh - динамическое создание полей
19 сообщений из 19, страница 1 из 1
MemTableEh - динамическое создание полей
    #39930915
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взял пример из Demos\MemTableEh.LifeRestructure.
По кнопке AddField там в сетку добавляется поле.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TForm1.Button1Click(Sender: TObject);
var
  NewStruct: TMTDataStructEh;
  bf: TMTStringDataFieldEh;
begin
  NewStruct := MemTableEh1.RecordsView.MemTableData.DataStruct.BeginRestructure;

  bf := TMTStringDataFieldEh(NewStruct.CreateField(TMTStringDataFieldEh));
  bf.FieldName := GetFieldUnicName('StringField');

  MemTableEh1.RecordsView.MemTableData.DataStruct.EndRestructure(NewStruct, True);
end;



Преобразовал это в свой код таким образом:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
  procedure AppendField(AFieldName: string);
  var
    NewStruct: TMTDataStructEh;
    bf: TMTStringDataFieldEh;
  begin
    NewStruct := MemTableSchedule.RecordsView.MemTableData.DataStruct.BeginRestructure;

    bf := TMTStringDataFieldEh(NewStruct.CreateField(TMTStringDataFieldEh));
    bf.FieldName := AFieldName;    // GetFieldUnicName('StringField');

    MemTableSchedule.RecordsView.MemTableData.DataStruct.EndRestructure(NewStruct, True);
  end;

...
      MemTableSchedule.Open;
      MemTableSchedule.EmptyTable;

      // Заполняем строки
      ....
      if q.Open > 0 then
        begin
          AppendField('m1'); // добавление поля
          AppendField('mh1'); // добавление поля
          while not q.Q.Eof do
            begin
              MemTableSchedule.Append;
              MemTableSchedule.FieldByName('id').AsInteger := q.Q.FieldByName('id').AsInteger;
              MemTableSchedule.FieldByName('sequence_number').AsInteger := q.Q.FieldByName('sequence_number').AsInteger;
              MemTableSchedule.FieldByName('group_path').AsString := q.Q.FieldByName('group_path').AsString;
              MemTableSchedule.FieldByName('technic_process_name').AsString := q.Q.FieldByName('technic_process_name').AsString;

              MemTableSchedule.FieldByName('m1').AsString := '5'; // на этих строках выдает ошибку
              MemTableSchedule.FieldByName('mh1').AsString := '10';

              MemTableSchedule.Post;


На строке MemTableSchedule.FieldByName('m1').AsString := '5'; выдает ошибку, что поле m1 не существует.
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39930944
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,
Почему AppendField, а не FieldDefs.Add()?
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39930954
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck99
svnvlad,
Почему AppendField, а не FieldDefs.Add()?

какая разница, как назвать?
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39930957
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck99,

разные варианты перепробовал:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  procedure AddNewField(AFieldName: string);
  var
    fd: TFieldDef;
  begin
    fd := MemTableSchedule.FieldDefs.AddFieldDef;
    fd.DataType := ftInteger;
    fd.Name := AFieldName;
  end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  procedure AddNewField(AFieldName: string);
  var
    fd: TFieldDef;
    f: TField;
  begin
    MemTableSchedule.FieldDefs.Add(AFieldName, ftInteger);
    f := fd.CreateField(MemTableSchedule);
  end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  procedure AddNewField(AFieldName: string);
  var
    DataField: TMTDataFieldEh;
  begin
    DataField := MemTableSchedule.RecordsView.MemTableData.DataStruct.CreateField(TMTNumericDataFieldEh);
    DataField.FieldName := AFieldName;
    TMTNumericDataFieldEh(DataField).NumericDataType := fdtIntegerEh;
  end;



Ни один не работает.
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39930972
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько помню, сначала FieldDefs заполняются. Затем Fields и дергается CreateDataSet.
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39930987
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Насколько помню, сначала FieldDefs заполняются. Затем Fields и дергается CreateDataSet.

Очистил все определения полей, которые назначал в дезайн тайме.
Написал такой код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
procedure TfmRepairObject.DrawTableSchedule;
var

  procedure AddNewField(AFieldName: string; AFieldType: TFieldType);
  var
    fd: TFieldDef;
    f: TField;
  begin
    fd := MemTableSchedule.FieldDefs.AddFieldDef;
    fd.DataType := AFieldType;
    fd.Name := AFieldName;

    f := fd.CreateField(MemTableSchedule);
  end;

begin
    q := TBISMySQLQuery.Create;
    q2 := TBISMySQLQuery.Create;
    try
      MemTableSchedule.DestroyTable;
      AddNewField('id', ftInteger);
      AddNewField('sequence_number', ftInteger);
      AddNewField('group_path', ftString);
      AddNewField('technic_process_name', ftString);
      AddNewField('abbreviation', ftString);
      AddNewField('sector_name', ftString);
      AddNewField('unit_name', ftString);
      AddNewField('quantity', ftInteger);
      AddNewField('note', ftString);
      AddNewField('m1', ftInteger);
      AddNewField('mh1', ftInteger);
      MemTableSchedule.CreateDataSet;

      MemTableSchedule.Open;
      MemTableSchedule.EmptyTable;

      // Заполняем строки
      ....
      if q.Open > 0 then
        begin
          while not q.Q.Eof do
            begin
              MemTableSchedule.Append;
              MemTableSchedule.FieldByName('id').AsInteger := q.Q.FieldByName('id').AsInteger;
              MemTableSchedule.FieldByName('sequence_number').AsInteger := q.Q.FieldByName('sequence_number').AsInteger;
              MemTableSchedule.FieldByName('group_path').AsString := q.Q.FieldByName('group_path').AsString;
              MemTableSchedule.FieldByName('technic_process_name').AsString := q.Q.FieldByName('technic_process_name').AsString;
              MemTableSchedule.FieldByName('abbreviation').AsString := q.Q.FieldByName('abbreviation').AsString;
              MemTableSchedule.FieldByName('sector_name').AsString := q.Q.FieldByName('sector_name').AsString;
              MemTableSchedule.FieldByName('unit_name').AsString := q.Q.FieldByName('unit_name').AsString;
              MemTableSchedule.FieldByName('quantity').AsInteger := q.Q.FieldByName('quantity').AsInteger;
              MemTableSchedule.FieldByName('note').AsString := q.Q.FieldByName('note').AsString;

              MemTableSchedule.FieldByName('m1').AsInteger := 5;
              MemTableSchedule.FieldByName('mh1').AsInteger := 10;

              MemTableSchedule.Post;

              q.Q.Next;
            end;
        end;


Ошибок не выдает, но теперь сетка пустая. До того, как в рантайме создавал поля, хотя бы данные отображались (кроме m1 и mh1). Теперь не отображается ничего.
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39930989
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел так же на просторах интернета, что после всего нужно вызвать DBGridEh1.Columns.AddAllColumns(true);
Но, во-первых, у меня не DBGridEh, а tcxGrid, а во-вторых, причем тут сетка вообще, если речь идет о датасетах.
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931001
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, с DBGridEh трюк действительно работает. Но надо, чтобы отображалось в tcxGrid (TcxGridDBBandedTableView).
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931002
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
svnvlad
Нашел так же на просторах интернета, что после всего нужно вызвать DBGridEh1.Columns.AddAllColumns(true);
Но, во-первых, у меня не DBGridEh, а tcxGrid, а во-вторых, причем тут сетка вообще, если речь идет о датасетах.


в TcxGrid нужно создавать колонки явно, сам он их не созздаёт
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931004
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, разобрался, не был подключен DataSource к сетке.
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931005
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator
svnvlad
Нашел так же на просторах интернета, что после всего нужно вызвать DBGridEh1.Columns.AddAllColumns(true);
Но, во-первых, у меня не DBGridEh, а tcxGrid, а во-вторых, причем тут сетка вообще, если речь идет о датасетах.


в TcxGrid нужно создавать колонки явно, сам он их не созздаёт

Кстати, на очереди создание колонок в tcxGrid в рантайме.
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931009
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
Код: pascal
1.
    f := fd.CreateField(MemTableSchedule);


А где название у колонки?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
      with qSpecsParamValues.FieldDefs.AddFieldDef do begin
        Name := 'qSpecsParamValuesid';
        DataType := ftInteger;
        with CreateField(qSpecsParamValues) do begin
          FieldName := 'id';
          DisplayLabel := 'id';
        end;
      end;
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931010
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
svnvlad
Код: pascal
1.
    f := fd.CreateField(MemTableSchedule);


А где название у колонки?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
      with qSpecsParamValues.FieldDefs.AddFieldDef do begin
        Name := 'qSpecsParamValuesid';
        DataType := ftInteger;
        with CreateField(qSpecsParamValues) do begin
          FieldName := 'id';
          DisplayLabel := 'id';
        end;
      end;



Ну вот здесь вроде как
Код: pascal
1.
2.
3.
    fd := MemTableSchedule.FieldDefs.AddFieldDef;
    fd.DataType := AFieldType;
    fd.Name := AFieldName;
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931014
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. кроме FieldDefs, еще надо и у Field название колонки отдельно делать?
А почему работает без этого?
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931015
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
Ну вот здесь вроде как

Это не то название, хотя и таблица не запрос, а виртуальная. Сойдет.
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931017
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
А почему работает без этого?

Я на живом запросе привел пример. Немного иная ситуация.
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931031
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

а вот еще вопрос - при повторном вызове процедуры ругается на дубликаты полей. MemTableSchedule.DestroyTable; видимо не помогает. Что надо вызывать?
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931032
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
wadman,а вот еще вопрос - при повторном вызове процедуры ругается на дубликаты полей. MemTableSchedule.DestroyTable; видимо не помогает. Что надо вызывать?
Ну так ты в список добавляешь поля, которые там уже есть. Очищай список, вызывай FieldDefs.Clear или что там вместо него у тебя.
...
Рейтинг: 0 / 0
MemTableEh - динамическое создание полей
    #39931045
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck99,

Убрал создание TField, тоже работает.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  procedure AddNewField(AFieldName: string; AFieldType: TFieldType; AFieldSize: integer = 0);
  var
    fd: TFieldDef;
    f: TField;
  begin
    fd := MemTableSchedule.FieldDefs.AddFieldDef;
    fd.DataType := AFieldType;
    fd.Name := AFieldName;
    if AFieldSize <> 0 then
      fd.Size := AFieldSize;

//    f := fd.CreateField(MemTableSchedule);
//    f.FieldName := AFieldName;
//    if AFieldSize <> 0 then
//      f.Size := AFieldSize;
  end;


Потом просто вызываю MemTableSchedule.FieldDefs.Clear.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MemTableEh - динамическое создание полей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]