Aufruf eines Forms aus einer Klasse

OliWan

Mitglied
Hallo Coder,

ich bin immer noch neu in C# und kämpfe mit Basics ;-(

Also: Ich habe da ein Klasse gebaut, die Daten verarbeitet. Als Resultat
speichert Sie ein Bitmap.

Nun möchte ich das Bitmap in einem Winform aufrufen um dem Nutzer
zu ermöglichen, Das Bild zu Drucken, es per Mail zu verschicken etc.

Nur leider raffe ich nicht, wie ich den Filename an das Winform übergebe, damit es angezeigt wird ;-(

Bitte kann mir jemand helfen

Hier meine Code-idee:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Collections;
using System.ComponentModel;
using System.Data;

namespace csExample
{
[Guid("d9472cd1-bf89-42d5-a6c5-3b58156562f4"), ClassInterface(ClassInterfaceType.None)]

public class NotifyClass : ServiceApplication
{

object ServiceApplication.Notify(string service, object data)
{
object ret = null;
string filename="";

try
{
// Initialize the service
...hier passiert irgendwas....
filename="C:\\bitmap.bmp";

WinForm wf = new WinForm();
wf.show(filename);

Wenn ich das mache, bekomme ich immer die Fehlermeldung:

csExample.WinForm(string) hat die falsche Signatur, um ein Einstiegspunkt zu sein
Keine Überladung für die Mehtode 'Winform' erforder () Argumente
csExample.WinForm enthält keine Definition für show


} catch
{
}
retrurn ret;
}

}// Ende Puplic Class

public class WinForm : System.Windows.Forms.Form
{
/// <summary>
/// Erforderliche Designervariable
/// </summary>
private String image;
private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.PictureBox pictureBox1;

public WinForm(string arg)
{

image = arg;
InitializeComponent();
}

protected override void Dispose (bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}

private void InitializeComponent()
{
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.Location = new System.Drawing.Point(24, 32);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(264, 320);
this.pictureBox1.TabIndex = 4;
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(448, 405);
this.Controls.Add(this.pictureBox1);
this.Name = "WinForm";
this.Text = "services";
this.Load += new System.EventHandler(this.WinForm_Load);
this.ResumeLayout(false);
}
#endregion

[STAThread]
static void Main(string arg)
{
Application.Run(new WinForm(arg));
}

private Bitmap MyImage ;


private void WinForm_Load(object sender, System.EventArgs e)
{

this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage ;
MyImage = new Bitmap(image);
this.pictureBox1.Image = (Image) MyImage ;

}

private void pictureBox1_Click(object sender, System.EventArgs e)
{

}

}

} // Ende Namespace Klammer







:rolleyes: :rolleyes: :-( :-( WinForm wf = new WinForm(); wf.show(filename);
 
Hallo,

übergib das Bild doch einfach mit dem Konstruktor an WinForm. Also einfach Konstruktor überladen oder den Default Kontruktor abändern.

Gruß
Arcaton
 
Hey Arcaton,

thx für die Antwort nur leider spreche ich nur ein paar Brocken Coder-Sprache.

Was heist - mit dem Konstruktor überladen / übergeben....

;-()

OliWan
 
Hallo,

sehe Grad das dein Konstruktor schon ganz richtig ist, hab ich vorhin übersehen, sry. Dein Konstruktor erwartet einen Parameter vom Typ string,
Code:
public WinForm(string arg)
{
  image = arg;
  InitializeComponent();
}

wenn du also ein neues Objekt der Klasse WinForm erstellst, musst du ihm einen Parameter mitgeben, was bei dir wohl der Filename sein wird, sprich du musst deinen Aufruf
WinForm wf = new WinForm();
entprechend abändern, da ein Parameter verlangt wird und deine WinForm keinen Standardkonstruktor hat. Also einfach den Filename an den Konstruktor übergeben und die die Form anzeigen lassen:
wf.show();.

Gruß
Arcaton
 
....

WinForm wf = new WinForm();
wf.show(filename);

Wenn ich das mache, bekomme ich immer die Fehlermeldung:

csExample.WinForm(string) hat die falsche Signatur, um ein Einstiegspunkt zu sein
Keine Überladung für die Mehtode 'Winform' erforder () Argumente
csExample.WinForm enthält keine Definition für show

...ich habe die public class WinForm einfach in die Klammers des
namespaces csExample rein kopiert - liegt darin evtl. der Fehler ?!

Gruß OliWan
 
Hallo,

bin zwar auch noch Neuling auf dem Gebiet C# aber versuch´s mal mit:

Code:
WinForm wf = new WinForm(this);
wf.Parent = this;
wf.Show();

Die Grafik musst Du dann allerdings in der Form "WinForm" aufrufen/anzeigen.


Gruß
Dennis
 
Zuletzt bearbeitet:
Hallo,

ich würde es so machen:

Code:
WinForm wf = new WinForm(filename);
wf.show();

in dem Konstruktor von WinForm:
Code:
public WinForm(string filename)  
{
   ...
   Image img = new Image();
   img.FromFile(filename);
   ...
}

einfach das Bild laden.

Gruß
Arcaton
 
Erst mal danke für alle eure Hilfe!

Zunächstmal habe ich die Pubilic WinForm aus dem Script rausgeworfen und
über das Menu ein WinForm eingefügt. So bildete der #-Builder auch gleich eine entsprechende Klasse im Namespace...

Na ja und dann funktionierte der Aufruf mit

WinForm1 wini = new WinForm1(filename);
wini.Show();

...jedoch blieb das Fenster nicht offen, sondern ging nach 3-5 Sekunden einfach wieder zu ?!

Nun habe ich den Aufruf mit

WinForm1 wini = new WinForm1(filename);
Application.Run(wini);
wini.Show();

zum laufen bekommen.

Kann mir hier jemand erklären, was genau der Unterschied zwischen beiden Aufrufen ist? - Ist es so, daß der Aufruf mit Application das WinForm als neue,
eigenständige Applikation lädt, die separat einen Close Befehl bekommen muss?

Warum hat sich das WinForm im ersten Fall selbstständig wieder geschlossen?

oh oh, und da ich gerade neu bin...

muss man immer regasm und gacutil machen oder gibt es dafür eine patentere Lösung?


oh oh, immer wenn man mit einer Frage anfängt, kommen 20 dazu... danke für
eure Geduld

;-)

OliWen

...may the force be with you
 
Zurück