Klassen im VCL-Stil müssen mit dem Operator new erstellt werden



  • Nein, mein aktueller Code ist jetzt folgender, und alle Tipps halfen nichts, denn der Fehler ist an gleich und an der gleichen Stelle.

    PVirtualNode AddProjectStructure( TCustomVirtualStringTree AProjectTree,
                                      PVirtualNode ANode,
                                      TTreeData* ARecord )
    {
        PVirtualNode Result = AProjectTree.AddChild( ANode, NULL );
        void* GND = AProjectTree.GetNodeData( Result );
        PTreeData Data = reinterpret_cast<PTreeData>( GND );
        AProjectTree.ValidateNode( Result, false );
        Data->Caption = ARecord->Caption;
        return Result;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
        TTreeData* TreeData = new TTreeData( );
        ProjectTree->NodeDataSize = sizeof( TTreeData );
        ProjectTree->BeginUpdate( );
        TreeData->Caption = "Node-Nummer: 1";
        AddProjectStructure( ProjectTree, NULL, *TreeData );
        ProjectTree->EndUpdate( );
    }
    


  • dann solltest du aber auch, wie gesagt, beim aufruf von AddProjectStructure das * vor TreeData weglassen..
    also so:

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
        TTreeData* TreeData = new TTreeData( );
        ProjectTree->NodeDataSize = sizeof( TTreeData );
        ProjectTree->BeginUpdate( );
        TreeData->Caption = "Node-Nummer: 1";
        AddProjectStructure( ProjectTree, NULL, TreeData );
        ProjectTree->EndUpdate( );
    }
    


  • Das kann doch nicht wahr sein!

    Seit wann soll der übergebene Parameter kein Pointer haben, der erhaltene Parameter dann aber wieder ein Pointer? Laut dir wird ein TreeData übergeben, und ein *TreeData erwartet. So geht das also nicht. Egal wie ich TreeData mit Pointer oder ohne Pointer belege oder egal, welche Eurer Ideen ich nehme; JEDE HAT DEN SELBEN FEHLER AN DER SELBEN STELLE!

    @MAURO: Dann hilf doch bitte; du siehst, ich bin nicht mehr der einzige, der bei der ganzen Sache etwas missversteht. Lucksus kann genauso wenig helfen und junix' Aussagen von klammerlose Funktion konnte ich im Code nicht wiederfinden. Dein Tipp war ja, Mauro, dass der Fehler am Ende ist. Hilf nun bitte konkret!



  • *hüstel* ich meinte nur, daß man noch deleten muß am ende, hab den code gar net angeschaut ansonsten... sorry...



  • deleten hat nichts mit dem fehler zu tun *arrg* !

    Irgendwie komm ich mir ver*****t vor? Erst bin ich blöd ( "jeder fängt mal an") und dann kommen solche intelligeten Tipps, die garnix damit zu tun haben, und schließlich wisst Ihr's selbst nichtmehr!

    Frustrierend 😡 !



  • sorry, ich geb auch offen zu, daß ich deinen code net versteh.

    das mit dem "jeder fängt mal klein an" sollte net arrogant rüberkommen. ich dachte, daß der einzige fehler der war, daß new und eben auch delete fehlen und du vielleicht noch nicht viel erfahrung mit dem bcb hast (weil eben die vcl - klassen das benötigen).

    ich zieh mich jetzt aus dem posting zurück, hab keine gute figur gemacht...

    m.



  • Hinweis: Das Problem besteht nach wie vor.



  • Mach mal alles zu Pointern. Ich vermute insbesondere, dass der Fehler an der Rückgabe (PVirtualNode) der ersten Funktion liegt. Mach das mal zu PVirtualNode*.



  • Hallo Michael,

    soweit ich verstanden habe, möchtest Du die Data-Struktur des VT über die function 'AddProjectStructure' an Deine aktuelle Node hängen oder? *gggg* Gutes Tutorial oder, allerdings leider für Delphi. Ehrlich gesagt habe ich da auch lang rumgebastelt bis ich dann draufgekommen bin. Ändere mal in der Funktionsdeklaration

    PVirtualNode AddProjectStructure( TCustomVirtualStringTree AProjectTree,
                                      PVirtualNode ANode,
                                      TTreeData ARecord )
    

    die TCustomVirtualStringTree-Deklaration wie folgt ab

    [cpp] PVirtualNode AddProjectStructure( TCustomVirtualStringTree ***** AProjectTree,
    PVirtualNode ANode,
    TTreeData ARecord )[/ [/cpp]

    Danach sollte es gehen. In Deiner aktuellen Version der Funktion versucht BCB immer einen neuen VST zu erstellen und da nun mal VCL's nur mit new erstellt werden können, meckert er natürlich. Du willst aber bloß einen Pointer auf Deinen ProjectTree weitergeben, damit die Funktion damit arbeiten kann. 😃

    Hoffe ich konnte Dir helfen 🕶

    Udo



  • Ach, habe ich doch glatt noch vergessen: Und mach aus jedem AProjectTree. ein AProjectTree-> innerhalb der Routine.

    Tschau

    [ Dieser Beitrag wurde am 31.12.2002 um 01:46 Uhr von Darkheart editiert. ]


Anmelden zum Antworten