Autor Beitrag
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Fr 14.06.02 10:23 
Einbinden von Icons / Cursor / Bitmaps

Autor: Benedikt Gollatz
E-Mail: d3g@delphi-ware.de
Quelle: www.delphi-ware.de/



Einbinden
  1. Bildeditor / Image Editor
    Zu jedem Projekt gehört, wenn es abgespeichert wurde, eine *.res-Datei. Diese kann man mit dem mitgelieferten "Bildeditor" oder im englischen "Image Editor" bearbeiten, den man in der Tools-Leiste in der Delphi-IDE findet und auch im Startmenü im Delphi-Ordner finden kann. Der Bildeditor ist in jeder Delphi-Version ab Delphi 1 Standard vorhanden, also wenn er bei euch nicht zu finden ist, habt ihr ihn auf irgendeinem Wege entfernt, da er auch automatisch mitinstalliert wird. Ihr öffnet mit dem Bildeditor also die *.res-Datei mit dem Namen eures Projekts. Eine Liste öffnet sich mit dem obersten Eintrag "Inhalte bzw. "Contents".
  2. MAINICON
    Darunter befindet sich ein Untereintag "Symbol"/"Icon", in welchem man ein Symbol findet, nämlich "MAINICON". Wenn ihr darauf doppelklickt, werdet ihr merken, dass das das Icon des Projekts ist, das in den Formular-Titelleisten angezeigt wird, sofern kein anderes Icon dem Formular zugewiesen wurde. Wenn ihr dieses Icon veröndert, ändert sich auch das Projekt-Icon.
  3. Neue Icons / Cursors / Bitmaps
    Neue Objekte erstellt ihr, wenn ihr auf der Liste auf eine Stelle rechtsklickt, wo sich Eintrag befindet. Wählt "Neu" / "New" an und sucht euch den gewünschten Typ aus. Jeder Typ hat unter dem Haupteintrag seinen eigenen Untereintrag, damit es nicht Unübersichtlich wird. Die Einträge könnt ihr dann mit einem Rechtsklick Editieren, Umbenennen, und Löschen. Schneller kommt ihr zum Bearbeiten, wenn ihr auf den Eintrag doppelklickt.
    Bei Cursorn ist es nach dem Erstellen besonders wichtig, dass ihr die sensitive Zone, also die "Spitze" des Cursors, festlegt. Das tut ihr, indem ihr "Cursor | Sensitive Zone festlegen..." / "Cursor | Set Hot Spot..." auswählt und dann die X- und Y-Koordinate der Spitze angebt.
  4. Eigene *.res-Dateien
    Natürlich kann man auch eigene *.res-Dateien benutzen. Man erstellt ganz einfach eine mit "Datei | Neu | Resourcen-Datei (.res)" / "File | New | Recource File (.res)" eine neue Recourcendatei und geht dann so wie sonst auch vor.Ich bevorzuge diese Methode, weil es in Resourcen-Dateien durch einen Bug im Bildeditor zu Fehlern kommen kann, die die Dateien dann unbrauchbar machen.
  5. Compilerdirektive {$R}
    Nun ist es noch wichtig, dem Compiler mitzuteilen, welche Resourcendateien er einbinden soll. Dies geschieht durch die Compilerdirektive {$R}. Wenn ihr einmal eure Units durchscrollt, werdet ihr festellen, dass jede Unit diese Direktive besitzt, sofern ein Formular zur Unit gehört. Diese Direktive sieht dann so aus: {$R *.DFM}. Das bedeutet, dass alle Dateien im Verzeichnis mit der Endung DFM eingebunden werden, also alle Formulare. Auch im Projektquelltext werdet ihr diese Direktive finden, hier mit der Endung RES. Das ist dazu nötig, weil beim Erstellen der Applikation das MAINICON ausgelesen wird. Ihr müsst nun in jeder Unit, in der ihr eure Resourcen braucht diese Compilerdirektive hinzufügen, die wohl so gut wie immer {$R *.RES} lauten wird, da es wohl selten vokommt, dass ihr eure Resourcendateien in einem anderen Verzeichnis als der Projektdatei speichert.

