Announcement

Collapse
No announcement yet.

Probleme mit: Array[1..7] of array of timage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit: Array[1..7] of array of timage

    Du kannst natuerlich Problerme an ganz anderer Stelle in deinem Programm haben. Wenn du dort die Speicherverwaltung versaust, dann treten die Probleme irgendwann und irgendwo auf. Hier natuerlich besonders wenn du die Speicherverwaltung durch neue Bilder in Anspruch nimmst

  • #2
    Probleme mit: Array[1..7] of array of timage

    D5E, Win2K<br>
    Hallo Zusammen!!!<br>
    Folgendes Problem habe ich: Ich erzeuge in dem Array dynamisch mit SetLength und TImage.Create(self) Image-Felder um bestimmte Symbole zu bestimmten Ereignissen (variable Anzahl).<br> Das funktioniert auch soweit, nur wenn ich dann alle Images von aImages[1] freigebe und dann unter aImages[1] neue Erzeuge, dann kommen folgende Fehlermeldungen: Abstrakter Fehler bzw. EAccessViolation. Wir sitzen hier nunmit zwei Entwicklern und können den Fehler einfach nicht finden.<br>
    Wer hat eine Idee zu diesem Problem?<br>
    <br>
    Gruß,<br>
    Christian

    Comment


    • #3
      Hallo,<br>
      Wäre es möglich, den entsprechenden Quellcode hier zu posten? <br>
      Dann ist es mit Sicherheit einfacher, mögliche Fehler zu finden

      Comment


      • #4
        TImage.Create(Self) ist der Fehler. Self gibt die Form als Owner an. Damit ist die Form verantwortlich dafuer die Komponente freizugeben. Selber freigeben bringt die Form aus dem Tritt. TImage.Create(nil) ist der richtige Aufruf

        Comment


        • #5
          Uebrigens kann man mit SetLength auch mehrdimensionale Felder handhaben

          Comment


          • #6
            Hallo.<br>
            Erstmal den Quellcode zum Erezugen der Images:
            <br>
            <PRE>
            procedure BildErzeugen(i, j: Integer; bSondertermin: Boolean);
            begin
            if bSondertermin then
            begin
            SetLength(aSonderImages[i], Length(aSonderImages[i]) + 1);
            aSonderImages[i, Length(aSonderImages[i]) - 1] := TImage.Create(nil);

            with aSonderImages[i, Length(aSonderImages[i]) - 1] do
            begin
            Align := alNone;
            Parent := aSenkrechtePanels[i];
            Left := 1;
            Top := aZeitenPanels[i, j + 1].top;
            Width := 12;
            Height := 14;
            if (aBPQrys[i].getStrValue('bestattung_ausgefuehrt') <> 'T') then
            Picture := ImageSonderterminRot.Picture
            else
            Picture := ImageSonderterminBlau.Picture;
            OnDblClick := ImageDblClick;
            OnMouseDown := ImageMouseDown;
            OnMouseUp := ImageMouseUp;
            OnMouseMove := ImageMouseMove;
            Tag := aBPQrys[i].GetIntValue('id');
            PopUpMenu := PopUpMenuBelegteTermine;
            Hint := aBPQrys[i].GetStrValue('calcVerstorbener') + #13 + aBPQrys[i].GetStrValue('calcBestatter') + #13 +
            aBPQrys[i].GetStrValue('calcGrablage');
            ShowHint := true;
            Visible := true;
            end; {with aSonderImages[i, Length(aSonderImages[i]) - 1]}
            end {if bSondertermin}
            else
            begin
            SetLength(aDoppelImages[i], Length(aDoppelImages[i]) + 1);
            aDoppelImages[i, Length(aDoppelImages[i]) - 1] := TImage.Create(nil);

            with aDoppelImages[i, Length(aDoppelImages[i]) - 1] do
            begin
            Parent := aZeiten[i, j].Parent;
            Height := aZeiten[i, j].Parent.Height;
            Align := alRight;
            Width := 12;
            if (aBPQrys[i].getStrValue('bestattung_ausgefuehrt') <> 'T') then
            Picture := ImageDoppelterminRot.Picture
            else
            Picture := ImageDoppelterminBlau.Picture;
            OnDblClick := ImageDblClick;
            OnMouseDown := ImageMouseDown;
            OnMouseUp := ImageMouseUp;
            OnMouseMove := ImageMouseMove;
            Tag := aBPQrys[i].GetIntValue('id');
            PopUpMenu := PopUpMenuBelegteTermine;
            Hint := aBPQrys[i].GetStrValue('calcVerstorbener') + #13 + aBPQrys[i].GetStrValue('calcBestatter') + #13 +
            aBPQrys[i].GetStrValue('calcGrablage');
            ShowHint := true;
            Visible := true;
            end; {with aDoppelImages[i, Length(aDoppelImages[i]) - 1]}
            end {else}
            end;
            </PRE>
            <br>
            Nun der Quellcode zum verwerfen:
            <br>
            <PRE>
            for j := 0 to Length(aSonderImages[iSpalte]) - 1 do
            FreeAndNil(aSonderImages[iSpalte, j]);
            SetLength(aSonderImages[iSpalte], 0);

            for j := 0 to Length(aDoppelImages[iSpalte]) - 1 do
            FreeAndNil(aDoppelImages[iSpalte, j]);
            SetLength(aDoppelImages[iSpalte], 0);
            </PRE>
            <br>
            <br>
            @Robert:<br>
            TImage.Create(nil) brachte leider keinen Erfolg.<br>
            @all:<br>
            es muss quasi an den Images liegen, denn sobald ich die zeilen im Quelltext entferne, funktioniert es.
            <br>
            Gruß,<br>
            Christia

            Comment


            • #7
              Eine Bestattungsverwaltung. Cool!<br>
              Schalt mal die Bereichsueberpruefung an. Vielleicht verhedderst du dich mit deine Indices. "Top := aZeitenPanels[i, j + 1].top;" ist verdaechtig wegen des + 1

              Comment


              • #8
                Ein Abstract Error tritt auf wenn du ein Object mit abstract Methoden instanziierst und dann die abstract Methode aufrufst. Alternativ passiert es wenn ein Speicherbereich als Objekt angesprochen wird, aber keines ist (eist durch Bereichsueberschreitung)

                Comment


                • #9
                  Hallo Robert,
                  es ist keine reine Bestattungsverwaltung, sonder eine Friedhofsverwaltung.<br>
                  Wie schaltet man die Bereichsüberprüfung an?<br>
                  <br>
                  Gruß,<br>
                  Christia

                  Comment


                  • #10
                    Hallo,
                    habs gefunden (das mit der Bereichsüberprüfung). Im Moment bekomme nur die Fehlermeldung "EAccessViolation"

                    Comment


                    • #11
                      Hallo Christian,

                      in welcher Zeile tritt der Fehler denn genau auf?

                      bei

                      aSonderImages[i, Length(aSonderImages[i]) - 1] := TImage.Create(nil);

                      Gruß
                      Torste

                      Comment


                      • #12
                        Hallo Torsten.
                        Das ist ja mein Problem: eben in keiner Zeile. D.h. die Routinen werden alle durchlaufen, erst wenn er scheinbar alles abgearbeitet hat, dann erscheint die Fehlermeldung. Wenn ich die Fehlermeldung zur Seite schiebe, kann in der Programmoberfläche die erstellten Images sehen, nur wird nach Bestätigung der Fehlermeldung das Programm beendet. Ich kann also nicht sehen, wann die Fehlermeldung genau auftritt. Mein Kollege meint, dass das in den Windows-Routinen in der Windows.pas passiert, aber er kann auch nicht sagen wo genau. Könnte da evtl. das Speichermanagement von Windows Stress machen???
                        <br>
                        Erstmal ein Danke an alle, die sich bemühen mit mir den Fehler zu finden :-) !!!<br>
                        <br>
                        Gruß,<br>
                        Christia

                        Comment


                        • #13
                          Hallo Christian,

                          ich würde die Zuweisung der picture-Objekte mit "Assign" probieren.

                          Also z.B.

                          Picture.assign(ImageSonderterminRot.Picture)

                          Gruß Torste

                          Comment


                          • #14
                            Die Zuweisung an die Property Picture wird bereits intern mit Assign implementiert

                            Comment


                            • #15
                              Hallo Robert,

                              auch wenn es Christian leider nicht hilft, so interessiert mich doch Deine Anmerkung, daß die Zuweisung intern bereits implementiert sei.

                              Woran kann ich das erkennen?
                              Kannst Du das vielleicht näher erläutern?

                              Gruß Torste

                              Comment

                              Working...
                              X