Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi .rc-Datei lässt sich nicht aus Projekt entfernen?!? (https://www.delphipraxis.net/108113-rc-datei-laesst-sich-nicht-aus-projekt-entfernen.html)

Pixelex 7. Feb 2008 08:09


.rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Hallo,

gestern wollte ich Grafiken per Resource-Datei in meine .exe-Datei einbinden in Turbo Delphi, das hat aber alles nicht ganz hingehauen.

1. Ich habe die grafiken.rc-Datei mit validem Inhalt mit brcc32.exe kompiliert. grafiken.RES-Datei entstand.
2. Dann startete ich Turbo Delphi und er meinte beim Öffnen meines Projektes: "meinprojektname.RES ist nicht vorhanden. Wird erstellt." Das fand ich schonmal komisch, weil ich dachte ich brauche nur die grafiken.RES. Warum erstellt der eine meinprojektname.RES-Datei?
3. Habe dann die Datei so eingebunden: {$R grafiken.RES}
4. Weil es dann glaube ich nicht direkt funktionierte habe ich mal probiert im Projekt-Fenster Rechtsklick auf meinprojektname.exe und dann Hinzufügen die grafiken.RC-Datei. Nichts passierte.
5. Nach dem Neustarten von TD und öffnen meines Projektes hatte ich nun die grafiken.RC-Datei auch im Projektfenster liegen und nun kommt immer dieses "Duplicate Resource"-Errormeldung wenn ich das Projekt starten will.

Das komische ist die .RC-Datei lässt sich nicht mehr aus dem Projekt-Fenster entfernen. Ich habe alles probiert. Habe die Dateien RC und RES mittlerweile sogar aus dem Projektverzeichnis gelöscht, aber die grafiken.RC-Datei ist weiterhin im Projektfenster, die "Duplicate"-Meldung kommt und die RC Datei lässt sich einfach nicht entfernen. :/

Könnt ihr mir helfen?

Muetze1 7. Feb 2008 08:49

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Zitat:

Zitat von Pixelex
2. Dann startete ich Turbo Delphi und er meinte beim Öffnen meines Projektes: "meinprojektname.RES ist nicht vorhanden. Wird erstellt." Das fand ich schonmal komisch, weil ich dachte ich brauche nur die grafiken.RES. Warum erstellt der eine meinprojektname.RES-Datei?

Die erstellt er seit je her für jedes Projekt. Darin legt er das Icon der Anwendung ab und (falls aktiviert) die Versionsinformationen, etc. Wenn du diese Resource nicht nutzen willst, dann schmeiss das {$ *.R} aus dem Projektquellcode raus. Dieses Verhalten ist seit mindestens D3 vorhanden.

Zitat:

Zitat von Pixelex
5. Nach dem Neustarten von TD und öffnen meines Projektes hatte ich nun die grafiken.RC-Datei auch im Projektfenster liegen und nun kommt immer dieses "Duplicate Resource"-Errormeldung wenn ich das Projekt starten will.

Hast du denn auch dein "{$R grafiken.RES}" wieder entfernt? Ansonsten ist es vollkommen logisch, da er über diese Anweisung deine Resource einbindet und dann nochmal über den Projektmanager.

Zitat:

Zitat von Pixelex
Das komische ist die .RC-Datei lässt sich nicht mehr aus dem Projekt-Fenster entfernen. Ich habe alles probiert. Habe die Dateien RC und RES mittlerweile sogar aus dem Projektverzeichnis gelöscht, aber die grafiken.RC-Datei ist weiterhin im Projektfenster, die "Duplicate"-Meldung kommt und die RC Datei lässt sich einfach nicht entfernen. :/

Entferne die {$R grafiken.res grafiken.rc} o.ä. Anweisung direkt im Projektquellcode. Dieses Problem besteht bei Delphi seit je her, dass er die Resourcen nicht mehr über den Projektmanager entfernt.

Pixelex 7. Feb 2008 08:52

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Oh man ja sorry, hatte {$R grafiken.res} in .dpr und in Form implementation drin. :/ Jetzt gehts. Danke ^_^.

Nur noch ein Problem. Ich nutze ja PNGDelphi um PNG-Bilder benutzen zu können, die lassen sich aber nicht mit

001 BITMAP "grafiken/pn_logo.png"
oder
001 PNG "grafiken/pn_logo.png"

über

SplashGrafik.Picture.Bitmap.LoadFromResourceID(HIn stance, 001);
oder
SplashGrafik.Picture.PNG.LoadFromResourceID(HInsta nce, 001);

laden. Wie mache ich das mit den PNG's damit die in die .exe-Datei integriert werden? ^_^

Muetze1 7. Feb 2008 08:59

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
BITMAP als Schlüsselwort steht nun mal auch für BITMAPs und nicht für PiNGraphic. Du müsstest sie als RCDATA ablegen und ob dann noch LoadFromResource klappt ist fraglich. Ich weiss nicht aus dem Kopf wie PiNG diese Methoden implementiert. Soweit ich weiss, implementiert der Resourcencompiler kein Schlüsselwort für PiNG, somit ist PNG und BITMAP grundsätzlich nicht nutzbar.

Was mich viel mehr interessiert: Du müsstest bei beiden RC Angaben jeweilis vom Resourcencompiler dies um die Ohren geworfen bekommen, da er beim Ping dieses nicht als Bitmap ein binden kann und zum anderen weil er das Schlüsselwort nicht kennt. Von daher: Sicher dass du überhaupt eine neue .RES Datei bekommen hast? Schonmal von der Kommandozeile kompiliert und gibt es Meldungen?

Pixelex 7. Feb 2008 09:17

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Ich probiere es mal mit RCDATA. Ich melde mich dann...

Pixelex 7. Feb 2008 09:44

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Hi,

hm das funktioniert noch nicht.

Meine RC-Datei ist wie folgt: G001 RCDATA "grafiken/pn_logo.png"

Und mein Quelltext:

Delphi-Quellcode:
  Resource1 := TResourceStream.Create(HInstance, 'G001', PChar('RC_DATA'));
  SplashGrafik.Picture.Graphic.LoadFromStream(Resource1);

Kompilierung der RC-Datei hat auch funktioniert und RES wurde erstellt. Er meint aber immer Ressource G001 kann nicht gefunden werden. :/

teebee 7. Feb 2008 10:10

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Du brauchst selbst keinen ResourceStream zu erzeugen, das macht LoadFromResourceName/ID aus PNGDelphi selbst. Dabei wird der Res-Typ RCDATA vorausgesetzt, was Du ja erfüllst.
Delphi-Quellcode:
SplashGrafik.Picture.PNG.LoadFromResourceName(HInstance, 'G001');
sollte eigentlich klappen.

Pixelex 7. Feb 2008 10:16

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Zitat:

Zitat von teebee
Du brauchst selbst keinen ResourceStream zu erzeugen, das macht LoadFromResourceName/ID aus PNGDelphi selbst. Dabei wird der Res-Typ RCDATA vorausgesetzt, was Du ja erfüllst.
Delphi-Quellcode:
SplashGrafik.Picture.PNG.LoadFromResourceName(HInstance, 'G001');
sollte eigentlich klappen.

Dann sagt er mir immer das "TPicture" kein Element namens "PNG" enthält. :/

Pixelex 7. Feb 2008 10:25

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
So klappt es!!

Delphi-Quellcode:
p := tpngobject.Create;
p.LoadFromResourceName(HInstance, 'G001');
SplashGrafik.Picture.Assign(p);
freeandnil(p);
Nur nun sieht man natürlich immernoch das Form-Fenster im Hintergrund. Wie macht ich das nun transparent so das nur das transparente Image angezeigt wird?

Muetze1 7. Feb 2008 11:59

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Zitat:

Zitat von Pixelex
Dann sagt er mir immer das "TPicture" kein Element namens "PNG" enthält. :/

Bitte unterscheide Laufzeit- und Compilerfehler. Dieser Unterschied ist essentiell, schliesslich brauchen wir über das Auslesen von Resourcen nicht reden, wenn der Compiler nichtmal was ausführbares erstellen kann.

Dein ResourceStream in deinem Versuch zuvor hast du falsch aufgerufen:

Delphi-Quellcode:
Resource1 := TResourceStream.Create(HInstance, 'G001', RC_DATA);
RC_DATA ist ein Typ und muss direkt angegeben werden und nicht als String. Letzteres nur bei besonderen Datentypen.

Pixelex 7. Feb 2008 12:18

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Jo das klappt ja nun, allerdings ist die PNG-Datei nur IN der Form transparent.

Wenn ich nun die Form wie folgt ausblende:

Delphi-Quellcode:
Splash.Brush.Style:=bsClear;
Splash.BorderStyle:=bsNone;
Dann ist die Form zwar weg, allerdings liegt der Schatten des Splash wieder auf Weiss. :( Und die GR32 Lösung kapier ich nicht. :(

Muetze1 7. Feb 2008 13:06

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
... da das PiNG die Transparenz erreicht, in dem es den Hintergrund des Images nimmt und anhand der Transparenzen das Bild reinrechnet und darstellt. Somit wird auf einem DC der Hintergrund der Form gemalt - und da passiert dann durch dein Brush.Style rein gar nichts, somit bleibt es bei dem weißen default Inhalt der MemDC. Mit einem Image bekommst du das so definitv nicht hin.

Pixelex 7. Feb 2008 20:08

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Zitat:

Zitat von Muetze1
... da das PiNG die Transparenz erreicht, in dem es den Hintergrund des Images nimmt und anhand der Transparenzen das Bild reinrechnet und darstellt. Somit wird auf einem DC der Hintergrund der Form gemalt - und da passiert dann durch dein Brush.Style rein gar nichts, somit bleibt es bei dem weißen default Inhalt der MemDC. Mit einem Image bekommst du das so definitv nicht hin.

Hm schade. Wie denn aber dann?

Muetze1 7. Feb 2008 20:41

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Gegenfrage: Muss es halbtransparenzen sein? Reichen nicht auch nur voll-transparenz-Bereiche?

Pixelex 7. Feb 2008 20:49

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Zitat:

Zitat von Muetze1
Gegenfrage: Muss es halbtransparenzen sein? Reichen nicht auch nur voll-transparenz-Bereiche?

Nein, es muss schon richtig Halb-Transparent sein, so sieht der Splash aus:
http://www.pixelex.net/stuff/splash.gif

Und der Splash soll natürlich vernünftig transparent auf dem Desktop-Hintergrundbild liegen.

Muetze1 7. Feb 2008 21:04

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Dann musst du viel Aufwand treiben. Hättest du dies nun verneint, dann hätte man relativ einfach mit Regions arbeiten können. So aber musst du dir einen Screenshot vom Desktop holen und darauf die PiNG Grafik malen lassen. Dann passt das mit der Halbtransparenz. Problem dabei: Fenster im Hintergrund welche nach dem Erstellen des Screenshots verschwinden, sich verschieben oder verändern, werden nicht aktualisiert in diesem Bereich. Auch wird das Verschieben des Splash Screens sehr aufwändig und Rechenintensiv.

Das wäre der grundlegende Weg.

Pixelex 7. Feb 2008 21:37

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Danke erstmal für eure Geduld! :D

Ich bin nun fast am Ziel. Habe nun doch Graphics32 installiert und so funktioniert es OPTISCH nun einwandfrei:

Delphi-Quellcode:
Bit := TBitmap32.Create;
LoadPNGintoBitmap32(Bit, ExtractFilePath(ParamStr(0)) + 'grafiken/pn_logo.png', Alpha);
setWindowLong(Handle, GWL_EXSTYLE,
getWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
BlendF.BlendOp := AC_SRC_OVER;
BlendF.BlendFlags := 0;
BlendF.SourceConstantAlpha := 255;
BlendF.AlphaFormat := AC_SRC_ALPHA;
P2 := Point(0, 0);
Size.cx := Bit.Width;
Size.cy := Bit.Height;
UpdateLayeredWindow(Handle, 0, nil, @Size, Bit.Handle, @P2, 0, @BlendF, ULW_ALPHA);
Jetzt bleibt lediglich das Problem: Wie lade ich 'grafiken/pn_logo.png' mit dem LoadPNGIntroBitmap32 aus meiner Resource-Datei? Nun braucht er die Datei ja wieder von extern. :/

Pixelex 8. Feb 2008 09:42

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Niemand ne Idee?

teebee 8. Feb 2008 10:49

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
LoadPNGIntoBitmap32 erwartet doch eigentlich einen Stream, die überladenen Version mit dem Filenamen erzeugt ja auch nur einen temporären Filestream. Also Resource-Stream erzeugen und den übergeben.

Gruß, teebee

Pixelex 8. Feb 2008 10:58

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Zitat:

Zitat von teebee
LoadPNGIntoBitmap32 erwartet doch eigentlich einen Stream, die überladenen Version mit dem Filenamen erzeugt ja auch nur einen temporären Filestream. Also Resource-Stream erzeugen und den übergeben.

Gruß, teebee

Hm, kann ich dann einfach "ExtractFilePath(ParamStr(0)) + 'grafiken/pn_logo.png'" durch den Resourcen-Namen in meiner rc-Datei ersetzen oder wie würde das funktionieren?

Muetze1 8. Feb 2008 12:50

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Naja, anstatt Delphi-Referenz durchsuchenTFileStream.Create einfach Delphi-Referenz durchsuchenTResourceStream.Create nutzen. Die Parameter im Constructor erklären sich dann von alleine und deine Frage sollte sich damit denn erledigen...

Pixelex 8. Feb 2008 21:47

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Zitat:

Zitat von Muetze1
Naja, anstatt Delphi-Referenz durchsuchenTFileStream.Create einfach Delphi-Referenz durchsuchenTResourceStream.Create nutzen. Die Parameter im Constructor erklären sich dann von alleine und deine Frage sollte sich damit denn erledigen...

Da versteh ich nur Bahnhof. Habe es doch sonst per Stream so geladen oO

Delphi-Quellcode:
p := tpngobject.Create;
p.LoadFromResourceName(HInstance, 'G001');
SplashGrafik.Picture.Assign(p);
freeandnil(p);
Nix mit TFileStream etc...

Da müsstest du mir nun schon ein praktisches Beispiel mit LoadPNGIntoBitmap32 liefern. :/

Muetze1 9. Feb 2008 17:01

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Ja sorry, aber da war meine Antwort ein Schnellschluß. Du nutzt den TFileStream nicht und von daher war das natürlich Schwachfug von mir. Dieser Thread handelt eigentlich eh davon die RC Datei einzubinden, von daher empfehle ich dir einfach nochmal einen neuen Thread aufzumachen mit der Frage, wie man ein LoadPNGIntoBitmap32() mit einer Resource füttern kann. Oder teebee erläutert das noch genauer...

teebee 9. Feb 2008 19:29

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Ok, dann will ich mal. Hier sind die beiden Prozedur-Versionen von LoadPNGintoBitmap32:
Delphi-Quellcode:
procedure LoadPNGintoBitmap32(DstBitmap: TBitmap32; Filename: String; out AlphaChannelUsed: Boolean); overload;
procedure LoadPNGintoBitmap32(DstBitmap: TBitmap32; SrcStream: TStream; out AlphaChannelUsed: Boolean); overload;
Die Version, die Pixelex benutzt hat, ist die mit dem Filenamen. Dort wird erst ein Filestream erzeigt, und dieser an die eigentliche Arbeitsversion durchgereicht:
Delphi-Quellcode:
procedure LoadPNGintoBitmap32(DstBitmap: TBitmap32; Filename: String; out AlphaChannelUsed: Boolean);
var
  FileStream: TFileStream;
begin
  FileStream := TFileStream.Create(Filename, fmOpenRead);
  try
    LoadPNGintoBitmap32(DstBitmap, FileStream, AlphaChannelUsed);
  finally
    FileStream.Free;
  end;
end;
Um jetzt eine Grafik aus einer Resource zu laden, muss ich einen TResourceStream erzeugen, und diesen an LoadPNGintoBitmap32 übergeben.
Delphi-Quellcode:
Var ResStream: TResourceStream;
begin
  ResStream := TResourceStream.Create(hInstance, 'G001', RT_RCDATA);
  try
    LoadPNGintoBitmap32(DstBitmap, ResStream, AplhaChannelUsed);
  finally
    ResStream.Free;
  end;
end;
Gruß, teebee

Pixelex 9. Feb 2008 22:10

Re: .rc-Datei lässt sich nicht aus Projekt entfernen?!?
 
Jop habs hinbekommen! Danke für eure Antworten, nun läuft alles!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:20 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