Form.icon

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
MiPraSo
Beiträge: 8
Registriert: Di 23. Mai 2023, 18:47
OS, Lazarus, FPC: Win 10, Lazarus 2.2.6, FPC 3.2.2, i386-win32-win32/win64
CPU-Target: 64 Bit

Form.icon

Beitrag von MiPraSo »

Hallo,

zu meinem Hintergrund: Ich habe mit TuroPascal angefangen bin dann bei Delphi gelandet. Meine letzte DLL habe ich für den html Editor Phase 5 entwickelt, sie ist heute noch bei mir im Einsatz und als PD verfügbar, für den oben genannten Editor. Dann habe ich viel mit PHP und MySQL gearbeitet. Durch eine gesundheitliche Auszeit seit Februar konnte ich mich jetzt endlich mal mit Lazarus beschäftigen. Leider ist Dokumentation für Lazarus in Papierform oder im www nicht so gut wie damals die 1 Meter Papier von Borland.

Ich konnte schon einiges selbst lösen und auch hier im Forum und auch über das www finden.

Ich suche eine Lösung zu einem Grafikproblem für das Form.Icon links oben auf den Forms.
Mein Ansatz für mein Projekt ist folgender:
Ich benötige in einigen meiner Formulare die gleiche statische Grafik zur Anschauung.
In einer Form habe ich diese ca. 15 verschieden Bilder in Timage über das manuelle „Laden“ abgelegt. In diesen Formular werden sie dann im:

Code: Alles auswählen

procedure TBilderForm.FormCreate(Sender: TObject);
begin
  Picture50 := TPicture.Create;
  Picture50.Assign(Image50.Picture);
….
end;
generiert und als public bekannt gemacht.

In den Aufrufen der anderen Formulare kopiere ich die Bilder dann in die leeren Timage Komponente:

Code: Alles auswählen

procedure Form1.FormCreate(Sender: TObject);
begin
  IMG1.Picture.Assign(Picture50);
…
 end;   
Dies funktioniert soweit ohne Probleme.

Jetzt wollte ich dies auch für das Form.Icon so übernehmen. Grundidee war, ich lade das Icon auch manuell in Timage, was auch funktioniert und alle Formulare können es beim FormCreate setzen und anzeige. Ich habe viel probiert, mit wenig Erfolg, es wird nicht angezeigt oder der Compiler meldet eine Verletzung der Typenkonvertierung.

Bin für Ideen offen…

Michael

System:

Windows 10 Pro Version 22H2, 64-Bit-Betriebssystem, x64-basierter Prozessor

Lazarus 2.2.6, FPC 3.2.2, i386-win32-win32/win64
Zuletzt geändert von MiPraSo am Di 23. Mai 2023, 22:48, insgesamt 1-mal geändert.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 155
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Form.icon

Beitrag von Jorg3000 »

Hi!
Versuch mal:

Code: Alles auswählen

Form1.Icon.Assign( Picture50.Bitmap );
Hab's nicht getestet, sondern im Quellcode gesehen, dass TIcon.Assign neben .ico nur von TRasterImage lesen kann, z.B. TBitmap.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6118
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Form.icon

Beitrag von af0815 »

Hallo und willkommen,

ein Hinweis am Anfang, wenn du bei den Dekorationen der Forms oder anderer sichtbarer Objekte was änderst, kann es es sein, das du auf Probleme stösst. Die LCL ist ausgelegt auf verschiedenen Plattformen zu laufen. Daher kann es sein, das etwas unter Windows noch funktioniert, unter einem Linux aber nicht mehr. Das kommt daher das bei vielen Komponenten, die originalen Komponenten des Widgetsets von der LCL gewrapped werden, ähnlich wie bei Delphi die VCL das macht. Nur unterscheiden sich LCL und VCL in den tieferen Schichten enorm.

Daher stellt sich immer die Frage, in deinem Fall - bleibt das eine Windows only Applikation oder sollte die auf verschiedenen Widgetsets/Plattformen laufen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MiPraSo
Beiträge: 8
Registriert: Di 23. Mai 2023, 18:47
OS, Lazarus, FPC: Win 10, Lazarus 2.2.6, FPC 3.2.2, i386-win32-win32/win64
CPU-Target: 64 Bit

Re: Form.icon

Beitrag von MiPraSo »

Jorg3000 hat geschrieben:
Di 23. Mai 2023, 22:45
Hi!
Versuch mal:

Code: Alles auswählen

