Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

связать списки


Nameziz ©   (2009-04-24 12:08:00) 

Помогите связать между собой два списка как один ко многим (одной записи списка A может соответствовать несколько записей списка B), никак не могу разобраться, для меня как начинающего не совсем ясен принцип как такое сделать. Использовать СУБД не разрешено.


TRecA = record
   IdA: Integer;
   IdB: Integer;
 end;
 PRecA = ^TRecA;

 TRecB = record
   IdB: Integer;
   Name: string[255];
 end;
 PRecB = ^TRecB;

 TlistA = class(TList)
 private
   function Get(Index: Integer): TRecA;
 public
   function Add(AIdA, AIdB: Integer): Integer;
   procedure Notify(Ptr: Pointer; Action: TListNotification); override;
   { properties }
   property Items[Index: Integer] : TRecA read Get; default;
 end;

 TListB = class(TList)
 private
   function Get(Index: Integer): TRecB;
 public
   function Add(AIdB: Integer; AName: string): Integer;
   procedure Notify(Ptr: Pointer; Action: TlistNotification); override;
   { properties }
   property Item[Index: Integer]: TRecB read Get; default;
 end;


Nameziz   (2009-04-24 14:51:00) [1]


> Тогда делайте через структуры и указатели, как и планировали.


Значит вариант который я приводил правильный?


> А задание ?


Полного текста задания на руках сейчас нет.


Сергей М.   (2009-04-24 14:48:00) [2]

Подозреваю, что для сдачи лабы достаточно шлепнуть на форму TreeView


Юрий Зотов   (2009-04-24 14:42:00) [3]

> Nameziz   (24.04.09 14:39) [11]

> предмет Структуры и организация данных в ЭВМ

Тогда делайте через структуры и указатели, как и планировали.


Сергей М.   (2009-04-24 14:40:00) [4]

А задание ?


Nameziz   (2009-04-24 14:39:00) [5]

предмет Структуры и организация данных в ЭВМ


Сергей М.   (2009-04-24 14:34:00) [6]


> Nameziz   (24.04.09 14:13) [8]


А можно полюбопытствовать о теме преподаваемого предмета, по которому требуется выполнить эту лабу, и о дословном тексте задания на лабу ?


Юрий Зотов   (2009-04-24 14:27:00) [7]

Можно сделать проще и "красивее": подразделение САМО включает в себя список своих сотрудников.

Что-то вроде этого:

type
 TEmployee = class; // Опережающее объявление.

TDepartment = class (TObjectList)  // Список объектов TEmployee
private
 FName: string; // Наименование подразделения
 FNumber: cardinal; // Номер подразделения
 ... // Еще что-то
 FParent: TDepartment; // Дает возможность иметь дочерние подразделения
public
 ...
end;

TEmployee = class
private
 FFirstName: string; // Имя
 FLastName: string;  // Фамилия
 FPatronymic: string; // Отчество
 FBurnDate: TDate; // Дата рождения
 FSex: boolean; // Пол
 ... // Еще что-то
 FDepartment: TDepartment; // Отдел, в котором работает сотрудник
public
 ...
end;

TDepartments = class(TObjectList); // Список подразделений


Nameziz   (2009-04-24 14:13:00) [8]


> Это что, лаба ? Курсовая ?


лаба


Сергей М.   (2009-04-24 14:08:00) [9]


> субд использовать не разрешили


Это что, лаба ? Курсовая ?


sniknik   (2009-04-24 14:02:00) [10]

> субд использовать не разрешили.
бред конечно, но это твои "тараканы". но почему не использовать компоненты обработки данных, от них, но без субд? мастер-детайл делается и на оторванных от баз рекордсетах, чисто локально.


Nameziz   (2009-04-24 13:44:00) [11]

Задача такая: имеется таблица отделов и таблица сотрудников. К каждому отделу относится от одного до нескольких сотрудников. Таблицы нужно представить ввиде списков, субд использовать не разрешили.


Nameziz   (2009-04-24 13:38:00) [12]

Спасибо за советы, переделал... Посмотрите теперь все правильно? Связь между списками организовал через свойство.


type
 TRecA = record
   IdA: Integer;
   NameA: string[255];
 end;
 PRecA = ^TRecA;

 TRecB = record
   ParentId: Integer; // IdA
   NameB: string[255];
 end;
 PRecB = ^TRecB;

 TlistB = class;

 TlistA = class(TList)
 private
   function Get(Index: Integer): TRecA;
 public
   function Add(AIdA: Integer; ANameA: string): Integer;
   procedure Notify(Ptr: Pointer; Action: TListNotification); override;
   { properties }
   property Items[Index: Integer] : TRecA read Get; default;
 end;

 TListB = class(TList)
 private
   FListA: TListA;
   function Get(Index: Integer): TRecB;
 public
   function Add(AParentId: Integer; ANameB: string): Integer;
   procedure Notify(Ptr: Pointer; Action: TlistNotification); override;
   function NameAFromNameB(Name: string): string;
   { properties }
   property ListASource: TlistA read FlistA write FlistA;
   property Items[Index: Integer]: TRecB read Get; default;
 end;


MBo   (2009-04-24 13:38:00) [13]

А какая цель преследуется? От этого может зависеть решение.


Юрий Зотов   (2009-04-24 13:20:00) [14]

Проще говоря, раз " одной записи списка A может соответствовать несколько записей списка B", то делать надо наоборот:

TRecA = record
  IdA: Integer;
end;

TRecB = record
 IdB: Integer;
 IdA: Integer;  // Вот оно!
end;


Сергей М.   (2009-04-24 12:15:00) [15]


> Использовать СУБД не разрешено


Кем, Кораном ?)


> не совсем ясен принцип


Каждый эл-т подчиненного списка (B) обязан иметь поле-ссылку на эл-т ведущего списка (A)

А у тебя с ног на голову это поставлено :

TRecA = record //элемент ведущего списка
  IdA: Integer;
  IdB: Integer; //<- почему-то ссылается на непонятно какой элемент подчиненного
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо