Einzelnen Beitrag anzeigen

Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#1

Button.Image (d.h. Bitmap) wird nicht angezeigt

  Alt 22. Aug 2006, 17:04
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.
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat