Dynamisch erzeugtes formular - Eintrag in der taskbar?



  • Hallo

    ja.

    bis bald
    akari



  • hallo akari leider muss ich nochmals stören 🕶

    kann es sein das für weitere komponenten die nicht BCB standard sind (z.B. die indy oder so) die auch auf der form sitzen von der eine instanz erzeugt wird, eine eigene aufräumarbeit vorgenommen werden muss? mir ist eben aufgefallen das sobald ich eine indy komponente auf der form habe, vonder eine instanz ins dynamische array geklatscht wird und am ende beim beenden der anwendung, in der schleife versucht wird alle instanzen zu zerstören, das ich dann eine zugriffsverletzung an der addresse FFFFFFA kriege.

    ich erzeuge normal die instanz und weise dann gleich der indy komponente werte zu. ist die indy komponente zwar auf der form, jedoch weise ich ihr keine werte zu, dann geht das zerstören fehlerfrei... 😮 😕



  • Hallo

    dann liegt es eher daran, das die Indy-Komponente noch etwas ausführen will.
    Um welche handelt es sich denn? Vielleicht must diese Komponente im Destruktor des Forms erstmal ausschalten?

    bis bald
    akari



  • um die TIdPOP3 jedoch ist diese nicht verbunden oder jegliches. nur werte wurden übergeben (userid, password etc.). any idea?



  • das DynamicArray habe ich in der haupt form (Main) klasse unter public deklariert da ich noch aus anderen formularen drauf zugreifen muss. liegt das irgendwie daran? wo sollte ich das dynamische array am besten deklarieren?



  • anscheinend liegt es tatsächlich dran da vorher die deklaration des dynamischen array ja in der haupt klasse vo TMain war und bei zerstörung dies konflikte gibt? jedenfalls habe ich das array nun in einem header global (ausserhalb der klasse jedoch)) deklariert. also genau im header von unit4 unten vor extern PACKAGE....

    ist das richtig so? jetzt muss ich aber schauen welchen header ich dann wo nicht mehr inkludieren muss weil beim linken sagt der compiler mir nun das dass array mehrfach definiert ist. dies liegt wohl eben daran das nun irgendwie mit der header einbindung konflikte entstehen... 🙄



  • hm so klappt das auch nicht.
    es müsste doch möglich sein das ganze richtig zu deklarieren ohne das ich zugriffsverletzungen bekomme? 😋



  • ich verzweifle gleich. habe glaube ich den fehler bezüglich der verletzung wenn der indy komponente etwas zugewiesen wurde, jedoch keine lösung.

    ich kann UserId, Password und Host zuweisen ohne das nach dem zerstören der instanzen etwas verletzt wird. Wenn ich aber noch Port von TIdPOP3 etwas zuweise, dann kommt diese schutzverletzung. Ist diese zeile auskommentiert und die anderen drei (user, pass, host) nicht, klappt es. die grosse frage ist nun WARUM? 😡

    das kanns doch echt nicht sein. ur weil Port ein typ int verlangt oder wie? hmmm.



  • hello 🙂 hab leider wieder ein problem. diesmal mit dem löschen einer position im DynamicArray. Das hinzufügen und somit auch das inkrementieren des array ist keine sache. Jedoch ist das löschen und somit ein dekrementieren ein problem da ich nebenbei von einer TListBox Count arbeite und das dann synchron stimmen muss. ich dachte eigentlich das dies so gehen müsste:

    ListBox1->Items->Delete(i);
        delete Window[i];
        Window.Length--; //dekrementieren damit die grösse wieder mit Count von TListBox stimmt
    

    nach ein-zweimal hinzufügen und löschen in/aus der listbox, krieg ich jedoch eine zugriffsverletzung. ich denke mal das liegt daran das ich nicht ohne weiteres das array dekrementieren und inkremetieren kann da es nicht wie TListBox Add() und Delete() funktioniert. Denke TListBox passt die Items (position) sowie Count von alleine dann an, was beim array mit inkrementieren und dekrementieren wohl nicht der fall ist. wie löse ich das korrekt?



  • Hallo

    wenn du ein Element aus einen DynamicArray löschen willst, Darfst du nicht einfach die letzte Stelle wegnehmen. Sondern du must zuerst den Inhalt aller auf dem zu löschendem Element folgenden Elemente um eins nach vorne kopieren. Erst dann darfst du das Array verkleinern.

    Wenn du std::vector<> nimmst, geht das viel einfacher, dort gibt es eine spezielle Methode dafür.

    bis bald
    akari



  • hallo wie genau geht das mit dem nach-vorne kopieren mit dem DynamicArray? es gibt Copy() aber verstehe nicht wie genau ich das nun verwenden soll.



  • ich muss ja jeweils immer die elemente nach vorne schieben die nach dem index kommen wo zuvor ein element und ein item aus der listbox geöscht wurde oder? z.B. hat die TListBox 20 items. die aray länge ist dann auch so. nun lösche ich aus der listbox das item mit der position 12. heisst also 0 bis 11 bleiben unverändert. müsste nun also das element mit dem index 12 aus dem array löschen und dann 13 bis 20 um eins nach vorne kopieren oder sehe ich das falsch?



  • Hallo

    im Grunde richtig.

    int DeleteIndex = 5; // Sechste Element soll gelöscht werden
    for (int CurIndex = DeleteIndex; CurIndex < Array.Length -1; ++CurIndex)
      Array[CurIndex] = Array[CurIndex +1];
    --Array.Length;
    

    bis bald
    akari



  • Du mußt (bei 20 items) die Elemente 13 bis 19 um eins nach vorne kopieren. z.Bsp. mit einer Schleife (Window[i] = Window[i+1]). Alternativ dazu könntest du auch mit CopyRange in ein temporäres Array kopieren und dann wieder zurückkopieren. Oder du nimmst, wie akari schon vorgeschlagen hat std::vector. Der hat eine Funktion namens erase die Positionen löscht und automatisch umkopiert.


Anmelden zum Antworten