Abrufen
  1. Bitmaps
    Für Bitmaps gibt es eine Methode, die das Abrufen zum Kinderspiel macht: LoadFromResourceName. Diese kann man dann für fast alle Komponenten, in die Icons oder Bitmaps geladen werden sollen, benutzen. Ein Beispiel ist etwa:
    ausblenden Delphi-Quelltext
    1:
    2:
    3:
    4:
    5:
    {...}
    var MyBMP: TBitmap;
    {...}
    MyBMP.LoadFromResourceName(HInstance, 'BITMAPNAME');
    {...}

    HInstance ist eine Variable, die das Handle der Applikation angibt, um die ihr euch nicht kümmern müsst, BITMAPNAME ist der Name des Bitmaps oder Icons. Dies funktioniert mit allen Objekten vom Typ TBitmap, also auch mit BitBtn.Glyph, Image.Picture.Bitmap, usw. Es gibt noch eine andere Methode zum Laden von Bitmaps: die API LoadBitmap. Diese funktioniert so ähnlich wie LoadFromResourceName, unterstützt aber keine 256-Farben-Bitmaps. Der Aufruf von LoadBitmap ist etwas anders:
    SpeedButton.Glyph.Handle := LoadBitmap(HInstance, 'BITMAPNAME');Wie ihr seht wird hier das Handle an einen anderen Befehl übergeben.
    Ihr müsst LoadBitmap benutzen, wenn ihr auf eine Komponente stoßt, die eine Zeichenfläche benutzt, die nicht TCanvas-ähnlich is und so die LoadFromResourceName-Prozedur nicht unterstützt und wenn ihr 16-Farben- Bitmaps habt und schreibfaul seid, wie alle Programmierer ;-).
    Bei LoadBitmap ist es auch möglich, bestimmte Windows-Standardicons auf eure Zeichenflächen zu laden. Dann müsst ihr für HInstance 0 (Null) eintragen und für das zweite Flag einen Wert aus der folgenden Tabelle als PChar eintragen:
    ausblenden Quelltext
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    9:
    10:
    11:
    12:
    13:
    14:
    15:
    16:
    17:
    OBM_BTNCORNERS     OBM_OLD_RESTORE
    OBM_BTSIZE         OBM_OLD_RGARROW
    OBM_CHECK          OBM_OLD_UPARROW
    OBM_CHECKBOXES     OBM_OLD_ZOOM
    OBM_CLOSE          OBM_REDUCE
    OBM_COMBO          OBM_REDUCED
    OBM_DNARROW        OBM_RESTORE
    OBM_DNARROWD       OBM_RESTORED
    OBM_DNARROWI       OBM_RGARROW
    OBM_LFARROW        OBM_RGARROWD
    OBM_LFARROWD       OBM_RGARROWI
    OBM_LFARROWI       OBM_SIZE
    OBM_MNARROW        OBM_UPARROW
    OBM_OLD_CLOSE      OBM_UPARROWD
    OBM_OLD_DNARROW    OBM_UPARROWI
    OBM_OLD_LFARROW    OBM_ZOOM
    OBM_OLD_REDUCE     OBM_ZOOMD
    So wäre ein Beispielaufruf:Image.Picture.Bitmap.Handle := LoadBitmap(0, PChar(OBM_CLOSE));
    Achtung:LoadBitmaperzeugt bei Fehlern im Gegensatz zu LoadFromResourceName nicht eine Fehlermeldung, sondern gibt als Handle 0 zurück. Das bedeutet, dass wenn die Resource zum Beispiel nicht geladen werden konnte, weil die Resourcendatei nicht eingebunden wurde, keine Fehlermeldung kommt, sondern einfach nichts als Bild angezeigt wird.
  2. Icons
    Das Laden von Icons ist auch sehr Eionfach, da es eine Methode gibt, die LoadBitmap eigentlich fast aufs Haar gleicht: LoadIcon. Die Fehlerbehandling gleicht LoadBitmap. Fast gleicht sie LoadBitmap nur, weil man zwar wieder mit der gleichen Methode Standardicons laden kann, aber diese anders sind:
    ausblenden Quelltext
    1:
    2:
    3:
    4:
    5:
    6:
    IDI_APPLICATION
    IDI_ASTERISK
    IDI_EXCLAMATION
    IDI_HAND
    IDI_QUESTION
    IDI_WINLOGO

  3. Cursor
    Mit Cursors ist das ganze ein wenig komplizierter, da man diese noch sonderlich deklarieren und ihnen eine Bezeichnung geben muss. Aber auch dazu gibt es eine Methode, nämlich LoadCursor. Zu allererst muss man dem Cursor eine Bezeichnung und eine dazugehörige Nummer beschaffen. dies macht ihr, indem ihr eine Konstante definiert:const crDummyCursor = 8;crDummyCursor ist die Bezeichnung und 5 die Nummer. Hierbei muss man aufpassen, da die Nummern 0 bis - 22 vergeben sind und ihr durch eine gleiche Nummer den alten Cursor nicht überschreibt, sondern der alte Cursor angezeigt wird. Auf der sicheren Seite seid ihr, wenn ihr euch im positiven Bereich bewegt. Die Cursor und die dazugehörigen Nummern findet ihr in der Hilfe unter TCursor.
    Nun kann man den Cursor einbinden und dann benutzen:
    ausblenden Quelltext
    1:
    2:
    Screen.Cursors[crDummyCursor] := LoadCursor(HInstance, 'CUSORNAME');
    MainForm.Cursor := crDummyCursor;
    Die LoadCursor-Funktion ist eigentlich gleich wie LoadBitmap und LoadIcon. Das bedeutet auch, dass man wieder Windows-Standard-Cursor laden kann, wenn man für HInstance 0 einsetzt und folgenden Wert als PChar für das zweite Flag einsetzt:
    ausblenden Quelltext
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    9:
    10:
    11:
    12:
    13:
    14:
    IDC_APPSTARTING
    IDC_ARROW
    IDC_CROSS
    IDC_IBEAM
    IDC_ICON (Nur Windows NT)
    IDC_NO
    IDC_SIZE (Nur Windows NT)
    IDC_SIZEALL
    IDC_SIZENESW
    IDC_SIZENS
    IDC_SIZENWSE
    IDC_SIZEWE
    IDC_UPARROW
    IDC_WAIT