Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование OleVariant, в другой (пользовательский) тип 
:(
    Опции темы
EKoshelev
Дата 15.6.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Интегрируюсь к Некой Системе. Один из её методов возвращает, как написано в хелпе для Некой Системы, «набор данных с полями». Предположим, поля:
Field0: integer;
Field1: string;
Field2: Boolean;
Field3: text;

Иначе говоря (если я правильно понял) это массив типа записи из четырёх полей. Фактически метод возвращает OleVariant.

Дак вот я никак не врублюсь как мне из ОлеВарианта достать этот самый массив типа записи. Если присваивать всё это массиву типа байта, то туда что-то помещается. Если декодировать это в char, то там видны всякие разные слова. Но если попробовать присвоить это массиву типа char, то в итоге получается куча #0. А если присваивать структурам array of record, то по жизни одни нули и пустые строки.

В общеме, может кто-нибудь подскажет как мне быть???


Забыл ещё сказать. Если этот самый возвращённый OleVariant в трассировке запихать в окошко, которое по F7 вызывается, то внизу появляется надпись "array of byte".

Это сообщение отредактировал(а) EKoshelev - 16.6.2005, 07:46


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Satana
Дата 15.6.2005, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

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



ну наверное так:
Код

type chtoto=record
  Field0: integer;
  Field1: string;
  Field2: Boolean;
  Field3: text;
end;
var
chegonibud:chtoto;

ну и уже походу будешь обращаться к элементам записи так:
chegonibud.Field0:=0;
ну и так далее...


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
EKoshelev
Дата 16.6.2005, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Satana

Ну-у-у-у... я уже писал ведь, что если написать
Код

var chegonibud: chtoto;

...

chegonibud := OleVariant_;


то в ЧегоНибудь будут нули и пустые строки.

А если ты имел в виду, что нужно присваивать

Chegonibud := HrenoMoyo

то я не очень понимаю что ты имел в виду.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Satana
Дата 16.6.2005, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

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



да не ты не так понял раз ты объявил тебе возвращается структура то ты должен сделать у себя в программе такую же структуру (тобишь запись типа record)
и присваивать не
Код

chegonibud := OleVariant_;

а так:
Код

chegonibud.Field0 :=Field0_iz_nabora_dannyx_vernutyx_systemoy;
chegonibud.Field1:= Field1_iz_nabora_dannyx_vernutyx_systemoy

и т.д.

И вообще приведи пример того что тебе нада (кусок кода выложи своего) тогдя я может помогу тебе другим примером.


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
EKoshelev
Дата 16.6.2005, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Satana
Ну, во-первых, ЧегоНибудь должно быть прежде всего массивом, а уж потом только записью. Но это ладно.

Я бы с удовольствием написал так как ты во втором фрагменте предложил, только я не знаю как достать Field0_iz_nabora_dannyx_vernutyx_systemoy. Фича в том, что есть метод ком-объекта GetData (к примеру). В хелпе написано, что этот метод (функция) возвращает набор значений с такими-то полями. А фактически, с точки зрения дельфы, он возвращает значение типа OleVariant. То есть в этом ОлеВарианте каким-то хитрым образом хранится массив типа записи с четырьмя полями. А как эти поля от туда доставать (в нужном мне формате) я не знаю.

То есть, как я уже написал, если этот ОлеВариант присвоить массиву типа байта, то в этом массиве появляется куча чисел, 7 с лишним тысяч. Я преобразовывал их в буквы и находил там слова, которые, по делу, и должны там находиться. Но если ОлеВариант попытаться присваивать к каким-нибудь другим структурам, то в них оказываются нули и пустые строки.

Короче, до того, что ты мне предложил я бы и сам догнал в момент. Но тут всё не так просто...


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Guest
Дата 16.6.2005, 22:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(EKoshelev @ 15.6.2005, 15:42)
Field1: string;


А что, эта система иимеет представление о длинных строках дельфи?? Она что на Delphi/Builder написана??

По сабжу, если структуру необходимо передать как вариант, то обычно вариант представляют как массив байт, в который и пишут всю запись целеком..

Код

type
  TRec = packed record
    i: Integer;
    d: Double;
    b: boolean;
  end;

function RecToVar(const Rec: TRec): Variant;
var
  P: Pointer;
begin
  Result := VarArrayCreate([0,SizeOf(Rec) - 1], varByte);
  P := VarArrayLock(Result);
  try
    Move(Rec, P^, SizeOf(Rec));
  finally
    VarArrayUnlock(Result);
  end;
end;

function VarToRec(V: Variant): TRec;
var
  P: Pointer;
begin
  P := VarArrayLock(V);
  try
    Move(P^, Result, SizeOf(Result));
  finally
    VarArrayUnlock(V);
  end;
end;


Но вот как твоя система передает строки(то есть ссылочные типы) - это не понятно.. Те нужно связываться с разработчиками, там наврядли, что либо гадаешь..
  Вверх
jack128_
Дата 16.6.2005, 22:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Guest @ 16.6.2005, 22:08)
там наврядли, что либо гадаешь..

