![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TList
Павел © (2013-09-18 23:22:00)Допустим у меня есть класс TMyObject, и при создания новых объектов я их заношу в TList, вопрос как мне получить доступ к созданным объектам?)
пробовал типа
List[0].
List.Index[0].
ничего нет)
Просто мне нужно где то хранить объекты, кроме массива (в Тлист просто в плане, удалил строку, все сместилось вверх ну и прочая фигня удобна)
Может что то лучше есть ?
Павел (2013-09-20 16:44:00) [1]Всё! Абсолютно во всём разобрался, узнал что такое указатель
PDataGroup = ^TDataGroup;
и т.д.
больше вопросов нет
Павел (2013-09-20 01:14:00) [2]Мне нужно всё привести к требуемому типу, чтобы когда я пишу
ListGroup[0].
выпадал список свойств объекта
Германн (2013-09-19 22:01:00) [3]Зачем тебе и TNewGroup и TDataGroup. Оставь что-нибудь одно.
Павел (2013-09-19 21:04:00) [4]Вот попробовал добавить объект "Группа" имеющий имя.
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 10:43:00) [5]
> TNewGroup(ListGroup[Parametr]).Slot.Items[1].X
>
> но выдаёт оишбку, неизвестный идентификатор.
A Slot.Items[1] к требуемому типу пушкин приводить должен?
Ещё одну фонотеку методом копи-паста не прилагая мозга ваяют...
[ВладОшин] (2013-09-19 08:46:00) [6]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 03:21:00) [7]да уж, как то очень всё не удобно, ладно если как ты знаешь)
с (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 03:08:00) [8]Это на самом деле фича IDE. Если использовать вместо прямого приведения типа, приведение с проверкой, то список выпадает сразу после введения точки:
(ListGroup[0] as TNewGroup).
Германн (2013-09-19 02:47:00) [9]Как только введешь первые одну-две буквы свойства, список появится.
Германн (2013-09-19 02:45:00) [10]
> И что значит тишина?
Если "тишина" значит что после того как поставил точку после ввода TNewGroup(ListGroup[0])не выпал список со свойствами класса TNewGroup, то не обращай внимания. Это нормальное поведение IDE.
Павел (2013-09-19 02:43:00) [11]а сорри забыл
добавление
var Name:string;
begin
Name:=InputBox('Введите название группы', 'Название:','');
AddNewGroup.ListGroup.Add(TNewGroup.CreateGroup(Name));
end;
Тишина - значит не выпадает список, где я могу выбрать у TNewGroup процедуру AddSlot();
раньше был массив и было всё легко и просто Group[1].
но массив неудобен, да и надо развиваться и пробовать более лучшие решения для кода
Германн (2013-09-19 02:38:00) [12]
> и теперь пытаюсь обратиться к одному из них из списка ObjectList
> TNewGroup(ListGroup[0]).
> в ответ тишина...
И что значит тишина?
Германн (2013-09-19 02:31:00) [13]А где добавление чего-нибудь в ListGroup?
Павел (2013-09-19 02:14:00) [14]
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 01:59:00) [15]Код показывай.
Павел (2013-09-19 01:26:00) [16]Что то не получается:
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 00:55:00) [17]Спасибо!
DVM (2013-09-19 00:19:00) [18]
> Во-первых TList.Items[]
Items там дефолтное свойство, его можно не указывать
Германн (2013-09-19 00:17:00) [19]Во-первых TList.Items[]
Во-вторых кроме TList есть TObjectList. Иногда второй предпочтительней первого.
DVM (2013-09-19 00:17:00) [20]
> пробовал типа
> List[0].
TMyObject(List[0]).