![]() |
DFM(?)- Fehler
Seit einiger Zeit treten bei einem meiner Delphi-Projekte setsame Zugriffsverletzungen auf, die mal da sind, mal nicht (meistens nach einem PC-Neustart). Besonders beliebt bei Delphi ist die Verletzung an Adresse '000000' in modul '000000', die während der Laufzeit und immer beim Beenden des Projektes, wenn das Programm nicht läuft, auftritt. :wall: Manchmal stürtzt auch gleich der ganze Computer ab. :evil: Ich glaube inzwischen, das irgendetwas mit der *.DFM- Datei des MainFormulars nicht stimmt. Gibt es vielleicht ein Tool, was die Dateien überprüft und repariert?
|
Re: DFM(?)- Fehler
Wenn selbst der Komplette Rechner abstürzt würde ich fast auf einen HW-Defekt tippen.
Besorg dir mal die Diagnose-CD der c't und lass diverse Lasttest auf RAM, HD etc. durchlaufen. |
Re: DFM(?)- Fehler
Wie kommst du denn zu dieser Vermutung? :gruebel:
Sonst öffne die *.dfm einfach mit einem Texteditor und guck sie dir an. :gruebel: Ich glaube nicht das es was damit zu tun hat. ;) |
Re: DFM(?)- Fehler
Zitat:
Außerdem kommt der, falsch, die Fehler immer auch zur Entwicklungszeit, wenn delphi2005 nich vorjer nach der 000000- Zugriffsverletzung selber abstürtzt. |
Re: DFM(?)- Fehler
Die häufigsten Gründe für diese AVs sind:
1. Man hat irgendwelche Componenten, die man dynamisch erzeugt hat, dann in FormDestroy vergessen zu free'n. 2. Man versucht in FormDestroy eine Komponente zu free'n (auch indirekt), die man aber irgendwo/wie vorher schon ge'free't hat. Also diesbezüglich event. nochmal genau durchchecken. |
Re: DFM(?)- Fehler
Oder man hat auf dem formular eine Komponente, die mit einer anderen Komponente, die man gelöscht hat,"verknüpft" ist.
Also in der Art: Form1.Menu | MainMenu1 Dann Mainmenu1 gelöscht und *ZACK* (Die meisten Komponenten fangen den fehler allerdings irgendwie ab) Trotzdem ist mir mal das neulich mit einer Action.Toolbar so ergangen. Da ging plötzlich gar nix mehr :| |
Re: DFM(?)- Fehler
Die Fehler treten auf, seit ich Zwei verknüpfte Komponenten entfernt habe!
Zitat:
:?: Kann es sein, dass ich zu viele TBitmap Variablen (ca. 10 stück) erstellt habe? Neulich hatte ich bei dem Projekt einen "Stack-Überlauf". Was ist das genau? |
Re: DFM(?)- Fehler
Sind sie wirklich alle mit Create erzeugt?
Auf welche Variablen/Objekte greifen denn all diese Komponenten zu? // Edit: die Labels etc... Es könnte auch (z.b.) an der OnPaint-Routine des Formulars liegen. Da könnte ja z.b. sowas stehen:
Delphi-Quellcode:
wenn dann in der TPaintbox.onpaint dies stünde:
procedure TForm1.FormPaint;
{ ... } paintbox1.width := 100; bitmap := tBitmap.Create; // Globales TBitmap-Objekt { ... }
Delphi-Quellcode:
Dann würde auf eine noch nicht erzeugtes Objekt zugegriffen.
{ ... }
paintbox1.canvas.draw(0,0,bitmap); { ... } Es käme also zu einer Zugriffsverletzung. (Und außerdem zum unten genannten Fehler ;)) Hast du mal Haltepunkte gesetzt? PS: Zitat aus der Onlinehilfe: Zitat:
Delphi-Quellcode:
daraufhin würde der Button und damit auch das Formular neugezeichnet, wobei der code immer wieder und wieder ausgeführt werden würde. Das führt nach einiger Zeit zu einem "Stack-Überlauf".
Button1.width := 100;
|
Re: DFM(?)- Fehler
Ein Label (Label1) wird im 250ms- Takt mit neuen Werten beschrieben, die Prozedur zum zeichnen (Per Timer im 100ms Takt):
Delphi-Quellcode:
Und der Timer mit der fraglichen Labelbeschriftung:
procedure TForm1.draw_map;
var i, j: Integer; begin for i := 0 to breite do for j := 0 to hoehe do begin case map[i, j] of //Map ist ein Array -1: bmp := picture[1]; 0: bmp := picture[0]; -3: bmp := picture[3]; -4: bmp := picture[4]; -5: bmp := picture[5]; -6: bmp := picture[6]; -7: bmp := picture[7]; -8: bmp := picture[8]; -9: bmp := picture[9]; else bmp := picture[2]; end; PaintBox1.Canvas.Draw(i*raster, j*raster,TGraphic(bmp)); end; end;
Delphi-Quellcode:
Beim klick auf einen Button wir das Label zusätzlich verschoben: TimeLabel.Left:=584; .
procedure TForm1.TimerTimer(Sender: TObject);
begin Label1.Caption:=IntToStr(XTime); dec(XTime); end; Ich hab das mal auskommentiert, alles lief ohne Fehler, beim beenden des Programms gabs wieder ne Zugriffsverletzung. |
Re: DFM(?)- Fehler
Delphi-Quellcode:
Lass die Umwandlung in TGraphic weg.
PaintBox1.Canvas.Draw(i*raster, j*raster,TGraphic(bmp));
Kann es sein, dass du in formdestroy (oder was auch immer) erst das array freigibst und dann bmp? (oder Umgekehrt) PS:
Delphi-Quellcode:
Wieso Minuszahlen? Wären positive Zahlen nicht praktischer? o.O
case map[i, j] of
-1: bmp := picture[1]; 0: bmp := picture[0]; -3: bmp := picture[3]; -4: bmp := picture[4]; -5: bmp := picture[5]; -6: bmp := picture[6]; -7: bmp := picture[7]; -8: bmp := picture[8]; -9: bmp := picture[9]; else bmp := picture[2]; jedenfalls würde ich das (wenn es denn unbedingt Minuszahlen sein müssen) lieber so machen:
Delphi-Quellcode:
if map[i, j] in [-1,0,-3..-9] then bmp := picture[-map[i, j]] else bmp := picture[2]; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz