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

Вниз

TList   Найти похожие ветки 

 
Павел   (2013-09-18 23:22) [0]

Допустим у меня есть класс TMyObject, и при создания новых объектов я их заношу в TList, вопрос как мне получить доступ к созданным объектам?)
пробовал типа
List[0].
List.Index[0].
ничего нет)
Просто мне нужно где то хранить объекты, кроме массива (в Тлист просто в плане, удалил строку, все сместилось вверх ну и прочая фигня удобна)
Может что то лучше есть ?


 
Германн ©   (2013-09-19 00:17) [1]

Во-первых TList.Items[]
Во-вторых кроме TList есть TObjectList. Иногда второй предпочтительней первого.


 
DVM ©   (2013-09-19 00:17) [2]


> пробовал типа
> List[0].

TMyObject(List[0]).


 
DVM ©   (2013-09-19 00:19) [3]


> Во-первых TList.Items[]

Items там дефолтное свойство, его можно не указывать


 
Павел   (2013-09-19 00:55) [4]

Спасибо!


 
Павел   (2013-09-19 01:26) [5]

Что то не получается:


TNewGroup = class
    Name: string;
    Slot:TList;

    procedure AddSlot(NewSlot:TSlot);

    constructor CreateGroup(NewName:string);
  end;

 ListGroup: TObjectList;

Добавляю новые объекты
ListGroup.Add(TNewGroup.CreateGroup(Name));
и теперь пытаюсь обратиться к одному из них из списка ObjectList
 TNewGroup(ListGroup[0]).
в ответ тишина...


 
Германн ©   (2013-09-19 01:59) [6]

Код показывай.


 
Павел   (2013-09-19 02:14) [7]


unit AddNewGroup;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, Contnrs;

type
   TSlot = class
     X,Y,Width,Height: integer;
     constructor CreateSlot(NewX, NewY, NewWidth, NewHeight: integer);
   end;

  TNewGroup = class
    Name: string;
    Slot:TList;

    procedure AddSlot(NewSlot:TSlot);

    constructor CreateGroup(NewName:string);
  end;

 var
  GroupCount:integer=0;

  ListGroup: TObjectList;

implementation
    uses unit1;

{ TSlot }

constructor TSlot.CreateSlot(NewX, NewY, NewWidth, NewHeight: integer);
begin
X:=NewX;
Y:=NewY;
Width:=NewWidth;
Height:=NewHeight;
end;

{ TNewGroup }

procedure TNewGroup.AddSlot(NewSlot:TSlot);
begin
Slot.Add(NewSlot);
end;

constructor TNewGroup.CreateGroup(NewName: string);
begin
Name:=NewName;
Slot:=Tlist.Create;
end;

end.

и в главной юните

...
implementation
 uses AddNewGroup;
...
TNewGroup(ListGroup[0]).


 
Германн ©   (2013-09-19 02:31) [8]

А где добавление чего-нибудь в ListGroup?


 
Германн ©   (2013-09-19 02:38) [9]


> и теперь пытаюсь обратиться к одному из них из списка ObjectList
>  TNewGroup(ListGroup[0]).
> в ответ тишина...

И что значит тишина?


 
Павел   (2013-09-19 02:43) [10]

а сорри забыл
добавление

var Name:string;
begin
Name:=InputBox("Введите название группы", "Название:","");
AddNewGroup.ListGroup.Add(TNewGroup.CreateGroup(Name));
end;


Тишина - значит не выпадает список, где я могу выбрать у TNewGroup процедуру AddSlot();
раньше был массив и было всё легко и просто Group[1].
но массив неудобен, да и надо развиваться и пробовать более лучшие решения для кода


 
Германн ©   (2013-09-19 02:45) [11]


> И что значит тишина?

Если "тишина" значит что после того как поставил точку после ввода TNewGroup(ListGroup[0]) не выпал список со свойствами класса TNewGroup, то не обращай внимания. Это нормальное поведение IDE.


 
Германн ©   (2013-09-19 02:47) [12]

Как только введешь первые одну-две буквы свойства, список появится.


 
Германн ©   (2013-09-19 03:08) [13]

Это на самом деле фича IDE. Если использовать вместо прямого приведения типа, приведение с проверкой, то список выпадает сразу после введения точки:
(ListGroup[0] as TNewGroup).


 
Павел   (2013-09-19 03:21) [14]

