Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





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


2-1240904224
Sowyer
2009-04-28 11:37
2009.06.14
Как зделать закладки в программе?


11-1197626410
chum
2007-12-14 13:00
2009.06.14
Проблема с KOLComObj


15-1239121494
theAddon
2009-04-07 20:24
2009.06.14
Помогите написать небольшую программку


15-1239027074
kaif
2009-04-06 18:11
2009.06.14
Землетрясение в Италии





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский