![]() |
Animirten Cursor in exe einbinden?
Hallo,
Ich habe ein Problem mit dem einbinden eines animierten Cursors in die exe. Wenn ich in einem Texteditor schreibe: 1 cursor "cursor.ani", dann als Rc-Datei speichere und versuche es in eine Res-Datei zu Compilieren, sagt der Borlandcompiler (BRCC32.exe), dass es ein unbekanntes Cursorformat ist. Mit normalen Cursorn, die nicht animiert sind klappt das :(. Weis einer was man dagegen machen kann? z.B nen anderer rc-Compiler oder so und falls man einen anderen braucht, wo kann man den runterladen? :gruebel: Ich hoffe mir kann jemand helfen :roll: |
Re: Animirten Cursor in exe einbinden?
ich binde animierte Cursor einfach so ein (ohne Res-Datei):
Delphi-Quellcode:
Roderich
ID := 10;
cursorfilename := 'c:\bla\cursors\mycursor.ani'; Screen.Cursors[ID] := LoadCursorFromFile(PChar(cursorfilename)); |
Re: Animirten Cursor in exe einbinden?
Das will ich ja möglichst vermeiden, auf den Cursor extern zuzugreifen. Er soll mit in die exe rein, dass ich ihn nicht extra in den Ordner mit reinpacken muss. Gibts da keine Lösung für?
|
Re: Animirten Cursor in exe einbinden?
Code:
1 ANICURSOR "appstart.ani"
|
Re: Animirten Cursor in exe einbinden?
Delphi-Quellcode:
function LoadAniCursor(hInst : Cardinal; lpID : PChar; lpType : PChar = nil) : HCURSOR;
var hRes : HRSRC; dwSize : DWORD; hGlob : HGLOBAL; pBytes : PBYTE; begin If not Assigned(lpType) then lpType := PChar('ANICURSOR'); If (StrToIntDef(StrPas(lpID), 0) <> 0) then hRes := FindResource(hInst, PChar('#' + StrPas(lpID)), lpType) else hRes := FindResource(hInst, lpID, lpType); dwSize := SizeofResource(hInst, hRes); hGlob := LoadResource(hInst, hRes); If (hGlob <> 0) then begin pBytes := PBYTE(LockResource(hGlob)); result := HCURSOR(CreateIconFromResource(pBytes, dwSize, FALSE, $00030000)); end else result := 0; end; |
Re: Animirten Cursor in exe einbinden?
Könnt ihr da mal bitte ein konlretes Beispiel geben? Also zuerst : 1 anicursor "cursor.ani" zu ner res Datei unwandeln und dann mit der Funktion, die hier steht wie aufrufen? ...loadanicursor(????); <-- was für Werte müssen da rein? ich weis das noch nicht so genau, da ich noch ziemlich neu bin bei Delphi :)
|
Re: Animirten Cursor in exe einbinden?
Einfach das Beispiel oben abändern:
Delphi-Quellcode:
ID := 10;
Screen.Cursors[ID] := LoadAniCursor(hInstance, MAKEINTRESOURCE(1)); |
Re: Animirten Cursor in exe einbinden?
Funktioniert leider immer noch nicht ich schreib mal mein Sourcecode vielleicht erkennt jemand den Fehler:
Delphi-Quellcode:
Wenn ich den Button klicke kommt ne Fehlermeldung und er springt in die Zeile: Screen.cursors[ID]..
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} {$R cursorausgelastet.res} //<--- eigener Cursor 1 anicursor "cursorausgelastet.ani" function LoadAniCursor(hInst : Cardinal; lpID : PChar; lpType : PChar = nil) : HCURSOR; var hRes : HRSRC; dwSize : DWORD; hGlob : HGLOBAL; pBytes : PBYTE; begin If not Assigned(lpType) then lpType := PChar('ANICURSOR'); If (StrToIntDef(StrPas(lpID), 0) <> 0) then hRes := FindResource(hInst, PChar('#' + StrPas(lpID)), lpType) else hRes := FindResource(hInst, lpID, lpType); dwSize := SizeofResource(hInst, hRes); hGlob := LoadResource(hInst, hRes); If (hGlob <> 0) then begin pBytes := PBYTE(LockResource(hGlob)); result := HCURSOR(CreateIconFromResource(pBytes, dwSize, FALSE, $00030000)); end else result := 0; end; procedure TForm1.Button1Click(Sender: TObject); var ID : tcursor; begin ID := 10; Screen.Cursors[ID] := LoadAniCursor(hInstance, MAKEINTRESOURCE(1)); // <-- In die Zeile springt er screen.cursor:= ID; end; end. |
Re: Animirten Cursor in exe einbinden?
Klappts, wenn du
Delphi-Quellcode:
verwendest?
Screen.Cursors[ID] := LoadAniCursor(hInstance, '1')); // <-- In die Zeile springt er
|
Re: Animirten Cursor in exe einbinden?
Hier nochmal eine optmierte Fassung, um Laufzeitfehler zu vermeiden:
Delphi-Quellcode:
function LoadAniCursor(hInst : Cardinal; lpID : PChar; lpType : PChar = nil) : HCURSOR;
var hRes : HRSRC; dwSize : DWORD; hGlob : HGLOBAL; pBytes : PBYTE; begin result := 0; If not Assigned(lpType) then lpType := PChar('ANICURSOR'); If (Cardinal(lpID) < $10000) then hRes := FindResource(hInst, PChar('#' + IntToStr(Cardinal(lpID))), lpType) else If (StrToIntDef(StrPas(lpID), 0) <> 0) then hRes := FindResource(hInst, PChar('#' + StrPas(lpID)), lpType) else hRes := FindResource(hInst, lpID, lpType); dwSize := SizeofResource(hInst, hRes); hGlob := LoadResource(hInst, hRes); If (hGlob <> 0) then begin pBytes := PBYTE(LockResource(hGlob)); If Assigned(pBytes) then result := HCURSOR(CreateIconFromResource(pBytes, dwSize, FALSE, $00030000)); end; end; |
Re: Animirten Cursor in exe einbinden?
Wer ist auf die Idee gekommen CreateIconFromResource() zu benutzen um eine ANICURSOR Resource zu laden ?? Soviel ich weiß unterstützt diese Funktion keine ANICUROR's.
Gruß Hagen |
Re: Animirten Cursor in exe einbinden?
Zitat:
PS: Wenn man das Handle einem TIcon zuweist, wird natürlich nur das erste Bild der ANI zugewiesen, wenn man es aber tatsächlich als Cursor verwendet, wirds auch animiert. |
Re: Animirten Cursor in exe einbinden?
klappt leider immer noch nicht! Er stürzt zwar nicht mehr ab, wenn ich den Button klicke aber er wechselt auch nicht den Cursor :(
Delphi-Quellcode:
PS: @SCP..wenns bei dir alles wunderbar klappt poste doch mal bitte den gesammten Code, wie ich es gemacht habe :)
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} {$R cursorausgelastet.res} function LoadAniCursor(hInst : Cardinal; lpID : PChar; lpType : PChar = nil) : HCURSOR; var hRes : HRSRC; dwSize : DWORD; hGlob : HGLOBAL; pBytes : PBYTE; begin result := 0; If not Assigned(lpType) then lpType := PChar('ANICURSOR'); // Muss hier wirklich Anicursor stehen oder der Name vom Cursor? If (Cardinal(lpID) < $10000) then hRes := FindResource(hInst, PChar('#' + IntToStr(Cardinal(lpID))), lpType) else If (StrToIntDef(StrPas(lpID), 0) <> 0) then hRes := FindResource(hInst, PChar('#' + StrPas(lpID)), lpType) else hRes := FindResource(hInst, lpID, lpType); dwSize := SizeofResource(hInst, hRes); hGlob := LoadResource(hInst, hRes); If (hGlob <> 0) then begin pBytes := PBYTE(LockResource(hGlob)); If Assigned(pBytes) then result := HCURSOR(CreateIconFromResource(pBytes, dwSize, FALSE, $00030000)); end; end; procedure TForm1.Button1Click(Sender: TObject); var ID : tcursor; begin ID := 10; Screen.Cursors[ID] := LoadAniCursor(hInstance, '1'); // in der Function sind 3 Parameter.. Warum screen.cursor:= ID; // hier nur 2? end; end. |
Re: Animirten Cursor in exe einbinden?
Liste der Anhänge anzeigen (Anzahl: 1)
So, hier das funzende Beispiel im Anhang.
PS: Der dritte Parameter ist nur erforderlich, wenn der Cursor in einer anderen Section als "ANICURSOR" gespeichert ist, was im Beispiel nicht der Fall ist. Bei den Sektionennamen werden übrigens nur Großbuchstaben verwendet. |
Re: Animirten Cursor in exe einbinden?
LoL ich habe gerade rausgefunden, dass die Anwendung auf Klick zwar zu deinem Cursor changed aber nicht zu meinen? Woran liegt das?
Ps: Wie kann ich den zum download anbieten hier, damit du ihn mal testen kannst? ich weis das noch nicht , da ich erst seit kurzem hier bin :) |
Re: Animirten Cursor in exe einbinden?
Wenn du auf Antwort gehst ist ganz unten unter dem Textfeld die Rubrik "Attachment hinzufügen", dort klickst du auf "Durchsuchen" und wählst deine Datei aus. Danach kannst du ganz normal "Absenden".
|
Re: Animirten Cursor in exe einbinden?
Liste der Anhänge anzeigen (Anzahl: 1)
Ok hier der Anicursor der nicht klappt zum download :)
|
Re: Animirten Cursor in exe einbinden?
So, habs jetzt getestet. Es liegt daran, das der Cursor 256 Farben hat, die Funktion CreateIconFromResource() unterstützt aber nur max. 16 Farben. Habe noch keine Ausweg abgesehen von dem nicht so tollen LoadCursorFromFile() gefunden.
|
Re: Animirten Cursor in exe einbinden?
Ok ich hoffe du findest die Lösung :) Ich versuch auch mal irgendwas, was wahrscheinlich eher erfolglos bleiben wird :oops:
|
Re: Animirten Cursor in exe einbinden?
So, nach reiflicher Überlegung hab ich LoadCursorFromFile doch eingebaut:
Delphi-Quellcode:
Dabei wird die Datei aber nur für ein paar Milisekunden benötigt und direkt nach dem laden des Cursors wieder gelöscht. Kann man doch mit leben, oder?
function CreateAniCursorFromResource(pBytes : pByte; dwSize : DWORD) : HCURSOR;
var fs : TFileStream; td : array[0..255] Of Char; tfn : string; begin result := 0; result := CreateIconFromResource(pBytes, dwSize, FALSE, $00030000); If (result = 0) and (PCardinal(pBytes)^ = $46464952) and // RIFF word (PCardinal(Integer(pBytes) + $08)^ = $4E4F4341) then // ACON word begin GetTempPath(255, td); Randomize; tfn := StrPas(td) + 'temp' + Format('%0:4.4x', [Random($FFFF)]) + '.ani'; fs := TFileStream.create(tfn, fmCreate); try fs.Write(pBytes^, dwSize); finally fs.Free; end; result := LoadCursorFromFile(PChar(tfn)); DeleteFile(tfn); end; end; function LoadAniCursor(hInst : Cardinal; lpID : PChar; lpType : PChar = nil) : HCURSOR; var hRes : HRSRC; dwSize : DWORD; hGlob : HGLOBAL; pBytes : PBYTE; begin result := 0; If not Assigned(lpType) then lpType := PChar('ANICURSOR'); If (Cardinal(lpID) < $10000) then hRes := FindResource(hInst, PChar('#' + IntToStr(Cardinal(lpID))), lpType) else If (StrToIntDef(StrPas(lpID), 0) <> 0) then hRes := FindResource(hInst, PChar('#' + StrPas(lpID)), lpType) else hRes := FindResource(hInst, lpID, lpType); dwSize := SizeofResource(hInst, hRes); hGlob := LoadResource(hInst, hRes); If (hGlob <> 0) then begin pBytes := PBYTE(LockResource(hGlob)); If Assigned(pBytes) then begin result := CreateAniCursorFromResource(pBytes, dwSize); end; end; end; |
Re: Animirten Cursor in exe einbinden?
Vielen dank @ Scp jetzt klappt alles..auch wenn ich sogut wie nix verstehe, was da eigendlich im code steht :) Die hauptsache ist es klappt ^^ Also nochmal danke für die Mühe!
Gruß Delphi-Noobie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz