Delphi Zugriffsverletzung load Image

...komplette Frage anzeigen

1 Antwort

hi, was ist denn logo ?

Adresse 00000000 bedeutet du greifst auf einen nil Pointer zu, also auf eine nicht zugewiesene Objektreferenz.

Starte das Programm über Debug und wenn der Fehler kommt wähle 'anhalten'. Dann sollte im besten Fall Delphi an der Stelle anhalten, an welcher du auf den nil Pointer zugreifst.

und noch nen Tip: OnActivate wird immer ausgelöst, wenn dein Fenster aktiviert wird. Das ist nicht das richtige Event um ein Bild zu laden. OnCreate wäre besser.

viel Erfolg, gruss dj

Oh schuldige, hab ich ganz vergessen zu schrieben.. >.< Habe gewusst, dass ich etwas ganz wichtiges vergessen habe.

logo ist eine Variable vom Datentyp tpicture.

Nicht zugewisene Objektreferenz soll bedeuten am genannten Dateipfad ist das Image nicht zu finden? Es ist dem aber so.

Ich habe mit onCreate irgentwie immerwieder Probleme, erstrecht mit Zugriffsverletzung. Hab mir irgentwie inzwischen angewöhnt onActivate zu benutzen, da dies fehlerfrei läuft. Diese Form wird sowieso nur 1x aktiviert. Dementsprechend macht es in dem Beispiel kein Unterschied, aber danke für den Hinweis!

Ich habe mit dem Debugger keine Erfahrungen. Habe ihn noch nie benutzt. Was bringt es mir die Stelle zu wissen, an dem er auf den nil Pointer zugreift? Ich meine doch es ist die Stelle: logo.loadfromfile(pfad)

Danke für die Hilfe Gruß KarkMar

0
@KarkMar

Hab gerade noch ein bisschen mit den Datentypen rumexperimentiert.

Nun bekomm ich die Fehlermeldung "Datei "DATEIPFAD" kann nicht geöffnet werden." Habe es mit verschiedenen Bildern probiert, immer die selbe Fehlermeldung.

Gruß

0
@KarkMar

Nicht zugewiesene Objektreferenz bedeutet, dass für diesen Pointer kein Objekt erstellt und zugewiesen wurde.

Wo erzeugst du logo denn? Irgendwo musst du sowas machen:

logo := TImage.Create(Owner);

Poste mal die entsprechenden Zeilen. Meine Vermutung ist, du hast vergessen den Parent zuzuweisen.

0
@DataJockey
var
  i: integer;
  str : string;
  logo: tpicture;

implementation

uses Unit3, unit2;

{$R *.dfm}


procedure TProgramm.FormActivate(Sender: TObject);
begin
focus.setfocus;
try
begin
logo:=Tpicture.Create;
logo.loadfromfile('C:\Users\KarkMar\Desktop\Dropbox\Public\logo.jpg');
end;
except
if messagedlg('Logo for implementation does not exist!' + slinebreak +  'Please contact Administrator.',mtwarning,[mbok],0) = mrok then close else close;
end;

Ob Datentyp TPicture, oder TJPEGImage es kommt bei beiden die Fehlemeldung:

Meldung: 'Datei C:\Users\KarkMar\Desktop\Dropbox\Public\logo.jpg kann nicht geöffnet werden'.

Im Programm startet sich meine eigene Message.

Auf das TPicture.create bin ich inzwischen schon selber gekommen. Hätte mir dafür aufn Deckel hauen können. :'D

0
@KarkMar

dann hau dich nochmal.

...der Konstruktor für das TPicture braucht einen Owner als Parameter, und noch einen Parent.

hier der Code zum Erzeugen eines TPicture:

logo := TPicture.Create(Self);
logo.Parent := Self;

hier Self weil das die Referenz auf dein Formular ist.

viel Erfolg, dj

0
@DataJockey

Hm okey so kenn ich das garnicht. Mein Delphi anscheinend auch nicht.

Zeile 71 > logo:=Tpicture.Create(self);

Zeile 72 > logo.parent:=self;

[Fehler] Unit1.pas(71): Zu viele Parameter

[Fehler] Unit1.pas(72): Undefinierter Bezeichner: 'parent'

0
@KarkMar

jo, hast recht. Jetzt hau ich mich. slap

Hab ich mit TImage durcheinander gebracht. Kein Owner, kein Parent. Also kommt kann deine Bilddatei nicht geöffnet werden. Versuch das Ganze mal mit nem Bmp auf deiner Platte. ...nicht von Dropbox.

0
@DataJockey

Dropbox ist ein ganz normaler Ordner auf der Platte und verhällt sich ganz genauso, wie alle anderen. Datentyp TBitmap selbes Spiel. (Selbstverständlich lade ich auch jeweils immer Bilder der jeweiligen Datentypen)

0
@KarkMar

Also jetzt werde ich aber verrückt... Scheinbar verhälts sich der Dropboxordner eben nicht wie alle andere - kein Plan warum..

Nun.. Jetzt habe ich ein nächstes Problem. Da ich dieses Programm nicht von einem Dateipfad abhängig machen möchte und ich keine Möglichkeit kenne, ein Bild von grundauf in eine .exe zu intigrieren, so möchte ich dieses Bild aus dem Netz laden.

Dafür habe ich die Zeile "logo.loadfromfile('pfad'); durch UrlDownloadToFile(nil,'URL','logo', 0,nil); ersetzt. Diese Zeile befindet sich, wie schon oben geschrieben, in einer try except Anweisung und ich bekomme keine Fehlermeldung (durch except). Trotzdem wird mir das Image nicht angezeigt, obwohl es doch angeblich geladen wurde.

Irgendeine Idee?

0
@DataJockey

Vielen Dank erstmal für die Mühe!!

Habe nun versucht diese procedure bei mir einzufügen. Ist recht überschaubar, versteh ich eigentlich auch alles.

Allerdings weiß mein Delphi mit dem Attribut .exists nichts anzufangen.. :(

Eine Sache versteh ich an dem Code allerdings nicht. Und das wäre der Part vor .exists, also Tfile. Ist Tfile nicht mein img (vom Typ TImage)?

Habe es schon mit img=nil versucht, aber damit weiß mein Delphi auch nichts anzufangen.

Gruß KarkMar

0
@KarkMar

oh, du hast wohl kein Delphi XE. TFile ist eine statische Klasse in den IOUtils. Die bringt die Exists Methode mit. TFile.Exists ist nichts weiter als ein Methodenaufruf um zu prüfen ob eine Datei vorhanden ist.

Tausch mal TFile.Exists gegen FileExists

Dafür muss, wenn nicht schon vorhanden, die sysutils eingebunden sein.

0

Was möchtest Du wissen?