Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Animirten Cursor in exe einbinden? (https://www.delphipraxis.net/12499-animirten-cursor-exe-einbinden.html)

Delphi-Noobie 28. Nov 2003 17:18


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:

roderich 28. Nov 2003 17:34

Re: Animirten Cursor in exe einbinden?
 
ich binde animierte Cursor einfach so ein (ohne Res-Datei):

Delphi-Quellcode:
  ID := 10;
  cursorfilename := 'c:\bla\cursors\mycursor.ani';
  Screen.Cursors[ID] := LoadCursorFromFile(PChar(cursorfilename));
Roderich

Delphi-Noobie 29. Nov 2003 09:57

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?

scp 29. Nov 2003 11:44

Re: Animirten Cursor in exe einbinden?
 
Code:
1 ANICURSOR "appstart.ani"

scp 29. Nov 2003 12:59

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;

Delphi-Noobie 29. Nov 2003 15:04

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 :)

scp 30. Nov 2003 00:30

Re: Animirten Cursor in exe einbinden?
 
Einfach das Beispiel oben abändern:
Delphi-Quellcode:
  ID := 10;
  Screen.Cursors[ID] := LoadAniCursor(hInstance, MAKEINTRESOURCE(1));

Delphi-Noobie 30. Nov 2003 14:38

Re: Animirten Cursor in exe einbinden?
 
Funktioniert leider immer noch nicht ich schreib mal mein Sourcecode vielleicht erkennt jemand den Fehler:
Delphi-Quellcode:
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.
Wenn ich den Button klicke kommt ne Fehlermeldung und er springt in die Zeile: Screen.cursors[ID]..

scp 30. Nov 2003 14:55

Re: Animirten Cursor in exe einbinden?
 
Klappts, wenn du
Delphi-Quellcode:
Screen.Cursors[ID] := LoadAniCursor(hInstance, '1')); // <-- In die Zeile springt er
verwendest?

scp 30. Nov 2003 15:02

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;

negaH 30. Nov 2003 15:08

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

scp 30. Nov 2003 15:14

Re: Animirten Cursor in exe einbinden?
 
Zitat:

Zitat von negaH
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

Wie wärs mit.... ausprobieren? Bei mir funzt es wunderbar.

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.

Delphi-Noobie 30. Nov 2003 17:29

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:
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.
PS: @SCP..wenns bei dir alles wunderbar klappt poste doch mal bitte den gesammten Code, wie ich es gemacht habe :)

scp 30. Nov 2003 18:31

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.

Delphi-Noobie 30. Nov 2003 19:01

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 :)

scp 30. Nov 2003 22:35

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".

Delphi-Noobie 1. Dez 2003 15:40

Re: Animirten Cursor in exe einbinden?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok hier der Anicursor der nicht klappt zum download :)

scp 1. Dez 2003 17:40

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.

Delphi-Noobie 1. Dez 2003 17:57

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:

scp 4. Dez 2003 03:56

Re: Animirten Cursor in exe einbinden?
 
So, nach reiflicher Überlegung hab ich LoadCursorFromFile doch eingebaut:

Delphi-Quellcode:
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;
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?

Delphi-Noobie 4. Dez 2003 20:45

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