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
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Resource wird nicht gefunden

  Alt 1. Apr 2016, 16: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.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: Resource wird nicht gefunden

  Alt 1. Apr 2016, 17: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
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Resource wird nicht gefunden

  Alt 1. Apr 2016, 18: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, 20: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 20:45 Uhr)
  Mit Zitat antworten Zitat
Alter Mann

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

AW: Resource wird nicht gefunden

  Alt 1. Apr 2016, 21: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, 21: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 21:53 Uhr)
  Mit Zitat antworten Zitat
Alter Mann

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

AW: Resource wird nicht gefunden

  Alt 2. Apr 2016, 09:45
Moin, Moin,

@Sir Rufo

was die AV angeht: Ja da hast du recht, die Zeile bewirkt Wunder

Danke

Was den Beitrag angeht, da bin ich mir nicht sicher(habe es noch nicht getestet); Das mit den 4 Bilderchen war/ist nur ein Beispiel. Ich brauche eine Lösung für ~1000 Bilderchen.

Also, warum findet der ResourceStream die Resourcen nicht?
  Mit Zitat antworten Zitat
Alter Mann

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

AW: Resource wird nicht gefunden

  Alt 2. Apr 2016, 10:33
So, da ich nicht beratungsresistent bin, habe ich den Beitrag aus
Funktion: Graphic anhand des Namens aus Res erstellen an D2009 angepasst
Delphi-Quellcode:
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  cboResources.Items.Clear;
  cboResources.Items.Add('IDR_LOADING');
  cboResources.Items.Add('IDB_0E00A');
  cboResources.Items.Add('IDB_0E00B');
  cboResources.Items.Add('IDB_0E00C');

  FResources := Resources.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FResources.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  case cboResources.ItemIndex of
    0 : Image1.Picture.Assign(Resources.BildA);
    1 : Image1.Picture.Assign(Resources.BildB);
    2 : Image1.Picture.Assign(Resources.BildC);
    3 : Image1.Picture.Assign(Resources.BildD);
  end;
end;
...
sowie

Delphi-Quellcode:
type
  Resources = class abstract
  private
    class var FBildA: TGraphicResource;
    class var FBildB: TGraphicResource;
    class var FBildC: TGraphicResource;
    class var FBildD: TGraphicResource;
  public
    constructor Create;
    destructor Destroy; override;
  public
    class property BildA: TGraphicResource read FBildA;
    class property BildB: TGraphicResource read FBildB;
    class property BildC: TGraphicResource read FBildC;
    class property BildD: TGraphicResource read FBildD;
  end;

implementation

{$R 'Resources.res' '..\Rescource\Resources.rc'}

{ Resources }

constructor Resources.Create;
begin
  FBildA := TGifResource.Create( 'IDR_LOADING' );
  FBildB := TPngResource.Create( 'IDB_0E00A' );
  FBildC := TPngResource.Create( 'IDB_0E00B' );
  FBildD := TBitmapResource.Create( 'IDB_0E00C' );
end;
und laufen lassen.

Das Ergebnis habe ich angehängt.

Das Problem mus also wo anders liegen

Die *.rc Datei sieht so aus:
Code:
LANGUAGE 0, SUBLANG_NEUTRAL
IDR_LOADING       GIF           "Loading.gif"

LANGUAGE 0, SUBLANG_NEUTRAL
IDB_0E00A         PNG           "smileys\\0E00A.PNG"

LANGUAGE 0, SUBLANG_NEUTRAL
IDB_0E00B         PNG           "smileys\\0E00B.PNG"

LANGUAGE 0, SUBLANG_NEUTRAL
IDB_0E00C         BMP           "smileys\\ACHTUNG.BMP"
Kann es an der Typ-Zuweisung liegen?
Miniaturansicht angehängter Grafiken
result.png  
  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
 
#9

AW: Resource wird nicht gefunden

  Alt 2. Apr 2016, 10:51
Und wenn du deine RC Datei mal so anpasst?
Code:
LANGUAGE 0, SUBLANG_NEUTRAL
IDR_LOADING      RCDATA          "Loading.gif"

LANGUAGE 0, SUBLANG_NEUTRAL
IDB_0E00A        RCDATA          "smileys\\0E00A.PNG"

LANGUAGE 0, SUBLANG_NEUTRAL
IDB_0E00B        RCDATA          "smileys\\0E00B.PNG"

LANGUAGE 0, SUBLANG_NEUTRAL
IDB_0E00C        RCDATA          "smileys\\ACHTUNG.BMP"
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)
  Mit Zitat antworten Zitat
Alter Mann

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

AW: Resource wird nicht gefunden

  Alt 2. Apr 2016, 11:09
So, nun verstehe ich nix mehr

Wenn ich die rc-Datei entsprechend anpasse, kann ich das GIF laden.
Bei allen anderen bleibt es dabei: Resource nicht gefunden.

Was mache ich da Falsch?

Update:

Es geht

Ich habe alle PNG/GIF usw. in der rc-Datei in RCDATA umbenannt. Und schon läuft es mit dem Resourcestream.

Danke für die Denkanstöße

Geändert von Alter Mann ( 2. Apr 2016 um 14:33 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 04:50 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