Форум: "Базы";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
ВнизГде в TreeView хранить "ключ"? Найти похожие ветки
← →
click (2006-11-27 11:17) [0]При помощи ADO в TreeView загружается из БД пятиуровневое дерево, вот фрагмент загрузки последнего, пятого уровня (Items[5]):
Query5.Close;
Query5.Parameters.Clear;
Query5.Parameters.AddParameter.Value:=Query1.Fields[0].Value;
Query5.Parameters.AddParameter.Value:=Query2.Fields[0].Value;
Query5.Parameters.AddParameter.Value:=Query3.Fields[0].Value;
Query5.Parameters.AddParameter.Value:=Query4.Fields[0].Value;
Query5.Open;
while not Query5.Eof do begin
if Query5.Fields[1].AsString="" then
KlientNode:=TreeView1.Items.AddChild(VidKlientNode, Query5.Fields[0].asString)
else
KlientNode:=TreeView1.Items.AddChild(VidKlientNode, Query5.Fields[1].asString);
/////////////// вот здесь
Query5.Next;
Здесь все в порядке - дерево загружается правильно.... Вот только одна проблема:
Дело в том что в этот самый пятый уровень (Level) дерева загружаются Ф.И.О. клиентов, которые находятся в таблице klien.dbf поле fio. Когда дерево полностью сформировано то пользователю необходимо предоставить возможность кликом по имени клиента просмотреть о нем доп. сведения (хранящиеся в этойже таблице). Но! При клике пользователя по фамилии клиента у меня нет никакой информации кроме fio (считанной с TReeView1.Selected.Text), а fio к сожалению поле не уникальное поэтому естественно следующий запрос возвращает мне первого клиента с таким fio и вовсе не обязательно того по которому был произведен клик.. (в случае если таких клиентов несколько)
Вопрос: В участке кода есть комментарий (////////// вот здесь) в этом месте я хотел бы каждой "ветке" TreeView в какое либо свойство, (что-то вроде Tag только с поддержкой string (так как уникальное поле kodklient записано в строковом виде)) записывать уникальный параметр данного клиента (kodklient).
Вообщем необходимо что-то вроде второго (только невидимого) свойства Text у каждой ветки TreeView. Возможно можно использовать Data может еще что нибудь..., вобщем где нибудь в ветке хранить "ключ" клиента не показывая его пользователю. Как?
← →
DrPass © (2006-11-27 11:20) [1]
> Возможно можно использовать Data может еще что нибудь...
> ,
Не только можно, но и нужно
← →
ЮЮ © (2006-11-27 11:33) [2]DrPass © (27.11.06 11:20) [1]
Главный вопрос в 4 проследних символах поста :)
TTreeNode.Data: Pointer;
Если "ключ" - integer, то Data хватит для его хранения, а для помещения извлечения использовать приведене типов
xxx.Data = Pointer(Query5.Fields[1].asInteger);
<int> := Integer(xxx.Data)
Если же размера Data не хватит для хранения "ключа", то выделить память для данных, заполнить их, а в Data запомнить указатель для дальнейшего доступа к той памяти
← →
Sam Stone © (2006-11-27 12:14) [3]Зачем изобретать велосипед? Использовать DBTreeView"шные компоненты (DevExpress, EhLib (других не знаю :))) религия не позволяет? Проблем было бы гораздо меньше, да и работать удобнее.
← →
click (2006-11-27 18:37) [4]
> ЮЮ © (27.11.06 11:33) [2]
Если "ключ" - integer, то...
Спасибо, но я в вопросе вроде указал что ключевое поле строковое...
Click [0]
> (что-то вроде Tag только с поддержкой string (так как уникальное
> поле kodklient записано в строковом виде))
> Sam Stone © (27.11.06 12:14) [3]
Да. Религия не позволяет.... к сожалению
З.Ы.
Уважаемые, если можно, кто нибудь дайте ссылку или пример работы с Data...
Справка не выручает :(
← →
clickmaker © (2006-11-27 18:52) [5]
> [4] click (27.11.06 18:37)
>
> > ЮЮ © (27.11.06 11:33) [2]
> Если "ключ" - integer, то...
>
> Спасибо, но я в вопросе вроде указал что ключевое поле строковое...
так в [2] же был ответ, что делать, если поле > 4 байт
← →
click (2006-11-28 00:11) [6]
> clickmaker © (27.11.06 18:52) [5]
</I
> ЮЮ © (27.11.06 11:33) [2]
Ребят, я отлично знаю что на этом сайте не любят когда просят готовый код, также я знаю с каким самозабвением здесь отсылают нажимать F1 до полного просветления, и знаю даже, с каким предвзятым уважением здесь относятся к Google....но, не смотря на все это я не постесняюсь спросить пример (в виде кода) работы с Data в TreeView, ибо справка и гугление так и не довели меня до просветления.... (а такие попытки были приняты неоднократно)
С уважением ко всем откликнувшимся, и с предупреждением об игнорировании ко всем желающим "пинать" (как здесь принято говорить).
← →
sniknik © (2006-11-28 01:19) [7]> также я знаю с каким самозабвением здесь отсылают нажимать F1 до полного просветления
и правильно!!!
> ...
забыл кстати, как тут плохо относятся к незарегистрированным...
неужели после поста
ЮЮ © (27.11.06 11:33) [2]
> ...
> TTreeNode.Data: Pointer;
трудно было встать в дельфях курсором на приведенное ххх.data и нажать F1, лучше Ctrl F1 чтобы сразу попасть в нужное, а там кликнуть на Example и получить полный пример, с описанием
The following code defines a record type of TMyRec and a record pointer type of PMyRec.
type
PMyRec = ^TMyRec;
TMyRec = record
FName: string;
LName: string;
end;
Assuming these types are used, the following code adds a node to TreeView1 as the last sibling of a specified node. A TMyRec record is associated with the added item. The FName and LName fields are obtained from edit boxes Edit1 and Edit2. The Index parameter is obtained from edit box Edit3. The item is added only if the Index is a valid value.
procedure TForm1.Button1Click(Sender: TObject);
var
MyRecPtr: PMyRec;
TreeViewIndex: LongInt;
begin
New(MyRecPtr);
MyRecPtr^.FName := Edit1.Text;
MyRecPtr^.LName := Edit2.Text;
TreeViewIndex := StrToInt(Edit3.Text);
with TreeView1 do
begin
if Items.Count = 0 then
Items.AddObject(nil, "Item" + IntToStr(TreeViewIndex), MyRecPtr)
else if (TreeViewIndex < Items.Count) and (TreeViewIndex >= 0) then
Items.AddObject(Items[TreeViewIndex], "Item" + IntToStr(TreeViewIndex), MyRecPtr);
end;
end;
After an item containing a TMyRec record has been added, the following code retrieves the FName and LName values associated with the item and displays the values in a label.
procedure TForm1.Button2Click(Sender: TObject);
begin
Label1.Caption := PMyRec(TreeView1.Selected.Data)^.FName + " " +
PMyRec(TreeView1.Selected.Data)^.LName;
end;
или так и будеш всегда ожидать пока тебе его оттуда скопируют? нда уж....
p.s. мало здесь "пинают", очень мало, надо бы побольше.
p.p.s. можеш конечно игнорировать... но это будет последний раз.
← →
click (2006-11-28 13:05) [8]
> sniknik © (28.11.06 01:19) [7]
не буду игорировать так как твой пост всеже содержал ответ...
Спасибо!
Вероятно ни туда я становился курсором... или может еще что, но клянусь - ИСКАЛ! в справке, но этого не нашел...иначе не спрашивал бы (я тут даже на днях выступал ЗА то что бы здесь звучали посты типа "F1" )
Но не нашел я, не нашел.... :(
Спасибо!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.088 c