Entwickler-Ecke
Multimedia / Grafik - Animierten Cursor in EXE einbinden!
Andreas Pfau - Mo 01.12.03 21:08
Hallo,
wow, was für ein code - wo doch eine einzelne Zeile reichen würde:
Delphi-Quelltext
1:
| Screen.Cursors[1] := LoadCursor(HInstance, PChar('Cursorname')); |
Keine Ahnung, ob der dann den Cursor in vollfarben lädt (animiert ist er zumindest mal), aber wenn nein: nimm'
Delphi-Quelltext
1:
| Screen.Cursors[1] := LoadImage(HInstance, PChar('Cursorname'), IMAGE_CURSOR, 0, 0, 0); |
Delphi-Noobie - Mo 01.12.03 21:26
Nein, der Code klappt auch nicht, probier ihn mal selber an einem 256 Farben Ani-Cursor aus, da rührt sich nix, wenn man den Button drückt. Aber woran liegt das? ich denke mal man muss in meinem Code in der Function irgendwas umschreiben aber was?
Andreas Pfau - Mo 01.12.03 21:54
Hallo,
finde grad' keinen, habe auch keinen Editor, schick ihn mir doch bitte schnell per eMail, dann kann ich es probieren!
Delphi-Noobie - Mo 01.12.03 22:05
k hab ihn geschickt. Ich hoffe du findest raus, wie ich nun laden kann :)
Andreas Pfau - Di 02.12.03 18:02
Hallo,
also, bei mir klappt's. Der Cursor ist zwar nicht grade so, dass man 16 und 256 Farben unterscheiden kann, aber ich würde sagen, das sind bei mir 256 Farben.
Es tut sowohl mit
Delphi-Quelltext
1:
| Screen.Cursors[1] := LoadCursor(HInstance, PChar('CursorAusgelastet')); |
als auch mit
Delphi-Quelltext
1:
| Screen.Cursors[1] := LoadImage(HInstance, PChar('CursorAusgelastet'), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_DEFAULTCOLOR); |
Das wird dir jetzt nicht wieterhelfen. Aber wenn du willst, lade ich den Cursor bei mir auf den FTP-Server hoch, dann kann ihn jeder runterladen und es probieren, so kommst du sicher schneller zum Ziel. Oder wenn schon, nimm einen Cursor, wo man eindeutig erkennt, ob das jetzt 16 oder 256 Farben sein sollen - die braune Fledermaus ist braun, egal bei wieviel Farben...
Delphi-Noobie - Di 02.12.03 18:41
Ok mach das, da der Quellcode wieder nicht klappt bei mir (woran das liegt, keine Ahnung).
Andreas Pfau - Di 02.12.03 19:17
Hallo,
OK, an alle:
http://www.delphistuff.gmxhome.de/Bilder/Ani.zip. Enthalten: 2 ANIs, 1 normaler Cursor, ein Demoprojekt. Die RC bitte mit RC.exe compilieren, nicht mir BRCC.exe (aber die RES ist bereits enthalten, müsste also gar nicht neu kompiliert werden).
Delphi-Noobie - Di 02.12.03 20:38
Ok das Programm wechselt den Cursor! Ist die Datei "resources.res" mit RC.exe compilert worden? und dann beide Cursor in die eine Res Datei gepackt? Falls ja kannst du ja mal ein Link schicken, wo es die RC.exe runterzuladen gibt, damit ich das auch mal testen kann. Ist dann da irgendetwas anders z.B der Text im Texteditor (1 anicursor "cursor.ani") zum Compilieren oder so?
Dann hab ich noch festgestellt, dass du die Cursor gar nicht unter Implementation eingefügt hast, geht das auch ohne?
Andreas Pfau - Di 02.12.03 22:13
Hallo,
äh... was willst du mir sagen? Etwa, dass MEINE Anwendung das richtig macht ubnd DEINE nicht? Nun, ich habe es mit Rc.exe compiliert. Der Compiler ist nur 350MB groß :wink: .
Nein, im Ernst: die war bei der PSDK dabei. Du wirst sie dir nicht runterladen wollen, stimmt's? Tja, weißt du was, ich schicke dir dem Compiler (~70kB), denn das ist ja Freeware (denke ich mal, wenn man es sich kostenlos runterladen kann, oder?).
Die eMail ist bereits auf dem Weg zu dir - du kannst dich nicht entzeihen 8)
Delphi-Noobie - Mi 03.12.03 18:21
Ok hab ihn erhalten Thx. Aber es gibt immer noch ein Problem, was ich mir nicht erklären kann :(. Bei deinem Programm läd er den Cursor, jedoch wenn ich deine Resource.res Datei in mein Ordner Kopiere und exakt mit den selben Befehlen den Cursor aufrufen will, kommt er nicht...Warum? Hier nochmal mein Code
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Screen.Cursors[1] := LoadCursor(HInstance, PChar('CursorAusgelastet')); Screen.Cursors[1] := LoadImage(HInstance, PChar('CursorAusgelastet'), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_DEFAULTCOLOR); end;
procedure TForm1.FormDestroy(Sender: TObject); begin destroycursor(screen.cursors[1]); end;
end. |
Ist genau der selbe und die Res Datei is auch bei mir drin! Hast du irgendwas eingestellt, dass das nur bei dir klappt? :)
Andreas Pfau - Mi 03.12.03 22:19
Hallo,
was? DEINE tut, MEINE nicht? Bei mir tut meine...
Na ja, also, Vorgehensweise:
- Zeige deine RC-Datei
- Zeige deine Parameter für RC.exe
- Stimmen die Namen der RES-Datei und der darin enthaltenen Resource mit den Literalen überein, die im Programm angegeben sind?
Delphi-Noobie - Do 04.12.03 20:49
Mit dieser Anweisung kann ich nicht sehr viel anfangen. Was Zeigen, was sind Literalen usw? Bitte schreibe die Anleiten mal für Noobs ^^ wäre sehr nett.
PS:Dein Programm klappt aber wenn ich deine resources in mein Programm kopiere klappts nicht, obwohl es der selbe Code ist! Also nicht umgekehrt, wie du es gesagt hast.
Andreas Pfau - Fr 05.12.03 20:28
Hallo,
na, dann sieht deine RC-Datei anders aus. Hast du den gleichen Namen für die Ressource verwendet wie ich? Schau dir meine RC mal ganeu an!
So, dann mal zum Delphi-Unterricht: Ein Literal ist eine Konstante, die im Quelltext sichbar ist. Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5:
| const X = 'Hallo'; begin ShowMessage(X); ShowMessage('Hallo'); |
Hier wäre jetzt "X" eine Konstante. Sie hat den Wert "123", aber das sieht man ja innerhalb des Codes nicht, also wenn man sich die erste Zeile wegdenkt. In der letzten Zeile hingegen siehst du, was mit ShowMessage() angzeigt werden soll - der Text 'Hello'. Das wäre ein Literal: ein fester Wert (also eine Konstante), der direkt im Quelltext sichtbar ist. Eine Konstante (hier z.B. X) ist NICHT sichtbar - X kann jeden X-beliebigen Wert haben, im Biespiel wurde der Konstante aber auch ein Litetal zugewiesen (erste Zeile).
Ich komme immer in's Schwitzen, wenn ich was erklären muss, ich hoffe, ich habe das jetzt verstöndlich rübergebracht :roll: [/delphi]
Delphi-Noobie - Sa 06.12.03 10:01
Ok ist schon einigermaßen klar. Deine Rc Datei ist genau die selbe wie meine , da ich sie ja mit srtg-C kopiert habe und bei mir eingefügt! Aber das ist ja jetzt auch egal ich hab jetzt eine umständlichere Lösung gefunden, womit ich jeden Anicursor einfügen kann (Der Code ist natürlich nicht von mir ^^)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68:
| 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 (PCardinal(Integer(pBytes) + $08)^ = $4E4F4341) then 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;
procedure TForm1.Button1Click(Sender: TObject); begin screen.cursors[1]:= loadanicursor(hinstance,'1'); screen.cursor:= 1; end;
end. |
Das klappt auf jedenfall ich habs getestet. Man muss ebend nur noch die Res-Datei unter Implementation einfügen und das wars.Das kannst du ja bei dir auch mal probieren und wenn du etwas kürzeres findest, was so klappt wie das hier, kannst du ja den Code nochmal posten :)
Andreas Pfau - Sa 06.12.03 18:06
Hallo,
ja, ich kenne was kurzes, den Link hast du ja :wink:
Hast du zum compilieren auch WIRKLICH meinen RC.exe genommen? Es kann nämlich nur noch am Compiler leigen...
Delphi-Noobie - So 07.12.03 09:38
Für meinen Code habe Ich BRCC32.exe genommen und für deinen Code Habe ich RC.exe bebutzt.. aber dein Code klappt nicht :x.
Andreas Pfau - So 07.12.03 15:48
Hallo,
jetzt kapiere ich gar nix mehr - ich denke BRCC32 erkennt keine ANIs? Jetzt musst du mal mit offenen Karten spielen. Ich will deine RC und dein KOMPLETTES Projekt, damit ich den Fehler finden kann. Dann können wir das evtl. klären.
Delphi-Noobie - Mi 10.12.03 17:06
Ja er erkennt anis undzwar nicht mit den Befehl 1 cursor "cursor.ani" sondern mit 1 anicursor "cursor.ani" Deswegen brauchte ich den Rc Compiler nicht mehr ^^
Andreas Pfau - Mi 10.12.03 17:48
Hallo,
in höchstem Maße seltsam - bei mir nimmt er auch "CURSOR". Na ja, hauptsache, es tut jetzt, oder...?
Delphi-Noobie - Do 11.12.03 19:10
Jo er tuts jetzt :roll:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!