Icon dynamisch erstellen [gelöst]

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
joe
Beiträge: 37
Registriert: Fr 28. Mai 2010, 15:47

Icon dynamisch erstellen [gelöst]

Beitrag von joe »

Hallo!

Ich möchte zur Laufzeit Icons generieren (um darüber z.B. Informationen im Systray anzuzeigen).
Mit Deplhi ging das so: http://www.swissdelphicenter.ch/torry/s ... php?id=426
Bei Lazarus fehlt aber die Methode TImageList.GetIcon() und mit TIcon.AssignImage() bin ich auch nicht weiter gekommen.

Hat jemand eine Idee?

Gruss, Joe
Zuletzt geändert von joe am Sa 24. Jul 2010, 22:13, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Icon dynamisch erstellen

Beitrag von theo »

Ich weiss nicht genau, was du unter "dynamisch erstellen" verstehst, aber ich mach das jetzt mal.
Unter Linux klappt folgendes, du kannst das unter Win ja mal testen.
Bin aber nicht 100% sicher, ob das dokumentiertes Verhalten ist.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var ic:TPicture;
begin
  ic:=TPicture.Create;
  ic.Bitmap.Width:=32;
  ic.Bitmap.Height:=32;
  ic.Bitmap.Canvas.Brush.Color:=clyellow;
  ic.Bitmap.Canvas.FillRect(0,0,32,32);
  ic.Bitmap.Canvas.Brush.Color:=clblue;
  ic.Bitmap.Canvas.FillRect(10,10,22,22);
  Application.Icon:=ic.Icon;
  ic.free;
end;

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Icon dynamisch erstellen

Beitrag von felix96 »

Klappt unter Windows auch
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

joe
Beiträge: 37
Registriert: Fr 28. Mai 2010, 15:47

Re: Icon dynamisch erstellen

Beitrag von joe »

Danke für die hilfreichen Antworten.

Letztlich hatte ich eine unzufriedenstelle Lösung gefunden. Mein Code war ein klein wenig Umständlicher also der von Theo. Ich hatte zuerst ein TBitmap erstellt und die dann per Assign einem TIcon zugewiesen.
Funktionierte so halbwegs. Problem war, dass ich da noch eine Zuweisung auf's Pixelformat drin hatte.
Mit folgende Änderungen funktioniert der Code bei mir zwar weiterhin unter Windows, aber nicht mehr unter Linux (mit Widget GTK2 unter Kubuntu 10.04):

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var ic:TPicture;
begin
  ic:=TPicture.Create;
  ic.Bitmap.PixelFormat:=pf4bit;    // <- HIERmit gibt's Probleme unter Linux
  ic.Bitmap.Width:=32;
  ic.Bitmap.Height:=32;
  ic.Bitmap.Canvas.Brush.Color:=clyellow;
  ic.Bitmap.Canvas.FillRect(0,0,32,32);
  ic.Bitmap.Canvas.Brush.Color:=clblue;
  ic.Bitmap.Canvas.FillRect(10,10,22,22);
  ic.Bitmap.Mask(clblue);           // <- HIER fuer Transparenz
  Application.Icon:=ic.Icon;
  TrayIcon1.Icon:=ic.Icon;          // <- HIER fuer TrayIcon
  ic.free;
end;

Das AppIcon ist komplett gelb und das TrayIcon weiss. Ohne Zuweisung auf PixelFormat funktioniert es aber (Danke!).

Kleines Problem habe ich noch mit der Transparenz. Die funktioniert unter Linux zwar am AppIcon, aber offenbar nicht beim TrayIcon (Transparente Bereiche werden weiss dargestellt). Unter Windows geht's hingegen. Ich werd' da wohl mal einen Bug zu schreiben (oder mache ich noch was falsch?).

Gruss, Joe.

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Icon dynamisch erstellen

Beitrag von _X_ »

joe hat geschrieben:Kleines Problem habe ich noch mit der Transparenz. Die funktioniert unter Linux zwar am AppIcon, aber offenbar nicht beim TrayIcon (Transparente Bereiche werden weiss dargestellt). Ich werd' da wohl mal einen Bug zu schreiben (oder mache ich noch was falsch?).
Ich kenne das Problem bei GTK2, bei QT4 ist alles so, wie es sein soll. Ich würd bei gtk2 auf nen Bug tippen. Mir ist außerdem aufgefallen, dass auch python-gtk2-trayicons nicht transparent sind. Ich hab hier KDE4, wie's mit XFCE, bzw. Gnome aussieht kann ich nicht sagen.