читать как "а так наврядли угадаешь.."

  Вверх
Satana
Дата 16.6.2005, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

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



EKoshelev ну а ты можешь хотябы вставить сюда то что пишут в хелпе? а то все абстракции да обстракции smile


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
EKoshelev
Дата 17.6.2005, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Guest, ты, гляжу, мужик-то умный, зарегистрировался бы. А jack128_ это тоже ты?

Дак ты хочешь сказать, что такая схема передачи данных (массив оф байт) является стандартной? На чём написана система не знаю, но о длинных строках она, наверняк, имеет представление, т.к. там был примерно следующий дамп.

1
1
1
0

0
0
13
0

слово из тринадцати букв

...

В хелпе было написано, что первым идёт _ID, а потом _Name. Правда считать непосредственно в строковые типы (string, WideString, WideChar) у меня не получилось, я так понял, это всё указатели. Приходилось читать кол-во байт, а потом в цикле по одной букве прибавлять.

А на счёт разработчика - это я сам уже понял, да и товарищ один присоветовал тоже самое сделать. Вот ты ещё.

Спасибо за код, думаю пригодится. Кстати, я чё-то до сих пор не знаю что такое packed record, т.е. про обычный рекорд знаю...


Satana Ну если хошь кусок хелпа - я чуть по позже выложу. Просто jack128_, видать, лучше схватил что мне нужно.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Dynamic
Дата 17.6.2005, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(EKoshelev @ 17.6.2005, 07:21)
Кстати, я чё-то до сих пор не знаю что такое packed record

запись, поля которой не выравниваются ни по каким адресам, а "прилеплены" друг к другу, т.е. в итоге, могут занимать меньше памяти, но обрабатываться медленнее.


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
jack128_
Дата 25.6.2005, 19:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(EKoshelev @ 17.6.2005, 07:21)
Дак ты хочешь сказать, что такая схема передачи данных (массив оф байт) является стандартной?

Естественно стандартами OLE это не регламентировано, но это удобный способ для передачи данных, не доддерживаемых OLE напрямую.

Цитата(EKoshelev @ 17.6.2005, 07:21)
На чём написана система не знаю, но о длинных строках она, наверняк, имеет представление, т.к. там был примерно следующий дамп

"Там" это где ? Ты как я понял получил массив байтов в виде Variant' a ? Это вот его дамп ?

Для начала я вообще не понял, что ты должен получить потому что вот тут
Цитата(EKoshelev @ 15.6.2005, 15:42)
Field0: integer;
Field1: string;
Field2: Boolean;
Field3: text;

Иначе говоря (если я правильно понял) это массив типа записи из четырёх полей.

ты говориш одно, а вот тут
Цитата(EKoshelev @ 17.6.2005, 07:21)
В хелпе было написано, что первым идёт _ID, а потом _Name.
другое.
Дам конечно больше под второй вариант подходит.. Сначала 4 байта - _Id = $0111 Потом длина строки - 13 , потом сама строка.. Вобщем если ты еще не связался с разработком, проясни ситуацию..

Цитата(EKoshelev @ 17.6.2005, 07:21)
Guest, ты, гляжу, мужик-то умный, зарегистрировался бы. А jack128_ это тоже ты?
Да -я. Я зарегистрирован, но выхожу с двух компов, поэтому как мне кажется на форуме куки сбиваются постоянно..

  Вверх
EKoshelev
Дата 27.6.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



jack128_, на счёт того, что я сначала одно говорю, а потом другое, дак это я сначала писал для примера, а потом как в натуре. На счёт дампа - да, это вариант.

А вообще, пацаны, всем спасибо, мне уже нюх натёрли как это дело надо считывать. Там через ДатаСоурс всё вообще клёво получается.

Всем спасибо за желание помочь!!!


Это сообщение отредактировал(а) EKoshelev - 27.6.2005, 11:29


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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