Form1.Icon.Assign( Picture50.Bitmap );
Hab's nicht getestet, sondern im Quellcode gesehen, dass TIcon.Assign neben .ico nur von TRasterImage lesen kann, z.B. TBitmap.
Das habe ich auch schon probiert, hat nicht funktioniert. Ich werde weiter forschen. :)

MiPraSo
Beiträge: 8
Registriert: Di 23. Mai 2023, 18:47
OS, Lazarus, FPC: Win 10, Lazarus 2.2.6, FPC 3.2.2, i386-win32-win32/win64
CPU-Target: 64 Bit

Re: Form.icon

Beitrag von MiPraSo »

af0815 hat geschrieben:
Mi 24. Mai 2023, 07:42
Hallo und willkommen,

ein Hinweis am Anfang, wenn du bei den Dekorationen der Forms oder anderer sichtbarer Objekte was änderst, kann es es sein, das du auf Probleme stösst. Die LCL ist ausgelegt auf verschiedenen Plattformen zu laufen. Daher kann es sein, das etwas unter Windows noch funktioniert, unter einem Linux aber nicht mehr. Das kommt daher das bei vielen Komponenten, die originalen Komponenten des Widgetsets von der LCL gewrapped werden, ähnlich wie bei Delphi die VCL das macht. Nur unterscheiden sich LCL und VCL in den tieferen Schichten enorm.

Daher stellt sich immer die Frage, in deinem Fall - bleibt das eine Windows only Applikation oder sollte die auf verschiedenen Widgetsets/Plattformen laufen.
Danke für den Hinweis,

im Moment ist erst mal Windows mein Ziel, ich konvertiere im Moment ein fast 20 Jahre altes html Projekt (ist immer noch online) in ein Programm, als Übung.
Habe schon einen Parser/Konverter erstellt, der meine codierten html Tabellen in xml übersetzt, diese lassen sich dann in ein Stringgrid einlesen.

Ubuntu und raspberry pi ist auch ein Ziel, sind hier auch im Einsatz.

Endziel ist mit laz4android2.0.12 eine APP daraus zu erstellen.
Zuletzt geändert von MiPraSo am Mi 24. Mai 2023, 23:31, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 4781
Registriert: Fr 8. Apr 2011, 09:01

Re: Form.icon

Beitrag von wp_xyz »

MiPraSo hat geschrieben:
Mi 24. Mai 2023, 22:55
Das habe ich auch schon probiert, hat nicht funktioniert. Ich werde weiter forschen. :)
Wenn ich das Problem richtig verstanden habe, geht es darum, eines der im Programm verfügbaren Bilder (TPicture) als Form-Icon zu verwenden. Das funktioniert einwandfrei - siehe beigefügtes Programm (auf den Button klicken, und es wird ein png-Bild geladen und als Form-Icon dargestellt). Wenn es das bei dir nicht tut, muss etwas anderes faul sein.
Dateianhänge
picToIcon.zip
(2.24 KiB) 32-mal heruntergeladen

MiPraSo
Beiträge: 8
Registriert: Di 23. Mai 2023, 18:47
OS, Lazarus, FPC: Win 10, Lazarus 2.2.6, FPC 3.2.2, i386-win32-win32/win64
CPU-Target: 64 Bit

Re: Form.icon

Beitrag von MiPraSo »

Der Ansatz ist sehr gut, nur möchte ich alles in eine exe packen und nicht aus einer Datei laden. Grundidee als Anhang.

In Unit2 / Form2 sind die Images statisch hinterlegt, der Menüeintrag lässt ich hinterher nicht mehr aufrufen, die Unit wird als erstes im Main (Unit1) aufgerufen damit die Bilder verfügbar sind.
Dies funktioniert, wie oben schon beschrieben für die Bilder im Programm die in den anderen Formularen benötigt werden.

In Unit3 / Form3 hätte ich jetzt gerne Image1 aus Unit2 / Form2 als Icon.
In Unit4 / Form4 hätte ich jetzt gerne Image2 aus Unit2 / Form2 als Icon.

Da das Projekt ca. 100 statische Formulare umfassen und nur ca. 20 identische Bilder und 10 Icons benötigt, würde ich gerne die exe klein halte und die Bilder/Icons zur Laufzeit generieren.
Dateianhänge
Icon0.zip
(147.44 KiB) 19-mal heruntergeladen

wp_xyz
Beiträge: 4781
Registriert: Fr 8. Apr 2011, 09:01