да уж, как то очень всё не удобно, ладно если как ты знаешь)
с (ListGroup[0] as TNewGroup) всё работает
большое спасибо за помощь! так бы вернулся обратно к массиву

ещё одна проблема осталась (я уже тупо сообразить не могу). Код тот же самый, только где идёт описание класса TNewGroup я заменил переменную Slot с TList на TObjectList;

  TNewGroup = class
    Name: string;
    Slot:TObjectList;

    procedure AddSlot(NewSlot:TSlot);

    constructor CreateGroup(NewName:string);
  end;

И теперь не знаю как получить доступ допустим к переменной Х из объекта в списке  Slot
На всякий случай код добавления слота

TNewGroup(ListGroup[0]).AddSlot(AddNewGroup.TSlot.CreateSlot(strtoint(eX.Text),s trtoint(eY.Text),strtoint(eWidth.Text),strtoint(eHeight.Text)

ну и я пытаюсь как то так

TNewGroup(ListGroup[Parametr]).Slot.Items[1].X

но выдаёт оишбку, неизвестный идентификатор.


 
[ВладОшин] ©   (2013-09-19 08:46) [15]

LRule: TList;

 PRule = ^TRule;
 TRule = record
   RType: string;
..
 end;

function TErrManager.CreateRule(sTyp, sErr: string): PRule;
var
 NewRule: PRule;
begin
 New(NewRule);
 NewRule.RType := sTyp;
 NewRule.RText := sErr;
 LRule.Add(NewRule);
 Result := NewRule;
end;

function TErrManager.FindRule(sTyp, sErr: string): PRule;
var
 i: Integer;
 LocR: PRule;
begin
 Result := nil;
 for i := 0 to LRule.Count - 1 do
 begin
   LocR := LRule.Items[i];
   if (LocR.RType = sTyp) and  (LocR.RText = sErr) then
   begin
     Result := LocR;
     Exit;
   end;
 end;
end;


 
Плохиш ©   (2013-09-19 10:43) [16]


> TNewGroup(ListGroup[Parametr]).Slot.Items[1].X
>
> но выдаёт оишбку, неизвестный идентификатор.

A Slot.Items[1] к требуемому типу пушкин приводить должен?
Ещё одну фонотеку методом копи-паста не прилагая мозга ваяют...


 
Павел   (2013-09-19 21:04) [17]

Вот попробовал добавить объект "Группа" имеющий имя.

unit Unit3;

interface

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

type
 TForm3 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

//Тип описывающий элемент списка
 PDataGroup = ^TDataGroup;
  TDataGroup = record
      Name: String;
  end;

  TNewGroup = class
   DG:PDataGroup;
   constructor Create(NewName: string);
  end;

var
 Form3: TForm3;

 ListGroup:Tlist;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var NewGroup:TNewGroup;
        PDG:PDataGroup;
begin
NewGroup:=TNewGroup.Create("Group1");
ListGroup:=Tlist.Create;
New(PDG);
{тут что то должно быть}

ListGroup.Add(NewGroup);
end;

{ TNewGroup }

constructor TNewGroup.Create(NewName: string);
begin
DG.Name:=NewName;
end;

end.



 
Германн ©   (2013-09-19 22:01) [18]

Зачем тебе и TNewGroup и TDataGroup. Оставь что-нибудь одно.


 
Павел   (2013-09-20 01:14) [19]

Мне нужно всё привести к требуемому типу, чтобы когда я пишу
ListGroup[0].
выпадал список свойств объекта


 
Павел   (2013-09-20 16:44) [20]

Всё! Абсолютно во всём разобрался, узнал что такое указатель
PDataGroup = ^TDataGroup;
и т.д.
больше вопросов нет



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

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

Наверх




Память: 0.52 MB
Время: 0.007 c
3-1300095610
Бинар
2011-03-14 12:40
2014.08.03
Прерывание запроса


15-1387350030
Пит
2013-12-18 11:00
2014.08.03
Ветка Розыча о задачке?


2-1379581711
Вася
2013-09-19 13:08
2014.08.03
получить по имени переменной ее значение


2-1379334790
_guest_
2013-09-16 16:33
2014.08.03
Сохранение StringList большого объема в файл


15-1389385804
Юрий
2014-01-11 00:30
2014.08.03
С днем рождения ! 11 января 2014 суббота