Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TBlobField.AsWideString, WideString вместо String 
:(
    Опции темы
FilSM
Дата 16.4.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.4.2007

Репутация: нет
Всего: нет



Приветствую!

У стандартного TBlobField есть метод получения содержимого поля в виде строки:

Код


function TBlobField.GetAsString: string;
var
  Len: Integer;
begin
  with DataSet.CreateBlobStream(Self, bmRead) do
    try
      Len := Size;
      SetString(Result, nil, Len);
      ReadBuffer(Pointer(Result)^, Len);
    finally
      Free;
    end;
end;



Нужно тоже самое получить, только не String-ый, а WideString-ый результат.
Пытался так:

- создал новый тип:
Код


type
  TWBlobField = class(TBlobField)
  protected
    function GetAsWString: WideString;
  public
    property WValue: WideString read GetAsWString;
  end;



- прописал метод:

Код


function TWBlobField.GetAsWString: WideString;
var
  Len: Integer;
begin
  result := '';
  with DataSet.CreateBlobStream(Self, bmRead) do
    try
      Len := Size;
      Position := 0;
      if Len <> 0 then
      begin
        SetString(result, PWideChar(nil), Len);
        ReadBuffer(PWideChar(result)^, Len);
      end;
    finally
      Free;
    end;
end;



Для отображения содержимого использую TTntRichEdit. 
И в результате получаю некий (на вроде текста) форматированный бред:

楖浳穡㔠‵慤番潭⁳牡渠步獵慴潭慰痰畭删柮⃢〲㘰‮慧慤㈠‮異杳摡⃢慫牴⁡楰歲懰慮⁳湵瀠狢潤懰慮⁳畳浭⁡物戠橩獵⁩楶浳穡洠汩潪獮氠瑡⹵਍慓當瑲渠⁥慭㠠‷慤番潭⁳畳浭⁡獲楮来獵⁩業橬湯⁵潤畲മ퀊獩猠慫瑩⁳敩潲慪業瀠狢湳敩穤瀠物瀠獵慧慤搠瑡獵‬慫⁤畤搠牡櫮浵⁵楢慪愠瑴敩楧㐠‵湵㜠‰‭畴歲⁴畲慮椠⁲楴慫⁩慰⁲犫摥慺慭楪浥묠搠牡櫮浵敩Ɑ欠牵⁵畳浭獡漠楦楣波⁩敲槬瑳慴⁳敺敭杳慭‮楔浫狧愠穩楶湥氠敩獫猠慫瑩⁳敮畫瑳浡⃢烮a浵⁡慤番畭渠瑯敩Ⱬ瀠狢潤潤⁴敮楶⁳慰痰慰痰畭‬敢⁴甠淧浵⁡慫楰摬獡‬慫烮a浵⁳楰摥牥‬‭獤椠⁲楢楪⁳牡⃮慰番朠摡⁡異杳摡⁡敲潫摲慤番獭‬慭湩瑯敩⁳牁滧獡删柮⁡烮a楮步浡മ윊瑲毢瀠狢潤⁴楦浲獡츠慰槰氠敩潬搠 ... и тд.

Все заканчивается еще хуже:

珮慴慭楪浥甠淧櫧敩畇瑮⁡橶⁡湵䤠潧慲匠潫慫戠穥欠敲牴獥牵畳瀠敩慳獩整⹳਍㜸‮⸰㌵洠汩⹪䰠⁳‭畡畧瑳⃢楤楌汥牢瑩滢橩獡甠楌瑥癵獡欠浯楮楰摥牥o⃢䥓⁁慄扭慪挠湥牴⁳慰⁲畤猠浵畭渠汰獡浴獡⁵ﭲ湰敩慫䄠摮慲䴠摥湥敩慫渠灯物畫楳ㄠ㠸‹癫摡浴瑥畲⁳楬汥⁵敺敭⁳慧慢畬愠⁲慲濾懰慮⁳毧淢䜠湡拮⁵慤扭⃮⸳਍烎a浵⁡敩敤⁩旲瑭⁳⸱‹業橬湯⁵慬畴欠敲獴䠠湡慳慢歮⻢਍







...

и так еще тысяча строк.

Что не так и где порыться?

PM MAIL   Вверх
Alex
Дата 16.4.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



В исходниках Delphi 2006 они получают вот так:
Код

function TBlobField.GetAsWideString: WideString;
var
  Len: Integer;
begin
  with DataSet.CreateBlobStream(Self, bmRead) do
    try
      Len := Size;
      SetString(Result, nil, Len div 2);
      ReadBuffer(Pointer(Result)^, Len);
    finally
      Free;
    end;
end;



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
FilSM
Дата 17.4.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.4.2007

Репутация: нет
Всего: нет



--> Alex

Получаю тотже бред, только короче.
А что 2006-й стал Unicode поддерживать?
Я до сих пор на 7-м кропаю.
PM MAIL   Вверх
Alex
Дата 17.4.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



Цитата(FilSM @  17.4.2007,  10:35 Найти цитируемый пост)
Получаю тотже бред, только короче.

А кто записывает данные? Может туда бред записывают?

Цитата(FilSM @  17.4.2007,  10:35 Найти цитируемый пост)
А что 2006-й стал Unicode поддерживать?

На уровне TField да, где-то летом будет и поддержка на уровне компонентов в Delphi2007


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
FilSM
Дата 17.4.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.4.2007

Репутация: нет
Всего: нет



---> Alex

Для отображения содержимого использую TTntRichEdit (TRichEdit c поддержкой Unicode).

Раньше я использовал следующий метод:

Код

function TWBlobField.GetAsWString: WideString;
var
  Len: Integer;
begin
  result := '';
  with DataSet.CreateBlobStream(Self, bmRead) do
    try
      Len := Size;
      Position := 0;
      SetString(result, nil, Len);
    finally
      Free;
    end;
end;


и все работало, пока пользователь не ввел текст длиной в 37000 символов.
Такое ощущение, что необходима дополнительная конвертация этих иероглифов... 
PM MAIL   Вверх
Bose
Дата 18.4.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 9
Всего: 51



а как сами данные выглядят?

Добавлено через 28 секунд
то что в базе хранится
PM MAIL WWW Skype   Вверх
FilSM
Дата 18.4.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.4.2007

Репутация: нет
Всего: нет



---> Bose

В Blob поле храниться текст на разных языках (в конкретном длинною в 37000 символов):

Vismaz 55 darījumos ar nekustamo īpašumu Rīgā 2006. gada 2. pusgadā katra pirkšanas un pārdošanas summa ir bijusi vismaz miljons latu.
Savukārt ne mazāk kā 87 darījumos summa pārsniegusi miljonu dolāru.
Šis skaits ievērojami pārsniedz pirmā pusgada datus, kad šādu darījumu bija attiecīgi 45 un 70 - turklāt runa ir tikai par «redzamajiem » darījumiem, kuru summas oficiāli reģistrētas zemesgrāmatā. Tikmēr aizvien lielāks skaits nekustamā īpašuma darījumu notiek, pārdodot nevis pašu īpašumu, bet tā uzņēmuma kapitāldaļas, kam īpašums pieder, - tāds ir bijis arī pagājušā gada pusgada rekorddarījums, mainoties Arēnas Rīga īpašniekam.
Ērtāk pārdot firmas Īpaši lielo darījumu skaits galvaspilsētā pastāvīgi pieaug jau kopš 2005.
gada pirmā pusgada, kad tikai 20 darījumu summa bija viens milj. Ls vai lielāka un lielākā oficiālā darījuma summa bija 3.67 milj. Ls. Pagājušā gada 2. pusgads gan nav uzstādījis jaunu viena darījuma summas rekordu, - joprojām nepārspēti palika gandrīz 30 milj. Ls, par kuriem aizvadītā gada pavasarī ievērojamu zemes platību Rusova ielā pārdeva uzņēmēja Ināra Vilkaste....

и тд.
PM MAIL   Вверх
Bose
Дата 18.4.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 9
Всего: 51



FilSM, мммм... а в Hexе? 

я к чему спрашиваю.. Может у тебя там UTF-8(например) хранится, или ещё что... что может некорректно отображаться TtntRichView
PM MAIL WWW Skype   Вверх
FilSM
Дата 18.4.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.4.2007

Репутация: нет
Всего: нет



---> Bose

Сомневаюсь, ибо текст вводился в той же самой форме и в том же самом TtntRichView.
И текст был вполне читабельный. Повторюсь - проблема появляется только с длинными
текстами.
PM MAIL   Вверх
Bose
Дата 18.4.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 9
Всего: 51



Цитата(FilSM @  18.4.2007,  16:09 Найти цитируемый пост)
Сомневаюсь, ибо текст вводился в той же самой форме и в том же самом TtntRichView.И текст был вполне читабельный. Повторюсь - проблема появляется только с длиннымитекстами.

Т.е. тексты меньшей длины и записываются и считываются нормально?
PM MAIL WWW Skype   Вверх
FilSM
Дата 19.4.2007, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.4.2007

Репутация: нет
Всего: нет



---> Bose

Именно так. Метод 

Код

function TWBlobField.GetAsWString: WideString;
var
  Len: Integer;
begin
  result := '';
  with DataSet.CreateBlobStream(Self, bmRead) do
    try
      Len := Size;
      Position := 0;
      SetString(result, nil, Len);
    finally
      Free;
    end;
end;


хоть и некорректно написан (без чтения из буфера 
Код

ReadBuffer(Pointer(Result)^, Len);
),
но работал нормально с достаточно длинными текстами 
(насколько длинными - сказать не могу, не анализировал).
И вдруг такая проблема...
PM MAIL   Вверх
Bose
Дата 19.4.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 9
Всего: 51



Цитата(FilSM @  19.4.2007,  09:55 Найти цитируемый пост)
Именно так. Метод
TWBlobField.GetAsWString: WideString;
хоть и некорректно написан (без чтения из буфера
ReadBuffer(Pointer(Result)^, Len); 
но работал нормально с достаточно длинными текстами 

Не понимаю, как он вообще работал  smile 

Уже не знаю, что и посоветовать... 

А этот длинный текст в базе не мог повредиться? 



PM MAIL WWW Skype   Вверх
FilSM
Дата 19.4.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.4.2007

Репутация: нет
Всего: нет



--> Bose

Сам удивляюсь, так как чтение из буфера не записал по ошибке.
Увидел только когда появилась проблема. Но что характерно,
добавив чтение ReadBuffer в код, стал даже короткие тексты 
получать в зюзюках. Еще один нюанс: если использовать 
стандартный GetAsString, получаю читабельный текст. Даже 
длинный, но без Unicode.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1019 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.