AGB  ·  Datenschutz  ·  Impressum  







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

Resource wird nicht gefunden

Ein Thema von Alter Mann · begonnen am 1. Apr 2016 · letzter Beitrag vom 2. Apr 2016
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Resource wird nicht gefunden

  Alt 1. Apr 2016, 15:56
Hallo,

ich möchte Bilder via TResourceStream laden, doch leider bekomme ich immer die
Fehlermeldung
Zitat:
Resource xxx nicht gefunden
.
Delphi-Quellcode:
...
{$R resources.res}
...

const
  IDB_0E00A = 100; // PNG-Resource

...

procedure TForm1.LoadPNG(ID : Integer);
var
  ResStream : TResourceStream;
  Png : TPngImage;
begin
  try
    try
      ResStream := TResourceStream.CreateFromID(0, ID, RT_RCDATA);
      Png := TPngImage.Create;
      try
        Png.LoadFromStream(ResStream);
        Image1.Picture.Graphic := Png;
      finally
        Png.Free;
      end;
    except
      on E : Exception do
        ShowMessage(E.Message);
    end;
  finally
    if Assigned(ResStream) then
      ResStream.Free; [COLOR="Lime"]<- Warum führt ein Free zu einem Fehler !!!?[/COLOR]
  end;
end;

...

LoadPNG(IDB_0E00A);
...
Die resources.res wird via brcc32 -32 resources.rc erzeugt und sind auch in der
Anwendung vorhanden.

Die Suche in der DP hat mich bisher nicht weiter geführt, daher:
Hat jemand einen Tipp/Hinweis?

Danke
Angehängte Dateien
Dateityp: zip ResTest.zip (74,1 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#2

AW: Resource wird nicht gefunden

  Alt 1. Apr 2016, 16:04
Hast Du es mal mit hInstance statt der 0 als Instanzhandle versucht?
ResStream := TResourceStream.CreateFromID(hInstance, ID, RT_RCDATA); Zur AV: wenn Du schon das Create hinter das try setzt, solltest Du die Instanzvariable mit nil initialisieren.
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
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Resource wird nicht gefunden

  Alt 1. Apr 2016, 17:18
hInstance bringt es auch nicht, damit hatte ich angefangen.
Bin dann aber bei FindResource auf diesen Hinweis gestoßen:

Zitat:
hModule [in, optional]
Type: HMODULE

A handle to the module whose portable executable file or an accompanying MUI file contains the resource.
If this parameter is NULL, the function searches the module used to create the current process.
Was die AV angeht: Der TResourcestream wird ja erstellt, er ist ja <> nil und trotzdem knallt es.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Resource wird nicht gefunden

  Alt 1. Apr 2016, 19:43
  • Die Instanz wird nicht erzeugt, wenn im constructor eine Exception kommt.
  • Die Instanzvariable ist eine lokale Variable und somit nicht initialisiert => da steht irgendwas drin.
  • Assigned liefert true wenn in der Instanzvariable irgendwas drin ist <> nil
  • TObject.Free prüft selber auch noch mal ob <> nil
  • Es kann nicht festgestellt werden, ob die Instanzreferenz auf irgendeine Grütze oder eine intakte Instanz zeigt
  • Zeigt die Referenz auf Grütze, dann knallt es
Darum lautet das Pattern auch so
Delphi-Quellcode:
procedure bar;
var
  foo: TObject;
begin
  foo := TObject.Create;
  try
    ...
  finally
    foo.Free;
  end;
end;
oder
Delphi-Quellcode:
procedure bar;
var
  foo: TObject;
begin
  foo := nil;
  try
    foo := TObject.Create;

    ...
  finally
    foo.Free;
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 1. Apr 2016 um 19:45 Uhr)
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Resource wird nicht gefunden

  Alt 1. Apr 2016, 20:08
@Sir Rufo

Nicht die Av ist das Problem.
Du liegst zwar grundsätzlich Richtig, aber im speziellem Fall wohl nicht(siehe Source-Code von TResurcestrem).
Delphi-Quellcode:
constructor TResourceStream.Create(Instance: THandle; const ResName: string; ResType: PChar);
begin
  inherited Create;
  Initialize(Instance, PChar(ResName), ResType, False);
end;
Ich vermute mal das es hier knallt(ungeprüft):
Delphi-Quellcode:
destructor TResourceStream.Destroy;
begin
  UnlockResource(HGlobal); [COLOR="MediumTurquoise"]<-[/COLOR]
  FreeResource(HGlobal); [COLOR="MediumTurquoise"]<-[/COLOR]
  inherited Destroy;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Resource wird nicht gefunden

  Alt 1. Apr 2016, 20:41
Nein, tut mir leid, aber ich habe dein Projekt gerade mal mit dem Debugger durchgesteppt und die erste Exception wird hier geworfen:
Delphi-Quellcode:
constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer;
  ResType: PChar);
begin
  inherited Create;
  Initialize(Instance, PChar(ResID), ResType, True); // <- da kommt die Exception
end;
dann wird im gleichen Atemzug TResourceStream.Destroy ganz brav und ohne weitere Exception durchlaufen, dann kommt die Ausgabe der MessageBox mit der Exception.

Der lokalen Variablen ResStream wird kein Wert zugewiesen!

Den Rest der Begründung findest du in meinem Post vorher.

Wenn du mit Resourcen arbeiten möchtest, dann kannst du dir auch einmal diesen Post von mir anschauen
http://www.delphipraxis.net/1330587-post3.html

Um meine Aussage zu überprüfen brauchst du lediglich eine Zeile einfügen:
Delphi-Quellcode:
procedure TForm1.LoadPNG(ID : Integer);
var
  ResStream : TResourceStream;
  Png : TPngImage;
begin
  ResStream := nil; // eine Zeile, die tut auch nix, die will nur spielen!
  try
    try
      ResStream := TResourceStream.CreateFromID(0, ID, RT_RCDATA);
      Png := TPngImage.Create;
      try
        Png.LoadFromStream(ResStream);
        Image1.Picture.Graphic := Png;
      finally
        Png.Free;
      end;
    except
      on E : Exception do
        ShowMessage(E.Message);
    end;
  finally
    // kann ersatzlos entfallen
    // if Assigned(ResStream) then
      ResStream.Free; // <- Warum ein Free zu einem Fehler !!!? <- Kommt ja jetzt nicht mehr
  end;
end;
Und noch etwas zum Thema Resource-Dateien

Wenn du die *.RC Datei in dein Projekt aufnimmst, dann wird diese Datei automatisch beim Erzeugen des Projekts erstellt und eingebunden. Das umständliche und manuelle Erzeugen der *.res Datei entfällt.

So sieht das dann in der dpr aus
Delphi-Quellcode:
program ResTest;

{$R 'Resources.res' '..\Rescource\Resources.rc'} // <- diese Zeile wird automatisch von Delphi erstellt

uses
  Forms,
  frmMain in 'frmMain.pas{Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 1. Apr 2016 um 20:53 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:07 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-2025 by Thomas Breitkreuz