![]() |
Delphi-Version: 5
Animiertes LoadCursor?
Moin, LoadCursor, LoadCursorFromFile erlauben es ja, dass man animierte Cursor (*.ani) lädt.
Aber warum erlauben die RessourcenCompiler vom Delphi nicht das Einbinden dieser Cursor?
Code:
Es gibt da eine Fehlermeldung ala "ungülige Datei".
xxx CURSOR "MyCursor.ani"
Unter 'nem anderen Ressource-Typ lässt sich diese Datei zwar einbinden, aber dann finden LoadCursor und LoadImage diese "Cursor"-Ressource nicht und man darf das Laden der Ressource selber implementieren und diesen Cursor kann man dann (offiziell) nicht aus dem RAM, bzw. dem Pointer dieser Ressourse laden, sondern müsste (offiziell) diesen Cursor dann erstmal in 'ne Datei speichern. :wall: offiziell = ich weiß wie es dennoch geht (aktuell) |
AW: Animiertes LoadCursor?
Unter Delphi 10.1 Berlin funktioniert das tadellos.
|
AW: Animiertes LoadCursor?
Hatte es mal auch schon in XE8 probiert und da ging es nicht ... toll, dass man sich ständig die Bugfixe kaufen darf :cry:
|
AW: Animiertes LoadCursor?
Zitat:
Bei mir sah das dann so aus in der Res RC-Datei:
Code:
Die Datei lässt sich dann auch problemlos kompilieren und in das Projekt einbinden.
#define ANICURSOR 21
DROPBELOWCUR CURSOR "DropBelow.cur" DROPABOVEANI ANICURSOR "DropAbove.ani" Geladen habe ich die Datei dann mit folgenden Code. Keine Ahnung ob das der beste Weg ist, aber es funktioniert problemlos.
Delphi-Quellcode:
procedure LoadAnimatedCursor(ResourceName: string; ResourceType: PWideChar; CursorIdx: Integer);
var ResStream: TResourceStream; ResFileName: PWideChar; begin ResStream := TResourceStream.Create(HInstance, ResourceName, ResourceType); try ResFileName := PWideChar(IncludeTrailingPathDelimiter(ExtractFilePath(aktuellerpfadUserIni)) + 'CursorRes'); ResStream.Position := 0; ResStream.SaveToFile(ResFileName); Screen.Cursors[CursorIdx] := LoadImage(HInstance, ResFileName, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); DeleteFile(ResFileName); finally ResStream.Free; end; end; |
AW: Animiertes LoadCursor?
Zitat:
Ohne Define, also mit dem Namen "ANICURSOR" (oder irgendeinem anderem Bezeichner) ging es. Aber auch bei deinem Code das genannte zweite unschöne Problem. Man muß vorher den Cursor als Datei speichern. (auch wenn es "aktuell" einen Trick/Bug gibt, sodass man LoadImage auch aus dem RAM laden lassen kann) -> Die Ressource selber auslesen, in Datei schreiben, von dort laden und danach die TempDatei aufräumen -> anstatt die Ressource direkt laden lassen zu können. Oder FindResource > LoadResource > LockResource > LoadImage Oder TRessourceStream > Stream.Memory (ist das HGlobal) > LoadImage Aber auch hier alles wieder "manuell". |
AW: Animiertes LoadCursor?
Zitat:
Nachteil beim Ablegen einer Datei ist natürlich, dass dadurch der Programmstart u.U. verzögert wird. Es handelt sich zwar nur um eine sehr kleine Datei, aber dennoch muss ja alles im NTFS System gemacht werden was auch bei einer großen Datei der Fall wäre. Bis jetzt hatte ich aber noch keinen Fall, in dem das Programm "ewig" zum Starten gebraucht hätte. Man müsste da höchstens mal mit dem QueryPerformanceCounter() messen wie lange das dauert. Mit einem TickCount würde das wahrscheinlich nicht ersichtlich werden. |
AW: Animiertes LoadCursor?
Es wird eine Komponente für "fremde" Programme und in sowas schreibe ich ungern Dateien einfach so irgendwo auf die Platte.
|
AW: Animiertes LoadCursor?
Zitat:
|
AW: Animiertes LoadCursor?
Mir scheint es ja eher ein "Bug" in den beiden RessourcenCompilern vom Delphi zu sein ... war mir nur nicht sicher, ob es nicht doch richtig so ist. :stupid:
|
AW: Animiertes LoadCursor?
Das Beispiel in Berlin habe ich direkt mit dem Menüpunkt Projekt - Ressourcen und Bilder hinzugefügt und den Typ einfach auf CURSOR geändert. Das führt zu folgender RC-Datei:
AniCursor CURSOR "C:\\WINDOWS\\Cursors\\aero_working.ani"Der Code zum Laden sieht dann so aus:
Delphi-Quellcode:
Als Resourcen-Compiler verwende ich den mitgelieferten brcc32.exe Dateiversion 50.4.227.0.
procedure TForm126.FormCreate(Sender: TObject);
var cur: HCURSOR; begin cur := LoadCursor(HInstance, 'AniCursor'); Screen.Cursors[1] := cur; Cursor := 1; end; |
AW: Animiertes LoadCursor?
Kann man nicht einfach die Dateiendung ändern? Ich meine, dass das ging.
|
AW: Animiertes LoadCursor?
Nee, hatte ich auch versucht, also .ani in .cur zu ändern, aber da hatte der Compiler och gemeckert :lol:
|
AW: Animiertes LoadCursor?
Jetzt bin ich etwas verwirrt. Ich habe mein Projekt gerade unter XE8 ausprobiert und es funktioniert auch dort problemlos :gruebel:
|
AW: Animiertes LoadCursor?
Früher, als noch vorm Kriech, als ich noch programmiert habe, konnte man sich das Windows SDK runterladen. Da war auch ein Resourcencompiler dabei. Wie geht der denn mit den animierten Cursor um in der Res-Datei?
|
AW: Animiertes LoadCursor?
Zitat:
Aber gut wie dem auch sei ;) Erzähl mir nicht du würdest überhaupt nicht mehr programmieren. Jetzt sag nicht NEIN.. LOL ;) gruss |
AW: Animiertes LoadCursor?
Öhm. Such dir schon mal eine Telefonnummer für eine Psychoklinik raus. Die Antwort ist: Nein.
Und es war der Krieg 1870/1871, den letzten, den wir gewonnen haben. :mrgreen: Aber sagt mal, wollt ihr mich reizen, bis ich meine eigene Beiträge löschen muss wegen offtopic? :roll: |
AW: Animiertes LoadCursor?
Poste, Du Luder :lol: :duck:
|
AW: Animiertes LoadCursor?
Ich glaub der ResCompiler vom SDK ist jetzt auch mit dabei, wo Delphi oftmals ja nun MSBUILD benutzt.
Grade nochma probiert, diesma nimmt Delphi den BRCC32, aber ich bin mir sicher, dass der letztes Mal den CGRC verwendete, so wie für die Projektressource. Zitat:
Delphi-Quellcode:
dem Projekt hinzugefügt,
crNetWait CURSOR crNetWait.ani
Delphi-Quellcode:
in der DPR erhalten und dann einfach F9 gedrückt, also über den Inlinecompiler.
{$R 'Status.res' 'Status.rc'}
Mir ist jetzt mal aufgefallen, dass der Compiler (inline und command-line) von
Delphi-Quellcode:
/
{$RESSOURCE ...}
Delphi-Quellcode:
nur den ersten parameter interpretiert.
{$R ...}
Der zweite Parameter ist nur 'ne nutzlose Information. Der Ressource-Compiler wird ausschließlich über den Eintrag in der DPROJ angeworfen. :wall: Aber gut. Ich nehm gern *.RC, *.SQL und andere Dateien ins Projekt mit auf, damit F6 diese Dateien auch findet. :stupid: |
AW: Animiertes LoadCursor?
Liste der Anhänge anzeigen (Anzahl: 1)
Hi bei Delphi 6 PE funktioniert folgendes:
Delphi-Quellcode:
program AniCurFromRes;
{$R '_res\ExtraAppResources.res' '_res\ExtraAppResources.rc'} uses Forms,...; {$R *.res} begin ...
Delphi-Quellcode:
const
MY_CURSOR = $100; // 8, 24 BPP for >= Win 7 // 1, 4, 8 BPP for < Win 7 function LoadAnimCursorFromRes(hInst: Cardinal; ResName, resourceTypeName: PChar): HCURSOR; overload; var hCur: HCURSOR; hIco: HICON; hRes: HRSRC; dwResourceSize: DWORD; hRsrcGlobal: HGLOBAL; pResource: PBYTE; begin hCur := 0; if (hInst > 0) then begin hRes := FindResource(hInst, ResName, resourceTypeName); dwResourceSize := SizeofResource(hInst, hRes); if (dwResourceSize > 0) then begin hRsrcGlobal := LoadResource(hInst, hRes); if (hRsrcGlobal > 0) then begin pResource := PBYTE(LockResource(hRsrcGlobal)); if (pResource <> nil) then begin hIco := CreateIconFromResource(pResource, dwResourceSize, FALSE, $00030000); //- or -> //hIco := CreateIconFromResourceEx(pResource, dwResourceSize, FALSE, $00030000, // 0, 0, LR_DEFAULTSIZE or LR_SHARED or LR_DEFAULTCOLOR); //<- UnlockResource(hRsrcGlobal); end; FreeResource(hRsrcGlobal); end; end; end; Result := HCURSOR(hIco); end; function LoadAnimCursorFromRes(hInst: Cardinal; ResName: PChar): HCURSOR; overload; const RT_ANICURSOR: PChar = 'ANICURSOR'; begin Result := LoadAnimCursorFromRes(hInst, ResName, RT_ANICURSOR); end; procedure TForm1.Test; begin Screen.Cursors[MY_CURSOR] := LoadAnimCursorFromRes(hInstance, MAKEINTRESOURCE(100)); Cursor := MY_CURSOR; end; |
AW: Animiertes LoadCursor?
Zitat:
Und jetzt nochmal #1, #5, #10 und #18 lesen. :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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