Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];

Вниз

Совсем запутался c uniqueidentifier.   Найти похожие ветки 

 
paul_k   (2003-12-30 09:31) [0]

Есть стандартная структура
id uniqueidentifier,
parent_id uniqueidentifier,
division_name varchar 255

Пытаюсь это разместить в "дерево" (TTreeView)
TreeNode:=TreeView1.Items.AddChildObject(Node,q_tree_nodes.fieldByName("division_name").AsString,Pointer(QuotedStr (q_tree_nodes.fieldByName("id").AsString)));
когда пытаюсь получить ID - получаю бред сивой кобылы
q_tree_nodes.SQL.Text:="exec ap_division_tree @parent_id="+String(Node.Data);
q_tree_nodes.SQL.SaveToFile("11");

exec ap_division_tree @parent_id="{2EF182AD-4968-47B7-A4FB-E4420FE6E931}" 8
Откуда это?


 
Johnmen   (2003-12-30 09:43) [1]

Вот это слегка бред с.к. :)
Pointer(QuotedStr (q_tree_nodes.fieldByName("id").AsString))


 
paul_k   (2003-12-30 09:45) [2]

Об этом догадался.
А как лечить?


 
Johnmen   (2003-12-30 09:50) [3]

Должен передаваться указатель на реально существующую переменную...


 
paul_k   (2003-12-30 09:58) [4]

то есть
var p_id string[40]
begin
........
p_id:=QuotedStr(q_tree_nodes.fieldByName("id").AsString);
TreeNode:=TreeView1.Items.AddChildObject(Node,q_tree_nodes.fieldByName("division_name").AsString,Pointer(p_id);

и соответсвенно сначала в p_id получать а потом прикрадывать к Sql.Text?


 
paul_k   (2003-12-30 10:14) [5]

еще хуже.
валится с AV


 
Johnmen   (2003-12-30 10:18) [6]

1. var p_id string;
2. Pointer(p_id);
3. String(PChar(Node.Data));


 
Desdechado   (2003-12-30 10:19) [7]

вообще-то для таких целей не строковые значения ID используют, поэтому
Pointer(q_tree_nodes.fieldByName("id").AsInteger)


 
paul_k   (2003-12-30 10:36) [8]

2Johnmen

String(PChar(Node.Data))= "h"#1

2Desdechado
И рад бы последовать Вашему совету, но размера Integer мне явно не хватит. А поле numeric(18,0) в виде q_tree_nodes.fieldByName("id").AsInteger тоже бред выдает


 
Delirium   (2003-12-30 10:44) [9]

var PG:PString;
...
New(PG);
PG^:=q_tree_nodes.fieldByName("id").AsString;
AddChildObject(Node, q_tree_nodes.fieldByName("division_name").AsString, @PG);
...


 
paul_k   (2003-12-30 10:47) [10]

Спасибо а как в обратном порядке?
то есть как прочесть строку с указателя PG?
String(PG^)?


 
Desdechado   (2003-12-30 10:51) [11]

numeric(18) в разрядность integer действительно не влазит да и преобразование зависит от используемых компонентов...


 
Delirium   (2003-12-30 10:52) [12]


> paul_k © (30.12.03 10:47) [10]

Достаточто просто PG^ указатель ведь типизированный


 
paul_k   (2003-12-31 09:34) [13]

С наступающим Вас
бред продолжается. написал как указано в

Delirium © (30.12.03 10:44) [9]
то есть в onCreate формы набираю корень дерева
while not q_tree_nodes.Eof do
begin
New(PG);
PG^:=q_tree_nodes.fieldByName("id").AsString;
(q_tree_nodes.fieldByName("id").AsString);
TreeNode:=TreeView1.Items.AddChildObject(Node,q_tree_nodes.fieldByName("division_name").AsString,@pg);
TreeNode.SelectedIndex:=2;
TreeNode:=TreeView1.Items.AddChildObject(TreeNode,"",nil);
q_tree_nodes.Next;
end;

дальше при попытке раскрыть ветку onExpanding надо считать её содержимое
читаю -
pg:=Node.Data;
p_id:=pg^;

получаю
pg= $12FAC4 "р"#3#$13#0#1#2#0#0#1#0#0#0#9#0#8#0"ВК¶"#4"J"#1#0#0"©"#0#0#0"ИRМ"#0"¶ЮG"#0"фы"#$12#0".....
p_id = "А"#3"""#0#1#2#0#0#1#0#0#0#$A#0#8#0"‹­»"#4"K"#1#0#0"©"#0#0#0"ИRМ"#0"¶ЮG"#0"фы"#$12#0"<ЯG"#0"@ь"#$12#0#0 ......

Сообщение об AV
Сообщение Invalid pointer operation

Уже назрел вопрос В какой месте ДНК у меня ошибка..
запутался окончательно. Неужели придется ограничится типом Integer


 
Johnmen   (2003-12-31 09:45) [14]

Навскидку, вот здесь ошибка
AddChildObject(Node,q_tree_nodes.fieldByName("division_name").AsString,pg);


 
paul_k   (2003-12-31 09:48) [15]


> Навскидку, вот здесь ошибка

а в чем она?


 
Johnmen   (2003-12-31 10:05) [16]

Пардон. Там у тебя pstring....
На него лучше не заморачиваться, запутаешься.
Попробуй просто string.


 
paul_k   (2003-12-31 10:08) [17]

пробовал...
paul_k © (30.12.03 09:58) [4]


 
Johnmen   (2003-12-31 10:17) [18]

И я попробовал...:)
Все работает. Как в [6].


 
paul_k   (2003-12-31 10:55) [19]

