Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 08.11.20 00:04 
Hallo!

Ich möchte in eine pas-Datei mehrere Icons aufnehmen, die dann zur Laufzeit verfügbar sind. Wenn ich das mit einer res-Datei mache, sind die Icons zwar verfügbar, sind aber eben auch so in die Programmdatei hineinkompiliert, dass die Anwendung dann das falsche Symbol hat und man bei Verknüpfungen alle diese Icons auswählen kann. Das soll so nicht sein!

Ich möchte die Icons nur in dieser einen Datei. Dort erzeuge ich dann zur Laufzeit ein Image, das sie als Message anzeigt - so, wie die bekannten Messagedialoge eben.

Ich benutze dafür keine dfm-Datei, also kann ich die Icons nicht einfach in einer TImageList halten.

Wie mache ich das also?


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am So 08.11.2020 um 00:14

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 08.11.20 00:08 
Du kannst die Icons einfach als RC_DATA in die Ressource schreiben, dann werden sie unabhängig von der Kennung nicht als Icons gefunden. Mit einem Ressourcenviewer sieht man sie aber natürlich dennoch, wenn das relevant ist.

Das geht direkt über den Ressourcenmanager unter Projekt --> Ressourcen und Bilder. Oder du nimmst den alten Weg mit einer selbst kompilierten Ressourcendatei (am Ende kommt das gleiche heraus).

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 08.11.20 09:24 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das geht direkt über den Ressourcenmanager unter Projekt --> Ressourcen und Bilder.
Die Datei, die die Icons verwendet, ist aber nicht Bestandteil eines bestimmten Projekts, sondern soll künftig mehrfach verwendet werden können.
Ich sehe mir das aber mal an!

Edit: Nun, das ist doch, was ich schon versucht habe: Es bindet eine .res-Datei ein.
Ich möchte aber, dass die Icons nur einer einzigen pas-Datei "bekannt" sind, diese Datei hat keine Form und ist nicht Teil des Projekts. LoadFromFile klappt nicht, weil dann zur Laufzeit im aktuellen Ordner (= Ordner des EXE) nach den ico-Files gesucht wird. Eine TImageList kann ich nicht verwenden, weil es ja keine Form gibt.

Alternativ könnte ich eine zur Laufzeit erzeugte TImageList mit den Icns befüllen, dazu muss ich sie aber aus Dateien auslesen - an sich kein Problem. Aber: Wie soll die pas-Datei zur Laufzeit diese Dateien finden? (Wenn ich nicht gerade sehr unelegant und unflexibel einen fixen Pfad angebe).

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 08.11.20 13:14 
Ich habe das vorerst so gelöst, dass ich in der rc-Datei nicht "ico1, ico2" usw., sondern "Xico1, X"ico12" etc. verwende. Habe irgendo im Netz gelesen, dass Delphi die Symbole alphabetisch nach Namen reiht, wobei MAINICON das Symbol der Programmdatei ist. Da "X" nach "M" im Alphabet kommt, mache ich das eben jetzt so. Die Symbole sind zwar immer noch alle verfügbar, aber die Anwendung hat immerhin "ihr" richtiges Symbol!

Weis jemand einen besseren Weg?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 762
Erhaltene Danke: 127



BeitragVerfasst: So 08.11.20 14:08 
Ein Icon sind doch nur wenige Pixel. Lies Dir doch einfach die paar Byte aus und schreibe Sie in ein Konstanten-Array. Aus dem Array kannst Du dann Dein Icon zeichnen.

ub60

Für diesen Beitrag haben gedankt: galagher
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 08.11.20 15:34 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Ich möchte aber, dass die Icons nur einer einzigen pas-Datei "bekannt" sind
Wenn du nicht möchtest, dass die Ressourcen anderweitig ausgelesen werden können, auch nicht über einen speziellen Namen, bleibt dir nur sie entweder zumindest nicht mit dem Ressourcen-Typ oder gleich gar nicht als Ressource zu speichern. Du könntest auch die Daten Base64 kodiert als Konstanten in eine Unit schreiben. (Nicht dass ich das empfehlen würde, aber viele andere Wege sehe ich nicht, wenn du die Daten ganz verstecken möchtest, gleichzeitig aber nur durch Einbinden der Unit verfügbar haben möchtest...)
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 08.11.20 18:16 
user profile iconub60 hat folgendes geschrieben Zum zitierten Posting springen:
Ein Icon sind doch nur wenige Pixel. Lies Dir doch einfach die paar Byte aus und schreibe Sie in ein Konstanten-Array. Aus dem Array kannst Du dann Dein Icon zeichnen.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du nicht möchtest, dass die Ressourcen anderweitig ausgelesen werden können, auch nicht über einen speziellen Namen, bleibt dir nur sie entweder zumindest nicht mit dem Ressourcen-Typ oder gleich gar nicht als Ressource zu speichern.


Ob sie über einen Namen ausgelesen werden können, ist egal, sie sollen nur nicht so "öffentlich" in der exe rumliegen. Und zum Punkt:
Zitat:
sie entweder zumindest nicht mit dem Ressourcen-Typ oder gleich gar nicht als Ressource zu speichern

Wie mache ich das? Ich kenne nur den Weg per res-Datei. Gibt's nicht so eine Art "private-res"?

Ich kann auch alle vier Icons nacheinander als externe Datei speichern und zur Laufzeit in eine TImageList laden. Das Problem ist nur: Wie findet die pas-Datei diese externe Datei zur Laufzeit? Gebe ich keinen Pfad an, sucht sie bzw. das Programm im aktuellen Ordner. Gebe ich einen hardgecodeten Pfad an, wird es natürlich funktionieren, allerdings ist das sehr unflexibel.

Sauber wäre es zB., die Daten aller Icons in eine einzige Datei schreiben und die einzelnen Icons dann daraus auszulesen. Aber wie gesagt, wie findet mein Programm diese Datei zur Laufzeit? (Ich will sie ja nicht jedesmal zu jedem Projekt dazu nehmen).

Und: Wie funktioniert das mit den Delphi-eigenen Message-Fenstern? Wo kommen da die Icons (mtInformation & Co.) her?

Edit: Ich bin an der Lösung dran: Ich wandle zuerst die Icons in Strings um (von wegen ein paar Bytes!), speichere diese Strings fix in der pas-Datei und konvertiere sie dort dann wieder in Icons. Klappt! Mal sehen...

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 08.11.20 20:13 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Ich wandle zuerst die Icons in Strings um (von wegen ein paar Bytes!), speichere diese Strings fix in der pas-Datei und konvertiere sie dort dann wieder in Icons. Klappt! Mal sehen...

Ich konvertiere sie in Bitmaps, weil die Icons so seltsam eckig aussehen. Aber sonst funktioniert das. Fazit: Problem dank eurer Anregungen gelöst! Danke!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!