Re: Form.icon

Beitrag von wp_xyz »

MiPraSo hat geschrieben:
Fr 30. Jun 2023, 23:51
In Unit3 / Form3 hätte ich jetzt gerne Image1 aus Unit2 / Form2 als Icon.
In Unit4 / Form4 hätte ich jetzt gerne Image2 aus Unit2 / Form2 als Icon.
Das würde ich auf keinen Fall so machen, denn dadurch erzeugst du dir eine unüberschaubare Abhängigkeit zwischen den Units.

Wenn alle Bilder gleich groß sind, bietet es sich an, sie in eine ImageList zu laden. Diese packst du auf ein Datamodule, das bei allen Formularen, die Bilder davon brauchen, in der uses-Liste erscheint. Das Datamodule muss in der Datei-Liste der Projekt-Optionen ganz an den Anfang geschoben werden, damit es schon existiert, wenn ein Formular Bilder benötigt. Das wäre die Methode der Wahl für Toolbar und Menü-Icons.

Die ImageList von Laz 2.0+ kann auch unterschiedliche Bildgrößen speichern, z.B. etwas größere für Toolbar und etwas kleiner für das Menü. Wenn du das so willst, müsstest du nochmals fragen, denn da muss ich wahrscheinlich noch etwas erklären.

Wenn die Bilder völlig unterschiedlich in der Größe sind, würde ich sie in eine Resource packen - siehe beigefügtes Beispiel-Projekt: Kopiere alle Bilder in einen Ordner deines Projektes (nicht unbedingt nötig, aber nur so bleibt alles beisammen), schreibe eine Batch-Datei, die mit "dir /b" eine Dateiliste erstellt (oder erstelle die Liste von Hand, wenn die Bilder in verschiedenen Verzeichnissen sind) und gib diese Dateiliste im folgenden Aufruf von lazres an. LazRes erstellt aus den Bildern eine .res-Datei, die beim Kompilieren in die exe eingebunden wird. LazRes musst du allerdings vor der ersten Anwenung selbst kompileren; der Quellcode ist im Ordner "tools" der Lazarus-Installation.

In der Projekt-Datei fügst du dann eine Zeile {$R images.res} ein, wobei das "images.res" den Namen der Resource-Datei bezeichnen soll, der beim Erstellen mit LazRes vergeben wurde.

Um nun ein Bild aus der Resource in ein TImage zu laden, rufst du einfach

Code: Alles auswählen

  Image.Picture.LoadFromResourceName(HINSTANCE, bild)
wobei du für "bild" den Dateinamen des Bildes einsetzt, aber ohne Extension.

Du kannst natürlich auch beide Verfahren mischen: Toolbar-, Menü und Button-Bilder in eine zentrale ImageList, und sonstige Bilder (Zeichnungen, Hintergrundbilder und was auch immer) in die Resource.
Dateianhänge
images_in_resource.zip
(16.65 KiB) 22-mal heruntergeladen

MiPraSo
Beiträge: 8
Registriert: Di 23. Mai 2023, 18:47
OS, Lazarus, FPC: Win 10, Lazarus 2.2.6, FPC 3.2.2, i386-win32-win32/win64
CPU-Target: 64 Bit

Re: Form.icon

Beitrag von MiPraSo »

Ich habe jetzt eine Lösung gefunden. Ob sie elegant und portabel ist mag ich nicht beurteilen.
Sie macht was ich möchte und ist aus meiner Sicht gut wartbar. In meinem Projekt sind in der der Unit mit der Imagelist noch mehr visuelle Komponenten abgelegt, deshalb wird sie in jeder Unit mit Formular mit eingebunden.

Den Hinweis mit dem Ablauf habe ich englischsprachigen Lazarus Form und bei Stack Overflow gefunden. Wichtig ist wohl, dass die Zuweisung so erfolgt:

Code: Alles auswählen

procedure TForm3.FormActivate(Sender: TObject);
begin
  IconForm.IconIL.GetIcon(0, Form3.icon);
  OnActivate := Nil;
end;
Wenn es jemand auf anderen Plattformen testen möchte…
Unter Windows 10, 64 Bit funktioniert es.
project1.zip
(127.35 KiB) 9-mal heruntergeladen

charlytango
Beiträge: 813
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.2.6
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Form.icon

Beitrag von charlytango »