mfg _X_

joe
Beiträge: 37
Registriert: Fr 28. Mai 2010, 15:47

Re: Icon dynamisch erstellen

Beitrag von joe »

_X_ hat geschrieben:...bei QT4 ist alles so, wie es sein soll.
Ich würde meine App auch mal gerne mit dem QT WidgetSet kompilieren, bekomme aber immer diverse Fehlermeldungen. Hast du evtl. einen Tip oder Link dazu?
Das mit der Transparenz des TrayIcon unter Gnome werde ich mal noch untersuchen - XFCE evtl. auch.

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Icon dynamisch erstellen

Beitrag von _X_ »

Könnte daran liegen, das die libqt4pas nicht installiert ist. Mehr kann ich ohne die Fehlermeldungen nicht sagen.

mfg _X_

joe
Beiträge: 37
Registriert: Fr 28. Mai 2010, 15:47

Re: Icon dynamisch erstellen

Beitrag von joe »

_X_ hat geschrieben:Könnte daran liegen, das die libqt4pas nicht installiert ist.
Hmm, irgendwie stelle ich mich dazu heute zu blöd an.
Weder mit KPackagekit, Synaptic oder apt-cache search kann ich libqt4pas (früher hieß das wohl libqt4intf) finden.
Gemäß http://www.lazarus.freepascal.org/index ... 889.0.html funktioniert es bei mir also nicht.
Ok, hab mir jetzt libqt4pas5_2.1Qt4.5.3-1_i386.deb von http://packages.debian.org/de/squeeze/i ... 5/download gezogen und installiert.
Dann noch libqt4pas-dev_2.1Qt4.5.3-1_all.deb installiert (hab ich auch irgendwo bei packages.debian.org gefunden).
In meinem Lazarus Projekt musste ich dann noch im Unit Suchpfad "/usr/lib/lazarus/0.9.28.2/lcl/interfaces/qt/" eingeben, weil der Compiler die Unit "Interfaces" nicht finden konnte (der sucht offenbar in "/usr/lib/lazarus/0.9.28.2/lcl/units/i386-linux/qt/").
Dennoch bleibt eine Fehlermeldung beim linken:

Code: Alles auswählen

/usr/bin/ld: warning: /D/Pas/ChipDrive/Out/link.res contains output sections; did you forget -T?
/usr/bin/ld: cannot find -lqt4intf
TV.lpr(25,1) Error: Error while linking
TV.lpr(25,1) Fatal: There were 1 errors compiling module, stopping
...brauche ich doch libqt4intf anstelle von libqt4pas?!
Bin nachhaltig etwas verwirrt. :roll:

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Icon dynamisch erstellen

Beitrag von knight »

joe hat geschrieben:brauche ich doch libqt4intf anstelle von libqt4pas?!


Die "Umbenennung" des Pakets dürfte nach der Freigabe von Lazarus 0.9.28 erfolgt sein. Für die Verwendung von libqt4pas wirst du um eine aktuelle Lazarus-Version (0.9.29) wohl nicht herumkommen.

knight

joe
Beiträge: 37
Registriert: Fr 28. Mai 2010, 15:47

Re: Icon dynamisch erstellen

Beitrag von joe »

Ok, dann werd' ich wohl mal auf die Veröffentlichung der 0.9.29 warten...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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: Icon dynamisch erstellen

Beitrag von af0815 »

joe hat geschrieben:Ok, dann werd' ich wohl mal auf die Veröffentlichung der 0.9.29 warten...

Oder den SVN verwenden
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

joe
Beiträge: 37
Registriert: Fr 28. Mai 2010, 15:47

Re: Icon dynamisch erstellen

Beitrag von joe »

af0815 hat geschrieben:
joe hat geschrieben:Ok, dann werd' ich wohl mal auf die Veröffentlichung der 0.9.29 warten...
Oder den SVN verwenden
Ja, damit sollte ich mich wohl mal vertraut machen.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Icon dynamisch erstellen

Beitrag von Socke »

joe hat geschrieben:Ok, dann werd' ich wohl mal auf die Veröffentlichung der 0.9.29 warten...

Da wirst du lange warten können... Die ungeraden Releasenummer (letzte Zahl) sind immer Entwicklungsversionen (wie beim Linux-Kernel). Die nächste Veröffentlichung wird also Version 0.9.30 sein.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten