Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

GUID в поле таблицы DBF [dBase, FoxPro]


Страницы:   1 2

aga123 ©   (2004-03-02 10:00:00) 

Добрый день мастера!

Помогите пожалуйста, ибо я застрял вот на чем:

Мне нужно поместить значение GUID в поле DBF таблицы.
Функция CoCreateGUID() формирует значение типа TGUID.
Я перелопатил кучу примеров, но в них везде используется строковое представление получаемое из GUIDToString(), но длина получаемого результата 38.

- А как же получить 16 байтное значение из CoCreateGUID()?
- Каков тип получаемого результата? Какого типа должно быть поле в таблице FOXPRO(!), чтобы поместить туда полученное значение?

Огромное спасибо.


aga123   (2004-03-02 15:00:00) [1]

А поле SQuid это просто тестовое поле
В окончательном варианте останется Guid Character(Binary)
Так что же это получается: нельзя сохранить непосредственно сам GUID?
Обязательно нужны преобразованные варианты, либо в Char(28) через GUIDToString, либо в Char(16) через SGUIDToString() от Johnmen?


aga123   (2004-03-02 13:44:00) [2]

Да но функции писали для того чтобы привести к читаемому виду TGUID.

Но в [10] сказано:
 Если увидеть - то GUIDToString :)) А если юзать - то без этого :)

И я так понял что если юзать никакого преобразования не нужно.


Delirium   (2004-03-02 13:38:00) [3]

"растерялся, отупел" - похоже на то, для чего тебе функции написали, чтобы ты опять GUIDToString пользовал и получал 38 байт?


aga123   (2004-03-02 13:29:00) [4]

Прошу прощения, вопрос не закрываем
Пример
В таблице FoxPro завожу два поля:
1) Guid  : Character(Binary) (пробовал и Character(16))
2) SGuid : Character(38)

Кнопка <Создать GUID>:

procedure TForm1.Button1Click(Sender: TObject);
Var
 Id :TGUID;
 s : String;
 Result :HRESULT;
begin
 Result := CoCreateGuid(Id);
 if Result = s_OK then
 begin
   s := GUIDToString(Id);

   AdsTable1.Edit;

   AdsTable1['SGuid'] := s; // все ОК

   AdsTable1['Guid'] := Id; // incompatible types:
                            // 'Variant' and 'TGUID'
 end;
end;

Опять двадцать пять???
Что-то я растерялся, отупел, ничего не понимаю...


Anatoly Podgoretsky   (2004-03-02 12:26:00) [5]

Нормально использовать для хранения 38 байтовое строковое значение, тогда можно хранить абсолютно в любой базе, включая текстовые


aga123   (2004-03-02 12:24:00) [6]

Огромное спасибо всем!
Вопрос можно считать закрытым.
Я уже экспериментирую с таблицей.


Delirium   (2004-03-02 12:20:00) [7]

> Johnmen ©   (02.03.04 12:16) [16]
"А так еще короче...:)" - да-уж, а я стрмозил :))


Delirium   (2004-03-02 12:16:00) [8]

Если посмотреть реализацию TGuidField, то всё станет очевидно. И GUID там хранится как строка в 38 байт.


Johnmen   (2004-03-02 12:16:00) [9]

А так еще короче...:)
function SGUIDToString(GUID: TGUID) : string;
begin;
 SetLength(Result,SizeOf(TGUID));
 Move(GUID,pointer(Result)^,SizeOf(TGUID));
 end;


aga123   (2004-03-02 12:02:00) [10]

А что из себя представляет тип поля ftGuid из DBCommon.Pas?
Я имею в виду в каком виде он реализует GUID в строковом или в 16-bit integer?
Очевидно что скорее всего другое.


aga123   (2004-03-02 11:34:00) [11]

Огромное спасибо Delirium!
Мое любопытство удовлетворено!


Delirium   (2004-03-02 11:29:00) [12]

"Или перемести эти 16 байт в строку..." - вот, кстати, набросал довольно шуструю функцию :)

function GUIDToBinaryStr(const G:TGUID):string;
begin
SetLength(Result, 16);
Result[ 1]:=Chr((G.D1 and $FF000000) shr 24);
Result[ 2]:=Chr((G.D1 and $00FF0000) shr 16);
Result[ 3]:=Chr((G.D1 and $0000FF00) shr 8);
Result[ 4]:=Chr((G.D1 and $000000FF));
Result[ 5]:=Chr((G.D2 and $FF00) shr 8);
Result[ 6]:=Chr((G.D2 and $00FF));
Result[ 7]:=Chr((G.D3 and $FF00) shr 8);
Result[ 8]:=Chr((G.D3 and $00FF));
Result[ 9]:=Chr(G.D4[0]);
Result[10]:=Chr(G.D4[1]);
Result[11]:=Chr(G.D4[2]);
Result[12]:=Chr(G.D4[3]);
Result[13]:=Chr(G.D4[4]);
Result[14]:=Chr(G.D4[5]);
Result[15]:=Chr(G.D4[6]);
Result[16]:=Chr(G.D4[7]);
end;


Romkin   (2004-03-02 11:01:00) [13]

В окне просмотра по Ctrl+Alt+W :)
Или перемести эти 16 байт в строку...


aga123   (2004-03-02 11:00:00) [14]

Спасибо!
Но неужели так и нельзя увидеть GUID неконвертированным, в виде 16 байтной последовательности закорючек? Так посмотреть захотелось, аж чешется :)
Спасибо всем за ответы. Извините за ...


Romkin   (2004-03-02 10:49:00) [15]

Если увидеть - то GUIDToString :)) А если юзать - то без этого :)


Delirium   (2004-03-02 10:49:00) [16]

GUIDToString - ты ведь и сам прекрасно знаешь ответ


aga123   (2004-03-02 10:45:00) [17]

Пардон, я хотел сказать увидеть в Label.Caption сам GUID :)


Delirium   (2004-03-02 10:44:00) [18]

"Как посмотреть длину TGUID в заголовке Label" - пора в орешник :)


aga123   (2004-03-02 10:42:00) [19]

2Romkin
Как посмотреть длину TGUID в заголовке Label:
 Label1.Caption := IntToStr???(ID) ???


Delirium   (2004-03-02 10:37:00) [20]

Думаю самое верное  - использовать поле типа Binary(16)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо