Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Помогите портировать код из Builder`a в Delphi


Автор: -Сергей- 29.10.2013, 11:09
Всем Доброго дня!
вот собственно код:
Код

void PostProcessNode(_di_IXMLNode node, TTreeNode *tree_node)
{
    if(node)
    {
        if((bool)(node->GetAttribute("expanded")))
            tree_node->Expanded = true;
 
        tree_node = tree_node->getFirstChild();
        for(_di_IXMLNode xml_node = node->ChildNodes->First();
            xml_node && tree_node; xml_node = xml_node->NextSibling())
        {
            PostProcessNode(xml_node, tree_node);
            tree_node = tree_node->getNextSibling();
        }
    }
}

Мне непонятно только как на Delphi будет этот цикл:
Код

for(_di_IXMLNode xml_node = node->ChildNodes->First();
  xml_node && tree_node; xml_node = xml_node->NextSibling())

попробовал написать вот так:
Код

var 
xml_node: IXMLNode;
...
xml_node := node.ChildNodes.First;
while (xml_node and tree_node) do
begin
  PostProcessNode(xml_node, tree_node);
  tree_node = tree_node.getNextSibling();
  xml_node = xml_node.NextSibling());
end;

Но компилятор ругается на строку while: Operator not applicable to this operand type

Автор: Illusion Dolphin 29.10.2013, 11:30
Код

while (xml_node and tree_node) do

Поменять на
Код

while ((xml_node <> nil) and (tree_node <> nil)) do

Автор: БелАмор 29.10.2013, 11:48
Небольшое пояснение:
В C/C++ в качестве логического выражения может использоваться что угодно. Любое ненулевое значение трактуется как логическая единица, 0 - False. В Delphi такие вольности не предусмотрены, поэтому требуется явное сравнение.

Автор: -Сергей- 7.11.2013, 05:55
А вот эту строку как реализовать?
Код

pt = ((NM_LISTVIEW*) ((LPNMHDR)lParam))->ptAction;

Автор: MetalFan 7.11.2013, 17:21
pt := PNM_LISTVIEW(LPNMHDR(lParam)).ptAction;

но надо знать, что за типы используются

Автор: -Сергей- 8.11.2013, 04:51
Цитата(MetalFan @ 7.11.2013,  21:21)
pt := PNM_LISTVIEW(LPNMHDR(lParam)).ptAction;

но надо знать, что за типы используются

pt: TPoint;
NM_LISTVIEW: TNMListView;

я так пробовал, только в Delphi не LPNMHDR, а TNMHdr. И не получается. Missing operator or semicolon
Пробовал и так pt := (NM_LISTVIEW as TNMHdr(lParam)).ptAction; тоже не выходит : Invalid typecast

Автор: Illusion Dolphin 8.11.2013, 08:59
А так?
Код

pt := TNMListView(lParam).ptAction;

Автор: -Сергей- 11.11.2013, 04:31
Цитата(Illusion Dolphin @ 8.11.2013,  12:59)
А так?
Код

pt := TNMListView(lParam).ptAction;

И так Invalid typecast
Только так сработало:
Код

pt := PNMListView(PNMHDR(lParam))^.ptAction;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)