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

Вниз

связать списки   Найти похожие ветки 

 
Nameziz   (2009-04-24 12:08) [0]

Помогите связать между собой два списка как один ко многим (одной записи списка 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;



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


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


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


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


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

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

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


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

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

TRecA = record
  IdA: Integer;
end;

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


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

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


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) [4]

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


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

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


 
sniknik ©   (2009-04-24 14:02) [6]

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


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


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


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


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


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


лаба


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

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

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

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); // Список подразделений


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


> Nameziz   (24.04.09 14:13) [8]


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


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

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


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

А задание ?


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

> Nameziz   (24.04.09 14:39) [11]

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

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


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

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


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


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


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


> А задание ?


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



Страницы: 1 вся ветка

Текущий архив: 2009.06.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
2-1240762612
Ramil
2009-04-26 20:16
2009.06.14
Фильтрация подстановочных полей


15-1239107518
Немо
2009-04-07 16:31
2009.06.14
Подскажите алгоритм


15-1238963824
GibiW
2009-04-06 00:37
2009.06.14
Сопряжение окружностей (помогите)


15-1239207553
Rolano
2009-04-08 20:19
2009.06.14
Вопрос по созданию в Delphi "Облочки для работы с DOS"


2-1240826671
TNT
2009-04-27 14:04
2009.06.14
Системное меню