Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать чтобы функция возвращала массив


Страницы:   1 2

HRustBB ©   (2009-10-30 16:00:00) 

Пишу так:


function getChildNodesByName(nname:string): array of TXMLNode;

выдает ошибочку:
[Error] XMLWork.pas(31): Identifier expected but 'ARRAY' found


Polkin   (2009-10-30 17:33:00) [1]


> HRustBB   (30.10.09 17:26) [22]

Благодари Медвежонка Пятачка. Мой запутанный вечерне-пятничный мозг не смог бы догадаться об   "упреждающее объявление класса". =)


Медвежонок Пятачок   (2009-10-30 17:30:00) [2]

нужно другое. это не нужно.
:)


HRustBB   (2009-10-30 17:26:00) [3]

Polkin Спасибо большое, который раз уже на этом форуме нахожу то что нужно, а главное быстро ))


Polkin   (2009-10-30 17:13:00) [4]


> HRustBB   (30.10.09 17:10) [19]

см. пост выше.

Там написано

TXMLNode = class;
Это говорит компилятору о том что такой класс будет описани где-то ниже.
Это нужно для того чтобы это TXMLNodeArray = array of TXMLNode;нормально обработалось.

А потом

TXMLNode = class(TObject)
...
end;


мы уже описываем сам класс.


Медвежонок Пятачок   (2009-10-30 17:12:00) [5]

строка 3 в [17]


HRustBB   (2009-10-30 17:10:00) [6]


> заморочка называется "упреждающее объявление класса"


А можно поподробней, если можно


Polkin   (2009-10-30 17:09:00) [7]

Полностью и окончательно:

type
TXMLNode = class;
TXMLNodeArray = array of TXMLNode;

TXMLNode = class(TObject)
name:string;
atributes: array of TAtributes;
text:WideString;
ChildNodes: array of TXMLNode;
private
  { Private declarations }
public
constructor create(nodename:string);
procedure addatribute(name, value:string);
procedure addtext(mytext:WideString);
procedure addchildnode(Node:TXMLNode);
function getChildNode(index:integer):TXMLNode;
function getChildNodesByName(nname:string): TXMLNodeArray;
function getText():WideString;
function getAtribute(name:string):String;
function getName():String;
end;


Polkin   (2009-10-30 17:07:00) [8]

Тьфу ты блин, а я пытался как то обяъвить заранее TMyClassArray вместо TMyClass.....пятница блин, устал =)

А должно быть так:


 tmyclass = class;
 TMyClassArray = array of TMyClass;

 TMyClass = class
    function UUU : TMyClassArray;
  end;


Медвежонок Пятачок   (2009-10-30 17:05:00) [9]

брррр......... заморочка %) С таким никогда не сталкивался.

заморочка называется "упреждающее объявление класса"


Polkin   (2009-10-30 16:53:00) [10]

Вот у него  в чем дело:

В теории примерно так должно быть

 TMyClass = class
   function UUU : TMyClassArray;
 end;

 TMyClassArray = array of TMyClass;


тут копмилятор скажет, что не знает что такое TMyClassArray;

А ежели же перенести описание TMyClassArrayвыше чем описание класса, тогда компилятор скажет что низнает что такое TMyClass;

брррр......... заморочка %) С таким никогда не сталкивался.


Anatoly Podgoretsky   (2009-10-30 16:50:00) [11]


>  function getChildNodesByName(nname:string): array of TXMLNode;
> // ошииибка!!!

И чем же она сложнее, когда она один в один с начальной, ни буквы не изменилось.

> function getChildNodesByName(nname:string): array of TXMLNode;


Polkin   (2009-10-30 16:47:00) [12]

Аааааа.........вкурил - в этой ф-ции проблема - она должна возврщать тип массив эл-тов своего класса =)
function getChildNodesByName(nname:string): array of TXMLNode;

Сейчас придумаем =)


Сергей М.   (2009-10-30 16:45:00) [13]


> тут ситуация посложней


И чем же она "посложней" ?


Polkin   (2009-10-30 16:45:00) [14]

Сорри,

вместо этого

function Upya4ka : TXMLNode;

так

function Upya4ka : TFuncRes;

=)


Polkin   (2009-10-30 16:44:00) [15]


> HRustBB   (30.10.09 16:41) [9]


type
TFuncRes = array of TXMLNode;
.......

function Upya4ka : TXMLNode;
var
 I : integer;
begin
 
 SetLength (Result, 10);
 For I := 0 to 9 do begin
   Result[I] := TXMLNode.Create ('Йа элемент №' + IntToStr (I + 1));
 end;
end;


HRustBB   (2009-10-30 16:41:00) [16]


> Polkin  


тут ситуация посложней, а именно:


type
TXMLNode = class(TObject)
 name:string;
 atributes: array of TAtributes;
 text:WideString;
 ChildNodes: array of TXMLNode;
private
   { Private declarations }
public
 constructor create(nodename:string);
 procedure addatribute(name, value:string);
 procedure addtext(mytext:WideString);
 procedure addchildnode(Node:TXMLNode);
 function getChildNode(index:integer):TXMLNode;
 function getChildNodesByName(nname:string): array of TXMLNode;// ошииибка!!!
 function getText():WideString;
 function getAtribute(name:string):String;
 function getName():String;
end;


Сергей М.   (2009-10-30 16:22:00) [17]


> Identifier expected but 'ARRAY' found


ARRAY - это не идентификатор
А компилятор в этом месте ожидает именно идентификатор (типа).


Polkin   (2009-10-30 16:21:00) [18]

Хотя в функции вместо переменной a можно было сразу Resultуказать =)


Polkin   (2009-10-30 16:20:00) [19]

Ф-ция возвращает массив:

...
type
 TFuncRes = array of byte;

...
 function Upya4ka : TFuncRes;

...
implementation
...

function Upya4ka;
var
 a : TFuncRes;
begin
 SetLength (a, 2);
 a[0] := 0;
 a[1] := 1;

 Result := a;
end;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
 ShowMessage (IntToStr (Upya4ka[1]));
end;
...
end.


HRustBB   (2009-10-30 16:18:00) [20]


> ужас какой. массифф.
> может просто возвращать IXMLNodeList?


что за  IXMLNodeList?


> [Error] XMLWork.pas(31):
>
> зачем все эти третьесторонние подпорки?
>
> uses msxml2_tlb;
>
> и вперед
>
> ilist := xdoc.selectnodes('/root/child/grand_child_name');
>


нужна именно "третесторонняя подпорка", видимо чтоб учеба медом не казалась )


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо