![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
связать списки
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;