Hallo,
ich vermisse in meiner Anwendung die Bitmaps auf meinen Buttons. Die Bitmaps werden
grundsätzlich über eine ImageList zugeordnet.
Variante 1 funktioniert:
Code:
public class DlgDemo : System.Windows.Forms.Form{
private System.ComponentModel.IContainer components;
private System.Windows.Forms.Button btn;
private System.Windows.Forms.ImageList Bitmaps;
// usw.
// in InitializeComponents() steht u.a.:
this.btn.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btn.ImageIndex = 11;
this.btn.ImageList = this.Bitmaps;
this.btn.Name = "btn";
this.btn.TabIndex = 5;
this.btn.Text = "&Dialog ausführen";
// usw. }
Variante 2 a definiert zunächst ein
Basisformular zf_Vorlage in einer getrennten Assembly 1 mit Verweis auf eine ImageList in einer Assembly 2:
Code:
public class zf_Vorlage : System.Windows.Forms.Form {
// Standardverweise
protected System.Windows.Forms.ImageList gb = null;
// die ImageList wird im Konstruktor unmittelbar nach InitializeComponents()
// über eine GetSingleton-Prozedur geholt:
gb = JThomas.Configs.Globale_Instanzen.Get_Bitmap_Liste();
// usw.
Das eigentliche
Formular wird davon abgeleitet. Im
Designer (Borland-
IDE) kann die
Bitmap zugeordnet werden:
Code:
public class zf_Haupteingabe : JThomas.Forms.Vorlage.zf_Vorlage {
private System.Windows.Forms.Button button1;
// in InitializeComponents() steht u.a.:
// gb
this.gb.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("gb.ImageStream")));
// button1
this.button1.ImageIndex = 1;
this.button1.ImageList = this.gb;
this.button1.Location = new System.Drawing.Point(344, 287);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(23, 23);
this.button1.TabIndex = 44;
// usw.
Im Designer ist die Bitmap auf diesem Button sichtbar, aber zur Laufzeit nicht! Warum nicht?
Variante 2 b erzeugt weitere Buttons zur Laufzeit (d.h. ohne Designer) wie folgt:
Code:
// im Konstruktor nach InitializeComponents() z.B.:
CreateButton("button2", "", this.groupHaupt, 1, 345, 287, 23, 23, 32);
// unter Verwendung der folgenden Methode:
private void CreateButton(System.String sName, System.String sText, Control Parent,
int iImage, int iLeft, int iTop, int iWidth, int iHeight, int iTabIndex) {
Parent.SuspendLayout();
System.Windows.Forms.Button ctl = new System.Windows.Forms.Button();
Parent.Controls.Add(ctl);
//
// Eigenschaften zuordnen
ctl.Location = new System.Drawing.Point(iLeft, iTop);
ctl.Name = sName;
ctl.TextAlign = ContentAlignment.MiddleCenter;
ctl.Size = new System.Drawing.Size(iWidth, iHeight);
ctl.TabIndex = iTabIndex;
//
// Image zuordnen, sofern vorgesehen
if (iImage >= 0) {
ctl.ImageIndex = iImage;
ctl.ImageList = this.gb;
ctl.Refresh(); }
Parent.ResumeLayout(); }
Dabei ist im Designer natürlich nichts zu sehen.
Die Buttons werden zur Laufzeit angezeigt, aber die Bitmaps nicht.
Der
Debug-Inspektor sagt zur Laufzeit (im letzten Code-Schnipsel bei der Zuordnung "ctl.ImageList = this.gb;"):
Zitat:
gb: ImageList
imageCollection - null reference
Wie kann gb seine Bilder verloren haben (im Designer sind sie vorhanden!), und wie kann ich sie "zur Laufzeit behalten"?
Wer kann mir Hinweise geben? Danke! Jürgen
PS. Ich wünsche
keine Diskussion über die Aufteilung in verschiedene Assemblies, die Konstruktion über ein Basisformular, eine allgemein verwendete Bitmap-Liste u.dgl. Über die Konzeption habe ich mir so viele Gedanken gemacht, dass es dabei bleibt. Basta! Mir geht es darum, wann und wie die Bitmaps sichtbar gemacht werden können; nur
insofern sind Änderungen an dieser Konzeption möglich.