ну если тип поля int
работает нормально
procedure Tfm_divisions_tree.AddLevel(Node: TTreeNode);
Var
q_tree_nodes: TAdoQuery;
TreeNode : TTreeNode;
p_id : string;
begin
inherited;
q_tree_nodes:= TAdoQuery.create(self);
try
q_tree_nodes.Connection:=dm.main_con;
if Node = nil
then
p_id:="null"
Else
p_id:=Inttostr(integer(Node.Data));
q_tree_nodes.SQL.Text:="exec ap_division_tree @parent_id="+p_id;
q_tree_nodes.Open;
TreeView1.Items.BeginUpdate;
while not q_tree_nodes.Eof do
begin
TreeNode:=TreeView1.Items.AddChildObject(Node,q_tree_nodes.fieldByName("division_name").AsString,pointer(q_tree_nodes.fi eldByName("id").AsInteger));
TreeNode.ImageIndex:=0;
TreeNode.SelectedIndex:=1;
TreeNode:=TreeView1.Items.AddChildObject(TreeNode,"",nil);
q_tree_nodes.Next;
end;
TreeView1.Items.EndUpdate;
finally
q_tree_nodes.Free;
end;
end;

как только тип поля strind
РАботать отказывается.
1. все-таки почему?
пишу следующим образом
procedure Tfm_divisions_tree.AddLevel(Node: TTreeNode);
Var
q_tree_nodes: TAdoQuery;
TreeNode : TTreeNode;
p_id : string;
begin
inherited;
q_tree_nodes:= TAdoQuery.create(self);
try
q_tree_nodes.Connection:=dm.main_con;
if Node = nil
then
p_id:="null"
Else
p_id:=QuotedStr(copy(String(Node.Data),1,38))
q_tree_nodes.SQL.Clear;
q_tree_nodes.SQL.Text:="exec ap_division_tree null,"+p_id;
q_tree_nodes.Open;
TreeView1.Items.BeginUpdate;
while not q_tree_nodes.Eof do
begin
p_id:=q_tree_nodes.fieldByName("id_u").AsString;
TreeNode:=TreeView1.Items.AddChildObject(Node,q_tree_nodes.fieldByName("division_name").AsString,pointer(p_id));
TreeNode.ImageIndex:=0;
TreeNode.SelectedIndex:=1;
TreeNode:=TreeView1.Items.AddChildObject(TreeNode,"",nil);
q_tree_nodes.Next;
end;
TreeView1.Items.EndUpdate;
finally
q_tree_nodes.Free;
end;
end;

в первой ветке вместо ID оказывается название.
во второй - p_id = "{F4A7B6A1-C7B8-4FA0-9E0F-78DEAB95455 "#1""
что тоже не есть правильно

пробовал и как советовал Delirium © (30.12.03 10:44) [9] тоже не работает..


 
Delirium   (2004-01-02 12:12) [20]

Ошибка была в оператре @ (это я сглупил), не нужен он там, у нас получилось, что передаётся не указатель, а адрес самой переменной указателя, отсюда и бред в значении.

procedure FillTree(Tree:TTreeView; Query:TDataSet; idNode, idParent, cNodeName:String);
var i:integer;
PG:PString;
begin
// Корневой узел, должен быть первым в выборке Query
Query.First;
New(PG);
PG^:=Query.FieldByName(idNode).AsString;
Tree.Items.Clear;
Tree.Items.AddObject(nil,
Query.FieldByName(cNodeName).AsString,
PG);
Query.Next;
while not Query.Eof do
begin
i:=0;
while i<Tree.Items.Count do
begin
if PString(Tree.Items.Item[i].Data)^=Query.FieldByName(idParent).AsString
then begin
New(PG);
PG^:=Query.FieldByName(idNode).AsString;
Tree.Items.AddChildObject(Tree.Items.Item[i],
Query.FieldByName(cNodeName).AsString,
PG);
break;
end
else Inc(i);
end;
Query.Next;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FillTree(TreeView1, dxMemData1, "ID", "ParentID", "Name");
end;


 
paul_k   (2004-01-05 09:31) [21]

Спасибо большое.
заработало как надо...
да.. тяжко мне неучу... а ведь на 2-м курсе учили с указателями работать.. говорила мне бабушка, ходи на лекции...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.007 c
4-93735
Иван
2003-11-20 14:40
2004.01.29
Восстановление иконки в трее.


1-93430
DimonNew
2004-01-16 15:03
2004.01.29
Hint


3-93357
don
2003-12-30 11:32
2004.01.29
Возможно ли отключить создание лок-файла в Embedded Firebird


8-93591
ARTEMKA
2003-09-23 12:06
2004.01.29
Как написать свой MediaPlayer


14-93633
Курящий
2004-01-08 17:30
2004.01.29
Курящим





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский