programm problem mit code



  • Hallo

    in dem Fall

    ChildControl = NULL;
    delete ChildControl;
    

    einfach weglassen. Das Löschen übernimmt die Application, weil du das mit

    new TControl(Application);
    

    so zugeordnet hast.
    Nur wenn das nicht der Fall ist, must du selber löschen.

    bis bald
    akari



  • gerd01 schrieb:

    steht sogar in der hilfe des bcb drin, dass man delete nur in verbindung mit einem try-catch konstrukt nehmen sollte!

    Den erste Satz in der Hilfe hast Du dabei aber offenbar überlesen. Wenn Du das so machst, dann wird das Objekt nur
    im Falle einer Exception freigegeben. Außerdem wird die Exception unterdrückt - Du merkst außen gar nicht, dass eine
    Exception aufgetreten ist. Um sicherzugehen könntest Du anstatt catch __finally verwenden.

    gerd01 schrieb:

    ich erstelle nur neue objekte durch übergebene owner, also brauche ich es eigentlich nicht löschen!?

    Sehe ich genauso. Man kann solche Objekte zwar mit delete löschen, aber dann habe ich schon öfters gesehen,
    dass die Applikation beim Schließen Exceptions wirft oder ganz hängenbleibt. Bei nicht sichtbaren Komponenente
    (z.B. TQuery) kann man einfach als Owner 0 übergeben und dann das Objekt später selbst löschen. Gerade bei
    Datenbank-Komponenten bleiben sonst Ressourcen belegt und u.U. sogar irgendwelche Datenbank-Locks.

    gerd01 schrieb:

    und was nun?

    Ich möchte die Frage mal umformulieren: Was beabsichtigst Du mit Deinem Code und wieviel davon hast Du selbst
    überhaupt verstanden?

    gerd01 schrieb:

    TControl *ChildControl = new TControl(Application); // Wofür wird hier ein neues TControl-Objekt erstellt? Es wird nie angesprochen
    for(int i=0; i < this->ComponentCount; i++)
    {
        // sieht ganz gut aus
    }
    // Shape-Gedöns
    ChildControl = NULL;  // Wenn Du diese Zeile (wie in Deiner vorherigen Version) weglässt, was wird dann gelöscht?
    delete ChildControl;  // Was sollte hier gelöscht werden, wenn Du den Zeiger vorher auf NULL (=0) setzt?
    

    Gruß,

    Alexander

    Edit: Gute Überschrift übrigens 😉



  • hallo leute,

    @akari:
    ja, aber das hatte ich ja am anfang auch gelesen, und deshalb ja eigentlich weg gelassen, wurde jetzt nur drauf hingewiesen, dass man es einbauen sollte, aber warum stürzt mein proggie ab.

    ----------------

    @Alexander Kempf:

    a)
    ich wüsste nicht wo ich ihn überlesen haben sollte, weiter steht da nix, erscheint mir aber eigentlich auch logisch, dass man es nicht im catch machen kann, der wird ja nur aufgerufen, wenn try fehlschlägt.

    b)
    zu den nicht sichtbaren kompos kann ich nix sagen, aber danke für den tipp! 🙂

    c)
    beabsichtigung ist die markierung von formelementen ähnlich der IDE, meine drei Fragen am anfang des threads sollten aufschluss darüber liefern. da ich diese aber nunmal gestellt habe, habe ich mir ne eigene lösung versucht zu stricken, dabei entstand diese prog.

    TControl *ChildControl = new TControl(Application); // Wofür wird hier ein neues TControl-Objekt erstellt? Es wird nie angesprochen
    

    in der for-schleife, damit ich den namen des objektes bekomme.

    d)
    meinst du das mit der überschrift ironisch? 🙂

    kann es mal jemand bei sich testen, ob es dabei auch speicherprobs gibt?
    das wäre lieb.

    zudem hatte ich noch zwei weitere fragen, vielleicht kann da auch jemand was zu sagen?

    gruß gerd



  • gerd01 schrieb:

    a)
    ich wüsste nicht wo ich ihn überlesen haben sollte, weiter steht da nix

    BCB-Hilfe schrieb:

    Objekte, die Sie nicht mehr benötigen, sollten Sie löschen, damit der von diesen Objekten belegte Speicher freigegeben wird.

    gerd01 schrieb:

    TControl *ChildControl = new TControl(Application); // Wofür wird hier ein neues TControl-Objekt erstellt? Es wird nie angesprochen
    

    in der for-schleife, damit ich den namen des objektes bekomme.

    Die Frage bleibt bestehen. Die Betonung liegt auf "neues".

    gerd01 schrieb:

    zudem hatte ich noch zwei weitere fragen, vielleicht kann da auch jemand was zu sagen?

    Da gibt's ja die alte Faustregel: 1TpT-1TpT

    Auf die Schnelle würde ich vorschlagen, im Moment des Mausklicks festzustellen, welches Shape sich unter dem
    Mauszeiger befindet. Dann eine Komponente mit Handle (TPanel o.ä.) an diese Stelle schieben und das Shape
    darauf anzeigen (Parent auf Panel setzen). Dann kannst Du das Panel mit dem Shape verschieben und beim

    Loslassen alles wieder umgekehrt machen. Ich habe aber keine Ahnung, ob das so funktioniert.

    Gruß,

    Alexander



  • Hi,

    Eventuell lässt sich das was mit drag & dock machen, was das verschieben der komponenten angeht ... guck dir das doch mal an.

    Zitat:

    TControl *ChildControl = new TControl(Application); // Wofür wird hier ein neues TControl-Objekt erstellt? Es wird nie angesprochen
    

    in der for-schleife, damit ich den namen des objektes bekomme.

    if(Controls[i]->Visible)
          ListBox1->Items->Add(Controls[i]->Name);
    

    geht nich ?



  • @Alexander Kempf:
    ok, danke erstmal für den trick mit dem panel, damit bekomme ich endlich nen handle! 🙂

    zu:

    Die Frage bleibt bestehen. Die Betonung liegt auf "neues".

    anderen vorschlag?

    ---------------
    @prolog:

    nein, leider geht das bei mir nicht, deshalb der umweg über ein neues objekt!

    gruß gerd



  • gerd01 schrieb:

    anderen vorschlag?

    Was ist das Gegenteil von ein neues Objekt anlegen?

    gerd01 schrieb:

    nein, leider geht das bei mir nicht, deshalb der umweg über ein neues objekt!

    Glaube ich nicht.

    Gruß,

    Alexander



  • Alexander Kempf schrieb:

    gerd01 schrieb:

    anderen vorschlag?

    Was ist das Gegenteil von ein neues Objekt anlegen?

    gerd01 schrieb:

    nein, leider geht das bei mir nicht, deshalb der umweg über ein neues objekt!

    Glaube ich nicht.

    Gruß,

    Alexander

    nagut, es geht wohl doch, war zu voreilig, nur weil er die programmierhilfe nicht geöffnet hat, ging ich davon aus, es wäre nicht möglich, sorry.

    aber immer noch speicherfehler, da das my drin bleibt.

    zusatz:

    aber testet ihr es auch selber mal, vielleicht ist es ja ein allgemeines problem?

    gruß gerd



  • gerd01 schrieb:

    aber immer noch speicherfehler, da das my drin bleibt.

    Dann nimm's halt raus.

    Gruß,

    Alexander



  • und wie soll ich das umschreiben:

    ListBox2->Items->Clear();
            Caption=ListBox1->Items->Strings[ListBox1->ItemIndex] ;
            TControl *my = new TControl(Application);
            my = FindChildControl(ListBox1->Items->Strings[ListBox1->ItemIndex]);
            ListBox2->Items->Add(my->Name);
            Shape1->Left = my->Left - 5;
            Shape1->Top = my->Top - 5;
            Shape1->Width = my->Width + 10;
            Shape1->Height = my->Height + 10;
            Shape1->Visible = true;
    

    es ist ja auch nur eine vermutung, dass es jetzt vielleicht doch daran liegt!

    gruß gerd



  • gerd01 schrieb:

    und wie soll ich das umschreiben:

    Du willst doch ein bestehendes Control finden? Warum erstellst Du denn dann zunächst eines?
    Schreib doch anstatt:

    TControl *my = new TControl(Application);
    my = FindChildControl(ListBox1->Items->Strings[ListBox1->ItemIndex]);
    

    einfach:

    TControl *my = FindChildControl(ListBox1->Items->Strings[ListBox1->ItemIndex]);
    

    und lösche my dann auf keinen Fall, sonst löschst Du das gefunden Control und das wäre doch schade.

    gerd01 schrieb:

    es ist ja auch nur eine vermutung, dass es jetzt vielleicht doch daran liegt!

    Dann solltest Du Dir Gewissheit verschaffen.

    Gruß,

    Alexander

    Edit: Du solltest natürlich überprüfen, ob FindChildControl auch was vernünftiges zurückgibt.



  • oha, natürlich, einach den zeiger kopieren! 😞

    danke für den atritt

    ok, speicherproblem bleibt bestehen, hängt jetzt aber mit grünem pfeil in dieser zeile:

    ListBox2->Items->Add(my->Name);
    

    jetzt irgendwelche ideen?

    gruß gerd



  • Vielleicht ist FindChildControl() nicht das richtige. Versuch's mal mit FindComponent() und (wie vorher im Edit gesagt)
    prüfe, ob Du auch einen Wert zurückbekommst. Das könntest Du aber auch im Debugger sehen.

    Gruß,

    Alexander



  • danke, werde es probieren.

    zumindest bekomme ich mit findchildcontrol bei den labels nichts zurück!

    gruß gerd



  • aber da bekomme ich nicht die positionen heraus, da left und sowas erst ab TControl enthalten sind!

    gruß gerd



  • so, habe mal nen neues projekt gestartet, und siehe da, speicherfehler treten nur noch bei den labels auf, da bekomme ich irgendwie keine daten zurück über die findchildcontrol() funktion.

    ansonsten läuft es rund

    gruß gerd



  • gerd01 schrieb:

    aber da bekomme ich nicht die positionen heraus, da left und sowas erst ab TControl enthalten sind!

    TControl* ctrl = dynamic_cast<TControl*> (FindComponent("Tritratrulala")); // Oder statt TControl TLabel o.ä.
    if (ctrl != 0)
    {
       // Was immer Du willst
    }
    

    Gruß,

    Alexander



  • super das ein cast so auch funktioniert wusste ich noch nicht, danke. werde es mal versuchen.

    so nun noch eine antwort auf meine dritte frage:

    frage 3:
    wie man ja unschwer erkennt sollen die elemente der form „markiert” werden, um sie eventuell zu verschieben, ähnlich der IDE des bcb. gibt es grundsätzlich eine fertige api-funktionalität, die mir so etwas ermöglicht? (ich kann mir nicht vorstellen das das über objekte (siehe hier shape1) der form passiert!?) also exakt so wie beim bcb? (so wie auch zum beispiel bei einer verschiebenung eines toolbars)?

    wenn ja, könnte mir da jemand ein simples beispiel geben?

    gruß gerd



  • so, habe auch den speicherfehler aufgedeckt:

    wenn man die components durchläuft muss man einen abziehen, steht zumindest im beispielcode der hilfe, dann stürzt es auch nicht mehr ab. 🙂

    gruß gerd



  • Hallo,

    Ich habe mir nun mal nicht alle 3 Seiten durchgelesen und weiss jetzt nicht, ob es schon eine Lösung gibt, aber mir ist folgendes aufgefallen :

    Das geht so oder so nicht :
    Du kannst nicht Components durchzählen und Controls benutzen.
    Außerdem kann das new weg.
    [cpp]
    TControl *ChildControl = new TControl(Application);
    for(int i=0; i < this->ComponentCount; i++)
    {
    ChildControl = this->Controls[i];
    if(ChildControl->Visible)
    ListBox1->Items->Add(ChildControl->Name);
    }
    [/cpp]

    Wenn dann so :

    [cpp]
    TControl *ChildControl;
    for (int i=0; i < ControlCount; i++)
    {
    ChildControl = Controls[i];
    if (ChildControl->Visible)
    ListBox1->Items->Add(ChildControl->Name);
    }
    [/cpp]

    Bis dann denn,
    🙂
    Nash


Anmelden zum Antworten