Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.29;
Скачать: CL | DM;

Вниз

Совсем запутался 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
1-93519
A JI E LLI A
2004-01-18 18:50
2004.01.29
Проблема с использованием процедуры, помогите!


1-93517
Just newbie
2004-01-19 12:24
2004.01.29
Функция сравнение содержимого 2-х ListBox


3-93361
Vi0let
2003-12-30 14:15
2004.01.29
Как прокручивать TGrid колесом мыши?


1-93568
Mazer
2004-01-16 14:40
2004.01.29
Корректное отображение формы, вызванной из dll...


1-93481
Jel
2004-01-15 11:56
2004.01.29
IShellLink.GetIconLocation - почему не работает?