AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Klassen

Ein Thema von Cöster · begonnen am 30. Aug 2006 · letzter Beitrag vom 31. Aug 2006
Antwort Antwort
Seite 1 von 3  1 23      
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#1

Problem mit Klassen

  Alt 30. Aug 2006, 20:17
Hallöle!

Ich hab mir vorgenommen, mein Programm aus mehreren Klassen bestehen zu lassen. Bisher gibt es nur 2 Klassen: Unit1 (die Hauptunit) und Bild.

Da ich zum ersten Mal mit mehreren Klassen arbeite, gibt es auch schon das erste Problem.
Hier erstmal der (noch kurze) Quelltext der Unit Bild:

Delphi-Quellcode:
unit Bild;

interface

uses
  Graphics, Dialogs;

type
  TBild = class
  private
    FCurrentFile: String;
  public
    procedure Oeffnen;
  end;

implementation

uses Unit1;

procedure TBild.Oeffnen;
begin
  If Form1.OpenPictureDialog1.Execute then
  begin
    self.FCurrentFile := Form1.OpenPictureDialog1.FileName;
    Form1.ImMain.Picture.LoadFromFile(Form1.OpenPictureDialog1.FileName);
    Form1.ImMain.Picture.Bitmap.PixelFormat := pf24Bit;
    Form1.ImMain.Visible := True;
  end;
end;
Die Klasse dient also bisher nur dazu, ein Picture zu öffnen und sich seinen Dateinamen zu merken, damit man beim Speichern nicht immer auf "Speichern unter" klicken muss.
Beim Öffnen eines Bitmaps tritt nun eine Zugriffsverletzung auf. Wenn ich die Zeile self.FCurrentFile := Form1.OpenPictureDialog1.FileName; weglasse, tritt der Fehler nicht auf.

Kann mir jemand helfen? Falls es eine bessere Möglichkeit gibt, die Dateinamen zu speichern, wäre ich natürlich auch daran interessiert.

Danke!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Problem mit Klassen

  Alt 30. Aug 2006, 20:23
Ist Form1 zu diesem Zeitpunkt schon instantiiert?

BTW. ich würde das ganze mal überabeiten, so ist es nämlich nicht so toll!
Markus Kinzler
  Mit Zitat antworten Zitat
pszopp

Registriert seit: 7. Sep 2005
Ort: Alsdorf
95 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Problem mit Klassen

  Alt 30. Aug 2006, 20:54
Hallo Zusammen,

Zitat von mkinzler:
Ist Form1 zu diesem Zeitpunkt schon instantiiert?
Ja, denn

Zitat von Cöster:
Wenn ich die Zeile
self.FCurrentFile := Form1.OpenPictureDialog1.FileName; weglasse, tritt der Fehler nicht auf.
wenn die entsprechende Zeile auskommentiert wird, würde der gleiche Fehler in der nächsten Zeile auftreten.
Daher muss Form1 instanziiert sein, da der Fehler ja nicht auftritt

Ich habe eher den Eindruck, das beim Zugriff auf Self ein Fehler entsteht.
Self scheint nil zu sein.

Gruß,
pszopp
www.pstipp.de | Tippseite zur Formel 1 und Fußball WM/EM - kostenlos und Just-For-Fun
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Problem mit Klassen

  Alt 30. Aug 2006, 20:57
Hast Du denn eine Instanz von TBild erzeugt?
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Problem mit Klassen

  Alt 30. Aug 2006, 20:59
Wenn self=nil wäre, könnte er nicht mal die Methode aufrufen, da der Methodenzeiger aus einem Pointer auf den Code und einem Pointer auf die Klasseninstanz besteht. Das heißt, wenn die Klasse nicht instantiiert wäre, würde er bevor er in die Methode springt, übelst mit ner AV abschmieren.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Problem mit Klassen

  Alt 30. Aug 2006, 21:09
Zitat von GuenterS:
Hast Du denn eine Instanz von TBild erzeugt?
Ich Idiot
Danke, das war's.

Zitat von mkinzler:
BTW. ich würde das ganze mal überabeiten, so ist es nämlich nicht so toll!
Danke für den Hinweis. Was schlägst du mir denn vor, wie ich das überarbeiten sollte?
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Problem mit Klassen

  Alt 30. Aug 2006, 21:11
Zitat von 3_of_8:
Wenn self=nil wäre, könnte er nicht mal die Methode aufrufen, da der Methodenzeiger aus einem Pointer auf den Code und einem Pointer auf die Klasseninstanz besteht. Das heißt, wenn die Klasse nicht instantiiert wäre, würde er bevor er in die Methode springt, übelst mit ner AV abschmieren.
Diese Aussage stimmt nur für virtuelle Methoden, nicht aber für statische wie die Methode Oeffnen im Beispiel von Cöster. Selbst wenn die Objektreferenz den Wert NIL enthält, wird die Methode aufgerufen. Bei virtuellen Methoden kommt es zu einer Zugriffsverletzung beim Zugriff auf die VMT.

Gruß Hawkeye
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Problem mit Klassen

  Alt 30. Aug 2006, 21:13
Zitat:
Danke für den Hinweis. Was schlägst du mir denn vor, wie ich das überarbeiten sollte?
Alle Referenzen auf Form1 entfernen, und diese als parameter der Methode übergeben.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Problem mit Klassen

  Alt 30. Aug 2006, 21:19
Zitat von Hawkeye219:
Zitat von 3_of_8:
Wenn self=nil wäre, könnte er nicht mal die Methode aufrufen, da der Methodenzeiger aus einem Pointer auf den Code und einem Pointer auf die Klasseninstanz besteht. Das heißt, wenn die Klasse nicht instantiiert wäre, würde er bevor er in die Methode springt, übelst mit ner AV abschmieren.
Diese Aussage stimmt nur für virtuelle Methoden, nicht aber für statische wie die Methode Oeffnen im Beispiel von Cöster. Selbst wenn die Objektreferenz den Wert NIL enthält, wird die Methode aufgerufen. Bei virtuellen Methoden kommt es zu einer Zugriffsverletzung beim Zugriff auf die VMT.

Gruß Hawkeye
Wieder was dazugelernt. An dieser Stelle könnte man doch eigentlich doch eigentlich Delphi wieder ein bisschen "sicherer" machen, indem man da eine AV raist, oder?
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
pszopp

Registriert seit: 7. Sep 2005
Ort: Alsdorf
95 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Problem mit Klassen

  Alt 30. Aug 2006, 21:26
Zitat von 3_of_8:
An dieser Stelle könnte man doch eigentlich doch eigentlich Delphi wieder ein bisschen "sicherer" machen, indem man da eine AV raist, oder?
Nein, dann gäbe es ja keine statischen Methoden mehr.

Gruß,
pszopp
www.pstipp.de | Tippseite zur Formel 1 und Fußball WM/EM - kostenlos und Just-For-Fun
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz