| Autor |
Beitrag |
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Do 22.09.11 21:21
Liebes Forum,
ich habe in meinem jetzigen Projekt folgende Codezeile in das Form.Create eingefügt:
Delphi-Quelltext 1:
| WindowState:=wsMaximized; |
Seitdem bekomme ich beim Beenden des Programmes Zugriffsverletzungen. Auskommentiert geht alles glatt.
Gruss, Lukas
Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Do 22.09.2011 um 22:23
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Zuletzt bearbeitet von der organist am Do 22.09.11 22:02, insgesamt 1-mal bearbeitet
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 22.09.11 21:57
Günstige Kristallkugeln gibt's bei ZukunftBilliger.de schon ab 99 Globuli. Und wenn Sie sofort bestellen, bekommen Sie die gewünschte Antwort gratis dazu!
Ernsthaft: EurekaLog + madExcept. Alternativ Source und mehr Beschreibung.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
der organist 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Do 22.09.11 22:09
Naja, so viel mehr gibt es nicht zu erklären. Das ist das Form.Create (oh Wunder).
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TFTest.FormCreate(Sender: TObject); begin Melder.SetzeSprache(Meldung,0); Konstrukt:=TKonstrukt.Create; Melder:=TMelder.Create; SetzeSprache(0); Farbbeispiel.Canvas.Pen.Color:=clDkGray; Farbbeispiel.Canvas.Rectangle(0,0,28,28); WindowState:=wsMaximized; end; |
FormClose:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TFTest.FormClose(Sender: TObject; var Action: TCloseAction); begin Konstrukt.Free; Melder.Free; end; |
Der Fehler: Accessviolation at address (als ob was nicht initialisiert wär).
Der Fehler tritt nicht mehr auf, wenn das gehighlightete (anglizismus  ) auskommentiert ist, bzw. auch nicht, wenn ich das Konstrukt nicht freigebe. Deshalb auch noch einmal das Konstrukt.Free (ist auch schön mit einem override im interface gekennzeichnet):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| destructor TKonstrukt.Destroy; var k: Integer; begin for k := 0 to High(Element) do Element[k].Free; for k := 0 to High(Gerade) do Gerade[k].Free; inherited; end; |
Gruss,
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Do 22.09.11 22:18
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TFTest.FormCreate(Sender: TObject); begin Melder.SetzeSprache(Meldung,0); Konstrukt:=TKonstrukt.Create; Melder:=TMelder.Create; SetzeSprache(0); Farbbeispiel.Canvas.Pen.Color:=clDkGray; Farbbeispiel.Canvas.Rectangle(0,0,28,28); WindowState:=wsMaximized; end; |
Sicher?
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
der organist 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Do 22.09.11 22:23
hmm. hast ja recht, aber a. hat das bisher keine Fehlermeldung gegeben (und alles klappt damit) und b. ändert das umdrehen auch nichts am Erscheinen der Fehlermeldung beim Schließen. Habs trotzdem geändert....danke dafür
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 22.09.11 22:47
Nutze mal bitte FreeAndNil statt Obj.Free, da du dann ein wenig besser den Überblick bekommst, was bereits freigegeben ist.
Außerdem wirkt das doppelte "SetzeSprache" etwas komisch.
Hast Du mal im Single Step versucht zu debuggen?
Von welchem Typ sind Element und Gerade? Auch hier mal mit FreeAndNil arbeiten. Und halt mal mit EurekaLog oder madExcept das Programm compilieren, da findet man oft genug nen Ansatz, weil der Stacktrace mit kommt. Ansonsten Fehlerstelle mal mit OmMAP auflösen, auch wenn die wahrscheinlich hier recht wenig aussagekräftig sein dürfte.
Ach ja: Worum handelt es sich bei Farbbeispiel? Zumal mit Canvas im Konstruktor arbeiten auch so ne recht böse Angelegenheit ist.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 22.09.11 23:59
BenBE hat folgendes geschrieben : | | Zumal mit Canvas im Konstruktor arbeiten auch so ne recht böse Angelegenheit ist. |
Kannst du auch bitte mal sagen warum? Hin und wieder hatte ich da auch mal Probleme, meine ich mich erinnern zu können.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 23.09.11 01:11
Dude566 hat folgendes geschrieben : | BenBE hat folgendes geschrieben : | | Zumal mit Canvas im Konstruktor arbeiten auch so ne recht böse Angelegenheit ist. |
Kannst du auch bitte mal sagen warum? Hin und wieder hatte ich da auch mal Probleme, meine ich mich erinnern zu können. |
FormCreate wird noch als Teil des Konstruktors ausgeführt, bevor die Instanz wirklich zugewiesen ist an die Form-Variable (Konkret aufgerufen wird's über AfterConstruction). Problem ist weniger dieser Zustand, sondern viel mehr, dass zu diesem Zeitpunkt noch keine Handle für Fenster, keine Message Verwaltung und noch eine Reihe anderer Dinge, die von der VCL lazy initialisiert werden, nicht verfügbar sind. Das macht auch bei einigen visuellen Komponenten gerne mal Probleme.
Insbesondere mit dem WindowState hatte ich schon mal so witzige Effekte, wie dass das Form zwar maximiert wurde, oben im Fenster die Menüleiste allerdings transparent war. Erst wenn man das Fenster kurz Restored und dann erneut maximiert hatte, ging es.
Ach ja: Weil wir grad bei Code-Stil sind: Man sollte zum Zugriff auf ein Property/Methode nicht mehr als 2 Dereferenzierungen/Indirektionen haben. Das ist bei deinen Canvas-Zeilen verletzt. Statt also in irgendein Canvas eines Objektes zu zeichnen, nimm nen Bitmap, zeichne dort rein und Setz das mit BitBlt oder Assign auf dein Image.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
der organist 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Fr 23.09.11 08:00
Hoffe ich vergesse nichts:
-Elemente sind Punkte als Klasse, damit ich auch Prozeduren nutzen kann
-Geraden: Zwei Punkte und Prozeduren
Hab Folgendes gemacht:
-Zeichnen aus dem constructor herausgenommen
-Windowstate auch aus dem constructor herausgenommen und in das resize-Ereignis gepackt
-Eine weitere Prozedur geschrieben (in TKonstrukt), die alle eigenen Elemente und Geraden freigibt
-dafür habe ich den destructor gelöscht >> es wird immer das abgeleitete Free benutzt
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TFTest.FormClose(Sender: TObject; var Action: TCloseAction); begin Konstrukt.Löschen; Konstrukt.Free; Melder.Free; end;
procedure TKonstrukt.Löschen; var k: Integer; begin for k := 0 to High(Element) do Element[k].Free; for k := 0 to High(Gerade) do Gerade[k].Free; SetLength(Element,0); SetLength(Gerade,0); end; |
-dann habe ich im FormClose alle drei Zeilen mit nem Breakpoint versehen. Der Fehler erscheint erst, wenn alle drei Zeilen vom Debugger markiert wurden. Würde ja dafür sprechen, dass der Melder beim Freigeben Probleme macht.
-Melder.Free ruft allerdings auch die vererbte Methode auf und bei ihm gibt es auch nichts freizugeben:
Delphi-Quelltext 1: 2: 3:
| TMelder=class procedure SetzeSprache(var AMeldung:TMeldung;ASprache:Integer); end; |
-habe die Zeile trotzdem auskommentiert und es hilft auch nicht. Die Fehler erscheinen munter weiter. Die Fehler sind erst weg, wenn ich das Konstrukt nicht mehr freigebe. Paradox dazu ist allerdings, dass das Free mit den breakpoints keine Fehler angezeigt bekommt
>> Nicht zuletzt stellt sich mir die Frage, was es jetzt mit dem WindowState auf sich hat. Es ist immer noch der Fall, dass wenn ich es lösche, dass dann keine Fehler mehr am Ende des Programms kommen.
Gruss,
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
|