AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zugriffsverletzung bei Zeichnen auf Bitmap
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung bei Zeichnen auf Bitmap

Ein Thema von SuperSeb · begonnen am 9. Jan 2009 · letzter Beitrag vom 9. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
SuperSeb

Registriert seit: 7. Jan 2008
17 Beiträge
 
#1

Zugriffsverletzung bei Zeichnen auf Bitmap

  Alt 9. Jan 2009, 17:00
Hallo DP-Gemeinde,

ich würde gerne im Constructor ein Bitmap erzeugen und dann später andere Funktionen innerhalb einer Oberflächen-Klasse darauf zeichnen lassen. Die Organisation der Klassen sieht wie folgt aus:

Delphi-Quellcode:
TOberflaeche = class(TForm)
private
  BMP: TBitmap;
//(...)
und

Delphi-Quellcode:
TAndereKlasse = class(TOberflaeche)
//(...)
Der Constructor von TOberflaeche sieht so aus:

Delphi-Quellcode:
constructor TOberflaeche.Create;
begin
  inherited Create(Application);
  BMP := TBitmap.Create;
  //dann zum Beispiel:
  BMP.Width := 500;
  BMP.Height := 500;
  ShowMessage(inttostr(BMP.Width));
end;
Das funktioniert soweit einwandfrei. Nun das Problem: Wenn ich aus einer anderen Prozedur auf BMP zugreife, erzählt mir der Compiler
Zitat:
(...)Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse (...)'
Das kann doch nicht sein, dass eine Methode der Klasse nicht auf deren Eigenschaften zugreifen dürfen soll...

Delphi-Quellcode:
procedure TOberflaeche.ErzeugeMalKeinenFehler;
begin
  ShowMessage(inttostr(BMP.Width));
end;
Gleicher Code, nur nicht im Constructor... Und bevor einer was sagt: Ja, ich habe google reichlich verwendet und ja, ich habe auch immer schön ein Objekt erzeugt, bevor ich darauf zugreifen wollte


Kann mir das irgendwie nicht erklären, wo das Problem sein soll...

Gruß

Seb
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Zugriffsverletzung bei Zeichnen auf Bitmap

  Alt 9. Jan 2009, 17:06
Sollte es nicht
constructor TOberflaeche.Create( AOwner: TComponent); heissen?
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Zugriffsverletzung bei Zeichnen auf Bitmap

  Alt 9. Jan 2009, 17:12
Hallo,

die Fehlermeldung klingt eigentlich so, als sei irgendwo ein Create vergessen oder was schon freigegeben worden, bevor man drauf zugreift. Könntest Du uns bitte den ganzen Code zeigen, so kann ich erstmal keinen Fehler sehen.

Wo wird das TOberflaeche.Create letztlich aufgerufen und bei welcher Aktion produziert TOberflaeche.ErzeugeMalKeinenFehler doch einen Fehler?
  Mit Zitat antworten Zitat
SuperSeb

Registriert seit: 7. Jan 2008
17 Beiträge
 
#4

Re: Zugriffsverletzung bei Zeichnen auf Bitmap

  Alt 9. Jan 2009, 17:13
Habs dahingehend geändert - Fehler bleibt jedoch. Owner des Objekts der anderen Klasse is jetzt bei mir Application, also:

AndereKlasse := TAndereKlasse.Create(Application); @nahpets: wie schon gesagt, meine andere Klasse erbt alles von TOberfläche. Davon wird dann ein Objekt erzeugt (s.o.). Diese Prozedur mit dem tollen Namen ErzeugeMalKeinenFehler stammt ja wie der Constructor von der Basisklasse und müsste genau so wie dieser auf BMP zugreifen können.

Zitat:
die Fehlermeldung klingt eigentlich so, als sei irgendwo ein Create vergessen oder was schon freigegeben worden, bevor man drauf zugreift.
Wie gesagt: Der Quellcode wurde dahingehend schon untersucht und enthält noch keine Objektfreigaben, das kommt später noch. Außerdem sind alle Creates (sinn ja nich soo viele) vorhanden, die man braucht.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#5

Re: Zugriffsverletzung bei Zeichnen auf Bitmap

  Alt 9. Jan 2009, 17:15
Kannst du den Code mal Vollständig posten?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.539 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Zugriffsverletzung bei Zeichnen auf Bitmap

  Alt 9. Jan 2009, 17:15
Geht das unter .NET nicht ganz anders?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Zugriffsverletzung bei Zeichnen auf Bitmap

  Alt 9. Jan 2009, 17:22
