![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GUID в поле таблицы DBF [dBase, FoxPro]
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)