Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: TStringList и структуры данных. Есть проблема!  (Прочитано 9009 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Igel
Опытный

ru
Offline Offline
Пол: Мужской

« : 27-08-2003 10:18 » 

В общем так, работаю над одним проектиком. А поскольку в Дельфи как-то новичек пока, то ставят меня в тупик некоторые проблемы.

Значитца так: нужно вывести в ДЕРЕВЕ следующее:
Имя1
 - Игра1
 - Игра2
Имя 2
 - Игра2
 - Игра3
Имя 3
 - Игра1
 - Игра3
...
С этим понятно? И мне тоже. Как говорится "И ежу понятно".  Отлично
Но я же не хочу на этом остановиться? Мне нужно какое-то подобие автоматизации, да и выводить текст много ума не надо. В общем выражевывается следующая структура:
Дерево пользователей - содержит данные на онных.
Структунных пользователя:
Код:
TUserInfo=record
    Nik{TNikUser;
    IDUser{integer;
    Name, TwoName, Famil{string;
    email{string;
    Games{TGames;
   end;

И задумался, а как их забабахать в ДЕРЕВО-то? Были пагубные мысли, на счет индексов, но решил воспользоваться методом AddObject. И встал в тупик: Моя запис - это ведь не объект. И Дельфин говорит, низя. ЧТО ДЕЛАТЬ? А тут еще ведь не все, структура-то не совсем такая, точнее неполная. Есть еще уровни вложенности.

В общем пришел вот к чему, а дальше не знаю как. Может посоветуете?

Код:

//Список игр
  TGames=TstringList;
  //Статус игры
  TStatus=)stINGAME, stEXIT, stWait:;
  //stINGAME - в игре
  //stEXIT - завершена
  //stWait - в ожидании ответа

  //Параметры игры пользователя{
  TGameUser=record
    sName{string;//Имя игры
    iIDGame{integer;//Индекс игры
    ivStatus{TStatus;//статус текущей игры
  end;
  TNikUser=string[30(;
  TUserInfo=record
    Nik{TNikUser;
    IDUser{integer;
    Name, TwoName, Famil{string;
    email{string;
    Games{TGames;
  end;
  //Этот объект родился буквально сейчас, подразумевается, что он будет содержать все дерево пользователей с необходимыми методами и свойствами.
  TUsers = class)TObject:
    Users{TStringlist;
//вариант2 TUsers = class)TStringList: - а как дальше - ТУПИК??
    protected
      constructor create;
      Procedure AddUser)user{TUserInfo:;
      function  GetUser)Nik{TnikUser:{TUserInfo; overload;
      function  GetUser)IDUser{integer:{TUserInfo; overload;
    public
  end;
Записан

Ёжики, это не только ценные шкурки...
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 27-08-2003 10:50 » 

Я не совсем понял, что надо в чем проблема...
В обычных контролях Винды - все строки - это просто строки текста, в дереве, которое ты пытаешься создать тоже...

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

Держать данные в программе как - тебе решать, я делал .ini файлы в которых прописывал структуру дерева, а потом ее просто считывал и выводил на экран, структур и организацию деревьев в самой программе себе неделал, это организует контроль самостоятельно...

Если что непонятно могу выложить подробный код - правда на С++...
Записан

А птичку нашу прошу не обижать!!!
slava
Гость
« Ответ #2 : 27-08-2003 11:25 » 

От индексов или поонтеров все равно не спасешься.  Если тебе не хочень пользоваться деревья которые уже есть в Дельфе, определи свое. Определеись какого типа(класса) будет твой Node, а там уже и AddObject переопределишь.
И сложность структуры тебе должна не сильно интересовать.Улыбаюсь Спрашивай по-конкретнее, не писать же тебе трактаты на 100 страниц.Улыбаюсь
Записан
Igel
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 28-08-2003 02:33 » 

Ладно, сговорились, да? Поэтому конкретизирую:
Есть тип - запись(record - см. выше).
ВОПРОС: КАК МНЕ ОРГАНИЗОВАТЬ СПИСОК ДАННЫХ ТАКОГО ТИПА?[\b]
З.Ы. С деревом потом сам разберусь...
Записан

Ёжики, это не только ценные шкурки...
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #4 : 28-08-2003 09:33 » 

Попробуй создать .ini файл...

Или файлы.

Для работы со списками такого рода очень удобно...

Скажем пример списка гланого файла.

-----

[main node]
1=My main node

[Node lists]
1=Games
2=Rules
3=Users

[Games]
1=Doom2
2=Quake3
3=Homm4
5=CM4
6=Tarzan


// Тут надо пояснить, что я под Рулс имею ввиду имена файлов с сетингами для каждой игры. Т.е. те данные которые уже не относятся к дереву - можно и нужно держать отдельно...
Номера таких данных будут совпадать - и должны совпадать с номарами игр в списке выше
[Rules]
1=doom2.data
2=quake3.data
3=homm4.data
5=cm4.data
6=tarzan.data

Теперь смотри Ты можешь работать с ini файлами так же как с реджистри, используя почти теже функции - если надо приведу код..
Там можно делать цикл от 1 до .... который будет считывать по порядку все номера в списке .ini файла для считывания всех элементов дерева - вложенность не очень то ограниченна только размером файлов, вот собственно и все...
Выход из такого цикла по ненахождению записи с номером..
Например запрос в ключе Games номера 7 выдаст ошибку и список закончится...

Такой принцип позволит вставлять в контроль дерева попунктно все ноды начиная от главного и знать при клике на нод, какой файл прочитать для вывода информации (см список файлов)

Что непонятно обращайся...

ПЫСЫ - обязательное условие - номера должны идти попорядку и без пропусков 12346 не подходит 6 будет пропущена.
Записан

А птичку нашу прошу не обижать!!!
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #5 : 07-09-2003 08:19 » 

А по деревьям есть отличный пример в хелпе дельфи:
procedure TForm1.Button1Click(Sender: TObject);

var
  MyTreeNode1, MyTreeNode2: TTreeNode;
begin
  with TreeView1.Items do
  begin
    Clear; { remove any existing nodes }
    MyTreeNode1 := Add(nil, 'RootTreeNode1'); { Add a root node }
    { Add a child node to the node just added }
    AddChild(MyTreeNode1,'ChildNode1');

    {Add another root node}
    MyTreeNode2 := Add(MyTreeNode1, 'RootTreeNode2');
    {Give MyTreeNode2 to a child }
    AddChild(MyTreeNode2,'ChildNode2');

    {Change MyTreeNode2 to ChildNode2 }
    { and add a child node to it}
    MyTreeNode2 := TreeView1.Items[3];
    AddChild(MyTreeNode2,'ChildNode2a');

    {Add another child to ChildNode2, after ChildNode2a }
    Add(MyTreeNode2,'ChildNode2b');

    {add another root node}
    Add(MyTreeNode1, 'RootTreeNode3');
  end;

end;

Если использовать AddObject вмето AddChild то можа узать на объет или запись!
Вот пример из хелпа:
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)
    elseif (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;
Записан

Странно всё это....
Igel
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 08-09-2003 02:34 » 

Спасибо, и вам полезно и мне приятно. Улыбаюсь)
Почти сделал, правда через попу, но зато с родами, в смысле новые идеи по реализации родились. В этом, я так понял, и цель форума. Точного решения никто не предложит, а вот заставить подумать можно... Улыбаюсь)
Записан

Ёжики, это не только ценные шкурки...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines