Лыжи по асфальту с аксесом и делфями

9600 12.03.2004 - 18:59 | В табличке поле типа ОЛЕ. При записи в него строки, числа и т.д. все хоккей. При попытке редактирования он низачто не хочет вставлять пустую строку. Т.е. при отработке table.edit fields[0].value := ''; table.post В поле остается старое значение, равно как и при попытке написать так: table.edit fields[0].value := null; table.post Кто сталкивался, помогите, плз
* 1 - 13.03.2004 - 12:59 | nil?
VaS 2 - 13.03.2004 - 21:00 | TField.Clear
9600 3 - 15.03.2004 - 09:28 | ТО (1): nil не есть значение. Это указатель ТО VaS: Метод клеар всего лишь разрушает объект типа ТФилд. Не присваивая никакого значения самому полю.
FWP 4 - 15.03.2004 - 11:47 | В функцию передают EmptyParam. Попробуй, м.б. прокатит вместо NULL.
9600 5 - 15.03.2004 - 15:46 | То 4: Не прокатило ;(
Серый ёжЬ 6 - 15.03.2004 - 16:03 | а если записать не пустую строчку, а пробел, т.е. fields[0].value := ' '; ?
Delphist 7 - 15.03.2004 - 16:04 | Дурацкая мысль, но все же... Попробуй записать вместо пустой строки нулевой символ #0
9600 8 - 15.03.2004 - 17:26 | В том то весь и фикус, что поле содержит произвольный набор символов (НЕХ-кодов) от 1 до 64Кбайт. Их над читать и обрабатывать. Если даже стоит #0 или пробел (#20) то этот код тоже подлежит обработке. Нужно чтоб в поле было совсем пусто P.S:(чтоб ему пусто было)
UE 9 - 15.03.2004 - 17:30 | А может в самой БД не разрешено пустое значение для этого поля?...
Серый ёжЬ 10 - 16.03.2004 - 08:31 | 9600, ну а если условие поставить, мол if в_поле_не_пробел then обрабатывать else не_обрабатывать ?
9600 11 - 16.03.2004 - 08:49 | Пустое значение разрешено. Этот же скрипт, отрабатываемый на Вижуал Васике в самой базе данных работает. А через АДО в делфях не хочет. ТО Серый ёжЬ: В поле может находиться и один, абсолютно Любой символ, в том числ и пробел. И он должен быть подвергнут обработке.
Серый ёжЬ 12 - 16.03.2004 - 09:31 | 9600, ступил я чё-то с утра
VaS 13 - 16.03.2004 - 11:47 | >Метод клеар всего лишь разрушает объект типа ТФилд. Не присваивая никакого >значения самому полю. Нет.
9600 14 - 16.03.2004 - 12:18 | По F1: Deletes all fields from the TFields object. procedure Clear; Description Applications do not normally call the Clear method directly. Clear also frees the memory used to store the Fields array and sets the DataSet property to nil. ----------------------------------------- Наскока я знаю англицкую мову, то первое предложение переводится как: "Удаляет все поля из объекта ТФилдс", а последнее предложение переводиться как: "Клеар также освобождает память, используемую для хранения массива Фиелдс и устанавливает свойство ДатаСет в нил." Во всяком случае не помогло. Clear под отладчиком тоже отрабатывается но запись из БД не стирается.
VaS 15 - 16.03.2004 - 17:37 | Читаем сообщение 2 еще раз. Внимательно-внимательно.
9600 16 - 18.03.2004 - 11:37 | 1. Прочитал еще раз ;)) 2. Применил на практике. 3. Результат нулевой
VaS 17 - 18.03.2004 - 13:09 | Полный тестовый код в студию (начиная с Edit и кончая Post). + результаты выборки из базы ДО и ПОСЛЕ.
9600 18 - 20.03.2004 - 11:36 | with DM.Table1 do begin Edit; SSS := MakeHexStr(Daily[0].First); // var SSS: string; if SSS<>'' then Fields[1].Value := SSS else Fields[1].Clear; Post; end; ---------------------------------------- Под отладкой элсе секция выполнилась (сформированная строка = ''). А поле[1] хранит старое значение Дамп памяти по Fields[1].Value до: $00 $01 $00 $00 $00 $00 $00 $00 $CC $E8 $DC $01 $00 $00 $00 $00 После Clear то же самое
VaS 19 - 20.03.2004 - 11:56 | 1. В опциях проекта указываем [x] Use debug DCUs 2. После Clear добавляем строку SSS := Fileds[1].Value 3. Заходим по F7 в Fileds[1].Clear. Изучаем что происходит на самом деле. Заходим в строку п.2 - то же самое 4. Далее то же самое для Post Результаты - на порядок повысившееся понимание VCL + решенная задача.
9600 20 - 20.03.2004 - 14:50 | Наверное я совсем дурной: procedure TField.Clear; //Описано в модуле Db begin SetData(nil); end; при заходе по F7 в Fields[1].Clear выполняется только function TFields.GetField(Index: Integer): TField; // Описана там же в Db begin if FSparseFields > 0 then begin if Index >= FSparseFields then DatabaseError(SListIndexError, DataSet); Result := FList[0]; Result.FOffset := Index; end else Result := FList[Index]; end; И усе. Далее управление передается в программу. SetData(nil) не отрабатывается. P.S.: Я пошел за маслом.(Лыжи смазывать ;>)
9600 21 - 20.03.2004 - 15:27 | В общем напрямую вызвал SetData(nil). И все зробилось. Спасибо всем за участие !!!
VaS 22 - 20.03.2004 - 16:31 | Это ты попал сначала в get-функцию свойства Fields :) Надо было дойти до ее конца и идти дальше. Дело в том, что TField.Clear() - виртуальная и может быть переопределена в наследниках TField. Например: . procedure TBlobField.Clear; begin DataSet.CreateBlobStream(Self, bmWrite).Free; end; . Что весьма и весьма отличается от базовой реализации.
9600 23 - 22.03.2004 - 14:40 | Да нет. Дело в том что после гет-функции управление передавалось в мою программу. До метода клеар почему-то не доходило. (Кнопки Ф7 и Ф8 мне знакомы ;)) Объект типа ТФилд не переопределялся. (Table не компонент, создается при инициализации коннекта к БД).
VaS 24 - 22.03.2004 - 14:58 | > Дело в том что после гет-функции управление передавалось в мою программу. Ты сам рассуди - если в get-методе Result <> nil, то КАК ты мог не попасть в Clear()?? Поставь на входе в него брэйкпоинт.
9600 25 - 22.03.2004 - 16:42 | поставил брейкпоинт на procedure TField.Clear; begin >> SetData(nil); end; даже не тявкнул
VaS 26 - 22.03.2004 - 17:01 | Встань на Result := FList[Index] (из сообщ. 20) и посмотри Result.ClassName (Run -> Inspect). Далее найди класс с таким именем и посмотри реализацию Clear() - видимо там не вызывается метод предка (inherited).

>>