MiPraSo hat geschrieben:
Mo 14. Aug 2023, 19:26
Ob sie elegant und portabel ist mag ich nicht beurteilen.
Eleganz ist in diesem Fall nicht das Kriterium.
Ob dein Iconform zur Laufzeit bereits exitiert wenn ZB Unit2 ein Icon daraus benutzt allerdings schon.

Das was dir wp_xyz vorgeschlagen hat:
wp_xyz hat geschrieben:
Sa 1. Jul 2023, 01:43
Diese packst du auf ein Datamodule, das bei allen Formularen, die Bilder davon brauchen, in der uses-Liste erscheint. Das Datamodule muss in der Datei-Liste der Projekt-Optionen ganz an den Anfang geschoben werden, damit es schon existiert, wenn ein Formular Bilder benötigt.
hat durchaus seine Berechtigung.
Ein Datenmodul ist übrigens eine Art unsichtbares Formular das zum Verankern von Komponenten (in deinem Fall eben der Imagelist) in der GUI dient.

In den Objektoptionen steht dein Formular IconUnit übrigens an dritter Stelle womit nicht gesichert ist dass das Formular existiert wenn Main und Unit2 darauf zugreifen.

Besonders beim Arbeiten mit vielen Formularen ist es eine gute Strategie nur das Startformular von Lazarus erzeugen zu lassen und sich um alle anderen Formulare selbst zu kümmern. Dann hat man das Problem mit der Erstellreihenfolge selbst in der Hand.

MiPraSo
Beiträge: 8
Registriert: Di 23. Mai 2023, 18:47
OS, Lazarus, FPC: Win 10, Lazarus 2.2.6, FPC 3.2.2, i386-win32-win32/win64
CPU-Target: 64 Bit

Re: Form.icon

Beitrag von MiPraSo »

Ok,

das war ein „Muster“, im aktuellen Projekt wird nach dem Main Formular sofort die Ressource für die Bilder aufgerufen. Das Main Formular bekommt ein statisches Icon. Dann sollte es klappen.

Mit den Datenmodulen (*.res) hadere ich noch, habe fast 20 Jahre keine Zeile Delphi in die Tasten getippt. Das letzte RAD Pack von Borland, welches ich hier habe ist von 1995!

Trotzdem bleibe ich in der Pascal/Lazarus Umgebung, ich kenne keinen Compiler der so intolerant bei Fehlern ist. Zum Glück! :D

wp_xyz
Beiträge: 4781
Registriert: Fr 8. Apr 2011, 09:01

Re: Form.icon

Beitrag von wp_xyz »

MiPraSo hat geschrieben:
Mo 14. Aug 2023, 22:19
Mit den Datenmodulen (*.res) hadere ich noch, habe fast 20 Jahre keine Zeile Delphi in die Tasten getippt.
res-Dateien haben nichts mit Datenmodulen zu tun...

MiPraSo
Beiträge: 8
Registriert: Di 23. Mai 2023, 18:47
OS, Lazarus, FPC: Win 10, Lazarus 2.2.6, FPC 3.2.2, i386-win32-win32/win64
CPU-Target: 64 Bit

Re: Form.icon

Beitrag von MiPraSo »

Man lernt ja nie aus.
Habe jetzt mal ein Datenmodul integriert und das so wie vorgeschlagen umgesetzt.
Alls da rein was „global“ an Bildern und Kostanten benötigt wird.

Ich dachte dann würde eine „*.res“ draus, ist aber eine normale „Unit.pas“ Datei geworden.

Ihr habt mir den Widereinstig ermöglicht. Es hat sich doch einiges geändert in den letzten 20 Jahren.

wp_xyz
Beiträge: 4781
Registriert: Fr 8. Apr 2011, 09:01

Re: Form.icon

Beitrag von wp_xyz »

MiPraSo hat geschrieben:
Di 15. Aug 2023, 15:30
Ich dachte dann würde eine „*.res“ draus, ist aber eine normale „Unit.pas“ Datei geworden.
Naja, eine "normale Unit" wäre zu wenig. Ein Datenmodul ist sowas wie ein Formular, aber nur für nicht-visuelle Controls. Da kommen oft Datenbank-Komponenten und -Verbindungen rein, aber auch Image- und ActionListen habe ich schon reingepackt. Zu einer Datenmodul-Unit gehört auch immer eine lfm-Datei, wie bei einem Formular. Für Typ-Deklarationen, globale Variablen, Konstanten usw. ist mir ein Datenmodul zu aufwendig, eine normale Unit würde dafür auch reichen.

Antworten