Also das es hier um .Net geht bezweifel ich langsam auch. Zudem: Warum übergibst du als Owner Application und nicht den Owner der wirklich übergeben wurde (wenn man richtig vererbt)?
Und könntest du bitte die vollständige Fehlermeldung posten inklusive der Adressen die dir angezeigt werden? Die Adressen können nämlich sehr viel über die möglichen Fehler aussagen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

Re: Zugriffsverletzung bei Zeichnen auf Bitmap

  Alt 9. Jan 2009, 17:29
Hallo,

weiß nicht, ob ich mich da jetzt täusche, liegt der Hund eventuell hier begraben?
Delphi-Quellcode:
constructor TAndereKlasse.Create;
begin
  inherited Create;
  ....
Wird im Konstruktor der TAndereKlasse der Konstruktor des Vorfahren aufgerufen? (Oder passiert das implizit? eigentlich doch nicht? oder doch oder wie oder?)
  Mit Zitat antworten Zitat
SuperSeb

Registriert seit: 7. Jan 2008
17 Beiträge
 
#9

Re: Zugriffsverletzung bei Zeichnen auf Bitmap

  Alt 9. Jan 2009, 17:36
So, bitteschön: Der Code. Kann ihn leider nicht ganz posten, hab ihn aber auf die Kernelemente reduziert und getestet, dass auch ja der Fehler bleibt...

Delphi-Quellcode:
unit Vordergrundunit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TOberflaeche = class(TForm)
  private
    BMP: TBitmap;
    procedure ErzeugeMalKeinenFehler;
  public
    constructor Create(AOwner: TComponent);
  end;

  TAndereKlasse = class(TOberflaeche)
    BTestbutton: TButton;
    procedure BTestbuttonClick(Sender: TObject);
  end;

var
  AndereKlasse: TAndereKlasse;

implementation

{$R *.dfm}

constructor TOberflaeche.Create(AOwner: TComponent);
begin
  inherited Create(Application);
  BMP := TBitmap.Create;
  BMP.Width := 500;
  BMP.Height := 500;
end;

procedure TOberflaeche.ErzeugeMalKeinenFehler;
begin
  ShowMessage(inttostr(BMP.Width));
end;

procedure TAndereKlasse.BTestbuttonClick(Sender: TObject);
begin
  ErzeugeMalKeinenFehler;
end;

initialization
  AndereKlasse := TAndereKlasse.Create(Application);

end.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

Re: Zugriffsverletzung bei Zeichnen auf Bitmap

  Alt 9. Jan 2009, 18:05
Hallo,

so hat's bei mir funktioniert:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons;

type
  TOberflaeche = class(TForm)
    // wahrscheinlich so nicht gewünscht.
    BTestButton: TButton; // geändert, von AndereKlasse nach hier
    procedure BTestButtonClick(Sender: TObject); // geändert, von AndereKlasse nach hier
  private
    BMP: TBitmap;
    procedure ErzeugeMalKeinenFehler;
  public
    constructor Create(AOwner: TComponent); override;
  end;

  TAndereKlasse = class(TOberflaeche)
    constructor Create(AOwner: TComponent); override; // Neu
    procedure BTestbuttonClick(Sender: TObject);
  end;

var
  AndereKlasse: TAndereKlasse;

var
  Oberflaeche: TOberflaeche;

implementation

{$R *.dfm}

constructor TOberflaeche.Create(AOwner: TComponent);
begin
  inherited; // geändert
  // Create(AOwner); Der führt beim Aufruf vom Create schon zu einer Zugriffverletzung
  BMP := TBitmap.Create;
  BMP.Width := 500;
  BMP.Height := 500;
end;

procedure TOberflaeche.ErzeugeMalKeinenFehler;
begin
  ShowMessage(inttostr(BMP.Width));
end;

constructor TAndereKlasse.Create(AOwner: TComponent); // Neu
begin
  inherited;
end;

procedure TAndereKlasse.BTestbuttonClick(Sender: TObject);
begin
  ErzeugeMalKeinenFehler;
end;

procedure TOberflaeche.BTestbuttonClick(Sender: TObject); // geändert von TAndereKlasse nach TOberflaeche
begin
  AndereKlasse.BTestbuttonClick(sender);
end;

initialization
  AndereKlasse := TAndereKlasse.Create(Application);

end.
Das Hauptproblem ist im Bereich der Konstruktoren zu suchen. Der Nachfahre (TAndereKlasse) benötigt einen eigenen Konstruktor, der den des Vorgängers aufruft. Application als Owner anzugeben scheint sehr schief zu gehen.

Achso, das ist bestimmt kein .NET, bitte ändere den ersten Post entsprechend (wenn das geht).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:04 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