![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Совсем запутался c uniqueidentifier.
paul_k © (2003-12-30 09:31:00)
Есть стандартная структура
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
Откуда это?
paul_k (2004-01-05 09:31:00) [1]
Спасибо большое.
заработало как надо...
да.. тяжко мне неучу... а ведь на 2-м курсе учили с указателями работать.. говорила мне бабушка, ходи на лекции...
Delirium (2004-01-02 12:12:00) [2]
Ошибка была в оператре @ (это я сглупил), не нужен он там, у нас получилось, что передаётся не указатель, а адрес самой переменной указателя, отсюда и бред в значении.
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 (2003-12-31 10:55:00) [3]
ну если тип поля 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]тоже не работает..
Johnmen (2003-12-31 10:17:00) [4]
И я попробовал...:)
Все работает. Как в [6].
paul_k (2003-12-31 10:08:00) [5]
пробовал...
paul_k © (30.12.03 09:58) [4]
Johnmen (2003-12-31 10:05:00) [6]
Пардон. Там у тебя pstring....
На него лучше не заморачиваться, запутаешься.
Попробуй просто string.
paul_k (2003-12-31 09:48:00) [7]
> Навскидку, вот здесь ошибка
а в чем она?
Johnmen (2003-12-31 09:45:00) [8]
Навскидку, вот здесь ошибка
AddChildObject(Node,q_tree_nodes.fieldByName("division_name").AsString,pg);
paul_k (2003-12-31 09:34:00) [9]
С наступающим Вас
бред продолжается. написал как указано в
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
Delirium (2003-12-30 10:52:00) [10]
> paul_k © (30.12.03 10:47) [10]
Достаточто просто PG^ указатель ведь типизированный
Desdechado (2003-12-30 10:51:00) [11]
numeric(18) в разрядность integer действительно не влазит да и преобразование зависит от используемых компонентов...
paul_k (2003-12-30 10:47:00) [12]
Спасибо а как в обратном порядке?
то есть как прочесть строку с указателя PG?
String(PG^)?
Delirium (2003-12-30 10:44:00) [13]
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:36:00) [14]
2Johnmen
String(PChar(Node.Data))= "h"#1
2Desdechado
И рад бы последовать Вашему совету, но размера Integer мне явно не хватит. А поле numeric(18,0) в виде q_tree_nodes.fieldByName("id").AsInteger тоже бред выдает
Desdechado (2003-12-30 10:19:00) [15]
вообще-то для таких целей не строковые значения ID используют, поэтому
Pointer(q_tree_nodes.fieldByName("id").AsInteger)
Johnmen (2003-12-30 10:18:00) [16]
1. var p_id string;
2. Pointer(p_id);
3. String(PChar(Node.Data));
paul_k (2003-12-30 10:14:00) [17]
еще хуже.
валится с AV
paul_k (2003-12-30 09:58:00) [18]
то есть
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?
Johnmen (2003-12-30 09:50:00) [19]
Должен передаваться указатель на реально существующую переменную...
paul_k (2003-12-30 09:45:00) [20]
Об этом догадался.
А как лечить?