Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2009, 11:03   #1
NieL
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 116
По умолчанию связать списки

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

Например :

Код:
  TRecA = record
    IdA: Integer;
    IdB: Integer;
  end;
  PRecA = ^TRecA;

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

  TlistA = class(TList)
  public
    function Add(AIdA, AIdB: Integer): Integer;
    function Get(Index: Integer): TRecA;
  end;

  TListB = class(TList)
  public
    function Add(AIdB: Integer; AName: string): Integer;
    function Get(Index: Integer): TRecB;
  end;
NieL вне форума Ответить с цитированием
Старый 24.04.2009, 11:46   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Конечно можно.
Просто нужно в цикле проходить по дочернему списку и выбирать соответствующие элементы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.04.2009, 11:58   #3
NieL
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 116
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Конечно можно.
Просто нужно в цикле проходить по дочернему списку и выбирать соответствующие элементы.
Можете набросать пример...?, Не совсем понятен принцип связи.
NieL вне форума Ответить с цитированием
Старый 24.04.2009, 12:06   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Для начала покажи мне как ты список набиваешь.
Как вводиш в него элементы.
Ато пока твои принципы не очень ясны.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.04.2009, 12:38   #5
NieL
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 116
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Для начала покажи мне как ты список набиваешь.
Как вводиш в него элементы.
Вот:

Код:
unit Unit17;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GR32_Image;

type
  TRecA = record
    IdA: Integer; // Id отдела
  end;
  PRecA = ^TRecA;

  TRecB = record
    IdA: Integer; // id отдела
    Name: string[255]; // FIO сотрудника
  end;
  PRecB = ^TRecB;

  TlistA = class(TList) // таблица отделы
  private
    function Get(Index: Integer): TRecA;
  public
    function Add(AIdA: Integer): 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(AIdA: Integer; AName: string): Integer;
    procedure Notify(Ptr: Pointer; Action: TlistNotification); override;
    { properties }
    property Item[Index: Integer]: TRecB read Get; default;
  end;

  Tfrm_ = class(TForm)
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    lA: TListA;
    lB: TListB;
  public
    { Public declarations }
  end;

var
  frm_: Tfrm_;

implementation

{$R *.dfm}

{ TlistA }

function TlistA.Add(AIdA: Integer): Integer;
var
  P: PRecA;
begin
  GetMem(P, SizeOf(PRecA));
  P^.IdA := AIdA;
  try
    Result := inherited Add(P);
  except
    FreeMem(P);
    raise;
  end;
end;

function TlistA.Get(Index: Integer): TRecA;
begin
  Result := PRecA(inherited Get(Index))^;
end;

procedure TlistA.Notify(Ptr: Pointer; Action: TListNotification);
begin
  inherited;
  if Action in [lnExtracted, lnDeleted] then
    FreeMem(PRecA(Ptr));
end;

{ TListB }

function TListB.Add(AIdA: Integer; AName: string): Integer;
var
  P: PRecB;
begin
  GetMem(P, SizeOf(TRecB));
  with P^ do
  begin
    IdA := AIdA;
    Name := AName;
  end;
  try
    Result := inherited Add(P);
  except
    FreeMem(P);
    raise;
  end;
end;

function TListB.Get(Index: Integer): TRecB;
begin
  Result := PRecB(inherited Get(Index))^;
end;

procedure TListB.Notify(Ptr: Pointer; Action: TlistNotification);
begin
  inherited;
  if Action in [lnExtracted, lnDeleted] then
    FreeMem(PRecB(Ptr));
end;

procedure Tfrm_.FormCreate(Sender: TObject);
begin
  lA := TlistA.Create; // список отделов
  with lA do
  begin
    Add(1);
    Add(2);
    Add(3);
    Add(4);
  end;

  lB := TlistB.Create; // список сотрудников
  with lB do
  begin
    Add(1, 'petrov');
    Add(1, 'sidorov');
    Add(2, 'ivanov');
  end;
end;

procedure Tfrm_.FormDestroy(Sender: TObject);
begin
  lA.Free;
  lB.Free;
end;

end.
NieL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
связать HTML с php Snake_ua PHP 25 09.09.2012 14:11
Связать TreeView с Panel Tagroth Компоненты Delphi 6 10.04.2009 23:46
Как связать C++ и Access? demon-189 Общие вопросы C/C++ 1 23.04.2008 19:49
DBChart как связать с БД ? Cantana Помощь студентам 2 02.02.2008 14:40