Старая ситуация: во время разработки два вложенных TClientDataSets
, VertaalData
и VertaalRegelsData
, с определениями полей и т. д., заполненными с помощью LoadFromFile
.
Новая ситуация: создайте структуру для этих наборов времени разработки (теперь свойства не заполняются) во время выполнения, а затем используйте LoadFromFile
с тем же файлом. Код:
with VertaalData do // Nested dataset https://stackoverflow.com/a/76337090/512728
begin
if Active then Close;
FieldDefs.Clear;
FieldDefs.Add(sVersion,ftString,11,false); // s... are fieldname constants
with FieldDefs.AddFieldDef do
begin
Name := sTranslate;
DataType := ftDataSet;
ChildDefs.Add(sID,ftInteger);
ChildDefs.Add(sTranslate,ftBoolean);
ChildDefs.Add(STT_NL,ftString,250,false); // STT also field name constants
ChildDefs.Add(STT_EN,ftString,250,false);
ChildDefs.Add(STT_DE,ftString,250,false);
ChildDefs.Add(STT_XX,ftString,250,false);
end;
CreateDataSet;
LoadFromFile(LLanguageFileName);
end;
Чем отличается ситуация во время проектирования:
VertaalRegelsData.DataSetField
не заполняется после CreateDataSet
,VertaalRegelsData.State
— это dsInactive
после LoadFromFile
.я добавил
VertaalRegelsData.DataSetField := TDataSetField(VertaalData.FieldByName(sTranslate));
за CreateDataSet
(«поле неизвестно», если я попробую раньше), но это не поможет состоянию:
После LoadFromFile
верхний набор данных располагается в первой (и единственной) записи и находится в состоянии dsBrowse
, но вложенный VertaalRegelsData
по-прежнему находится в состоянии dsInactive
.
Я попробовал (после LoadFromFile
):
VertaalRegelsData.Open
-> «Отсутствует поставщик данных или пакет данных»VertaalRegelsData.First
-> «Невозможно выполнить эту операцию с закрытым набором данных»VertaalData
-> Не повезлоVertaalData.First
-> Не повезлоЕсть предложения?
Это 64-битное приложение Delphi 12 VCL. Образец файла здесь (срок действия 30 дней)
Добавлено 15 авг:
FWIW Файл был создан в другой программе с помощью:
NewLanguageData.Post; // In dsEdit state after conversion
NewLanguageLineData.DisableControls;
NewLanguageData.MergeChangeLog;
NewLanguageData.SaveToFile(ChangeFileExt(SaveDialogLanguage.FileName, '.lng'));
У меня есть еще одна служебная программа для просмотра этих TClientDataSet
сохраненных файлов, которая также блокируется из-за того, что вложенный набор данных не открывается после LoadFromFile
.
Поскольку вам не нужно заполнять наборы данных по коду и всегда вызывать LoadFromFile
, вы можете опустить весь код для создания определений полей, а также вызов CreateDataSet
. LoadFromFile
создаст соответствующие поля из содержимого файла.
Чтобы заполнить оба набора данных, вы создаете обработчик событий AfterOpen
для основного набора данных, который устанавливает DataSetField
для подробного набора данных. Тогда просто позвони LoadFromFile
.
Я добился желаемого результата, поместив два TClientDataSet
в форму и добавив следующие строки кода:
procedure TForm860.Button1Click(Sender: TObject);
begin
VertaalData.LoadFromFile('c:\Users\Uwe\Downloads\TTTranslate.lng');
end;
procedure TForm860.VertaalDataAfterOpen(DataSet: TDataSet);
begin
VertaalRegelsData.DataSetField := VertaalData.FieldByName('TT_TRANSLATE') as TDataSetField;
end;
Боже мой, как это может быть просто? Как ты научился этому трюку?
@UweRaabe easyupload.io/jgfm7j