-
Всем добрый день!. Столкнулся с такой проблемой: На форме лежит ТClientDataSet. В ней формирую таблицу (ручками), сохраняю в файл MyBase xml. В дальнейшем при запуске программы база замечательно обрабатывается (всякие добавления/изменения). Но переношу программу (exe-шник) на другой комп, где не установлен Delphi - и получаю ошибку:
MailsTable: Field 'State' not found
MailsTable - это моя таблица (сам ТClientDataSet) State - это одно из полей. При этом в файле xml это поле точно есть. И загружается xml в MailsTable! Честно говоря, с таблицами до этого вообще не сталкивался. Подскажите, что делать!
-
При этом в файле xml это поле точно есть.
Может и есть. Но только не в том файле. В том, который грузится его нету.
-
Function TMainForm.LoadBD; begin Try Memo1.Lines.Add(ExtractFilePath(Application.ExeName)+'MailsTable.xml'); MailsTable.LoadFromFile(ExtractFilePath(Application.ExeName)+'MailsTable.xml'); Result:=True; Except Result:=False; end;
Файл MailsTable.xml также копирую в папку с программой. Функция проходит и возвращает ИСТИНА Ниже код вызова функции:
Memo1.Lines.Add('Загружаем базу...'); if LoadBD then begin Memo1.Lines.Add('База загружена.'); end else begin Memo1.Lines.Add('База не загружена!!! Выходим.'); Goto ExitProg; end;
В Memo1 появляется 'База загружена.'. Как я понял, проблемы начинаются, когда в программе происходит обращение к полям таблицы...
-
Ну загружена. Но поля там нет.
-
Эээ... а как это? В файле поле есть (ниже текст файла xml с "чистого" компьютера, его загружаем) <?xml version="1.0" standalone="true"?> -<DATAPACKET Version="2.0"> -<METADATA> -<FIELDS> <FIELD fieldtype="i4" attrname="ID"/> <FIELD fieldtype="string" attrname="MailAddress" WIDTH="100"/> <FIELD fieldtype="string" attrname="URL" WIDTH="200"/> <FIELD fieldtype="dateTime" attrname="StartTime"/> <FIELD fieldtype="i4" attrname="SeeTimeInSec"/> <FIELD fieldtype="ui1" attrname="State"/> <FIELD fieldtype="ui1" attrname="Type"/> <FIELD fieldtype="bin.hex" attrname="Msg" WIDTH="500" SUBTYPE="Text"/> </FIELDS> <PARAMS/> </METADATA> <ROWDATA/> </DATAPACKET>
Загрузка происходит. Куда девается поле? И что мне надо сделать, чтобы поля в ТClientDataSet загрузились правильно?
-
В файле поля нет. В этом есть, а в том, который грузится там, - нету.
-
Причем говорит это тебе сам датасет. А ему-то лучше знать, есть у него поле или нет у него поля.
-
На "чистом" компьютере нет Дельфи, но есть файл программы, ЕСТЬ файл с таблицей в той же папке, в которой есть поле State (текст файла показал выше, он взят прям с 'чистого' компьютера). Если файл есть, то и загрузка должна производиться из него?. Загрузка из файла происходит, но поле State не подгружается (я подозреваю, что и все остальные поля также не загружаются). Вот в этом и вопрос: а почему они не загружаются? (на компе с установленной Дельфи все поля загружаются). Может, проблема в нехватке каких-либо библиотек? Или я не совсем понимаю принцип загрузки?
-
Вот в этом и вопрос: а почему они не загружаются?
Потому что его там нет .
-
> ssmaxx (23.01.2012 15:20:00) [0]
Странное имя для таблицы
-
> Странное имя для таблицы
Что-ж тут странного - таблица писем из почтового ящика. Отбираются те, которые мне нужны среди общей массы писем.
> Потому что его там нет .
Я именно этого и понять не могу: почему его там нет, если файл с таблицей (и с этим полем) есть. А т.к. я этого не могу понять, я и придумать, что сделать, не могу. Пожалуйста, как для чайника, объясните, что надо добавить на "чистый" комп (или в код программы), чтобы ДатаСет увидел в файле нужные поля и загрузил их.
P.S. Забыл сказать, еще на "чистый" комп скопировал файл midas.dll. Вроде, без него ДатаСет тоже не работает.
-
Где код выгрузки-загрузки CDS? И CDS прекрасно работает без midas.dll, если скомпилировано с uses MidasLib.
-
> если скомпилировано с uses MidasLib
Нет, без него. С ним откомпилировался. Спасибо за совет.
> Где код выгрузки-загрузки CDS?
Первый раз поля таблицы заполнил вручную в ДатаСете. Затем сохранил пустую таблицу в файл MailsTable.xml (текст полученного файла в посте выше). Затем очистил ДатаСет (в Дельфи на ДатаСете правой кнопкой -> Clear data). Подготовка закончена. Запускаю программу. В программе есть функция:
Function TMainForm.LoadBD; begin Try Memo1.Lines.Add(ExtractFilePath(Application.ExeName)+'MailsTable.xml'); MailsTable.LoadFromFile(ExtractFilePath(Application.ExeName)+'MailsTable.xml'); Result:=True; Except Result:=False; end;
Код, вызывающий эту функцию (в самом начале программы):
if LoadBD then begin Memo1.Lines.Add('База загружена.'); end else begin Memo1.Lines.Add('База не загружена!!! Выходим.'); Goto ExitProg; end; ... // Дальше обращаюсь к ДатаСету: ...
MailsTable.Insert; MailsTable.FieldByName('ID').AsInteger:=1; MailsTable.FieldByName('MailAddress').AsString:=Address; ... MailsTable.FieldByName('State').AsInteger:=0; if Kaska then MailsTable.FieldByName('Type').AsInteger:=0 else MailsTable.FieldByName('Type').AsInteger:=1; MailsTable.FieldByName('Msg').Value:=Memo2.Lines.Text; MailsTable.Post; SaveBD; ...
Функция сохранения базы:
Function TMainForm.SaveBD; begin Try MailsTable.SaveToFile(ExtractFilePath(Application.ExeName)+'MailsTable.xml'); Result:=True; Except Result:=False; end; end;
И получается такая штука: на компьютере с Дельфи данный код работает, на другом компьютере (без дельфи) - ошибка.
-
<FIELD fieldtype="ui1" attrname="State"/>
<FIELD fieldtype="ui1" attrname="Type"/> "напрягают" меня как то эти типы... понятно ансигнед инт 1 байт типа, но уверен, что оно там есть? > на компьютере с Дельфи данный код работает, на другом компьютере (без дельфи) - ошибка. чтение или запись? если читать так же с 9, как на "чистом"? какая версия дельфи? и стоял/стоит ли на "чистом" другая версия/программа использующая зарегистрированный мидас? > Except Result:=False; > end; ламеризм детектед... зачем прячешь реальную ошибку? ради идиотских сообщений? - 'База загружена.' 'База не загружена!!! Выходим.' ??? а типа так не понятно, что она загружена, если работает, или что нет, если ексепт...
-
<FIELD fieldtype="ui1" attrname="State"/> - тип Byte
> ламеризм детектед... зачем прячешь реальную ошибку?
Я и не спорю, что ламер... Обработку ошибок я еще не разбирал. Пока завис на ДатаСете :) Сообщения для информации.
> чтение или запись?
Даже не могу сказать уверенно, т.к. запускаю exe-шник, он просто выдает вышеуказанную ошибку. Скорее всего при записи (т.к. она первой по коду программы идет).
> какая версия дельфи?
Delphi XE
> и стоял/стоит ли на "чистом" другая версия/программа использующая > зарегистрированный мидас?
Специально ничего не ставил. Где посмотреть, что стоит, а что нет, даже не знаю.
> а типа так не понятно, что она загружена, если работает, > или что нет, если ексепт...
Мне она нужна сейчас рабочая хотябы из дома (где есть Дельфи). Если я уберу блок try ... Except - прога будет вылетать... Хотел на работе тоже поставить, а оно вона как... не получается.
-
ОПА... На ноуте жены запустил (Win XP x86) - все заработало... Наверное проблема не с ДатаСетом, а с какими-либо ограничениями пользователя. Буду донимать вопросами своего сисадмина!
Всем откликнувшимся огромное спасибо!!!
-
> а с какими-либо ограничениями пользователя. поищи на проблемном компе другую версию мидас.dll.
-
> Я и не спорю, что ламер... Обработку ошибок я еще не разбирал. Пока завис на ДатаСете :) > Сообщения для информации. блин, люди!!! вы начинаете через жопу ... если бы не твоя "обработка"/прятки ошибок, то возможно и проблемы бы не было... ну вот сказало бы сразу (возможно) - "несовместимость версий ... где", разве не проще бы было? нет же - "мне бы чтобы работало, прямо сейчас, а разбираться и читать почему не работает буду потом"... истинный ламеризм. срочно в дворники с таким подходом.
-
> срочно в дворники с таким подходом.
Чистые улицы надоели?
-
Критика, критика... Постараюсь учесть Ваши замечания. А по делу - помогло:
> если скомпилировано с uses MidasLib
Еще раз спасибо!!!
-
> [19] ssmaxx (24.01.12 08:50)
Критика тоже по делу. Ты раз взялся обрабатывать исключения, так добавь к "База не открыта" исходное сообщение о причине, ты же его просто теряешь, а ценность твоего нулевая.
|