Форум: "Базы";
Текущий архив: 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