Autor Beitrag
C# Neuling
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 19.03.10 14:24 
Hallo zusammen,

Ich bin neu hier und zudem anfänger was C# betrifft. Ich habe folgendes Problem:

Aufgabenstellung ist mithilfe eines Buttons ein Bild in die Form zu laden, ohne PictureBox. Dabei soll es möglich sein den Pfad zu einem anderen Bild in ein Texfeld zu schreiben und mit klick auf den Button sollte das neue Bild geladen werden und das alte gelöscht. Zudem sollte es möglich sein die Formgröße zu ändern ohne dass sich die seitenverhältnisse des bildes ändern.

Alles soweit kein Problem. Nur passiert nach dem erstmaligen Laden eines Bildes folgendes:

Das erste bild wurde nach einem Klick erfolgreich geladen. Nach ändern des Pfades zu einer anderen Datei wird jedoch das neue Bild schon alleine durch das berühren des Buttons mit der Maus(ohne zu klicken) geladen das alte jedoch nicht gelöscht. Nach dem Klick erfolgt dann das löschen des alten Bildes. Ich vermute dass dies daran liegt dass sobalt ich den Button berühre, der dann eine andere Rahmenfarbe bekommt, das Paintereignis ausgelöst wird, da das Steuerelement neu gezeichnet wird.

Gibt es irgendeine möglichkeit den Button so einzustellen dass er nicht allein durch berühren der Maus verändert wird und somit das Paintereignis nicht aufgerufen wird?

Vorab schon mal vielen dank für eure Hilfe
Mit freundlichen Grüßen
C# Neuling
Nemag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 2



BeitragVerfasst: Fr 19.03.10 14:40 
Ich schätze jetzt mal du wertes das verkehrte Ereignis aus.

Der Button hat ein Click-Event, dies ist genau das welches du nehmen solltest. (Nicht MouseClick, MouseHover oder sowas)

Was machst du denn eigentlich mit dem Paint-Ereignis? Ich hoffe du hast das Bild einfach der Form als BackGroundImage mitgegeben (BackGroundImageLayout = Center) oder zeichnest du das irgendwie selbst?
C# Neuling Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 19.03.10 14:47 
Nein Leider habe ich genau das "click" event genommen nicht MouseClick.

Aber trozdem danke.

Moderiert von user profile iconChristian S.: Beiträge zusammengefasst

Hatte ich zu beginn mit dem BackGroundImage. Aber leider darf ich das nicht verwenden (Anweisung des Lehrers :()

Das ganze ist ein Schulprojekt deshalb muss ich mich da dran halten.

Komischerweise hat es in der schule auch problemlos geklappt nur sobalt ich das gleiche Programm zuhause geöffnet hatte war dieser Fehler da.

Also ja ich zeichne selber :)
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Fr 19.03.10 15:01 
Vielleicht zeigst du mal ein bisschen Code. Der ist nämlich eindeutig. Manchmal ist es ein Unterschied was man machen will und was der Code macht ;)

Du könntest es vlt. umgehen, wenn du nicht bei jedem Paint das Bild aus der Datei lädst, sondern dies nur beim Button click machst:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
OnPaint( ...)
{
  e.DrawImage(image);
}

ButtonClick()
{
   image = Bitmap.FromFile(imagePFad);
}


Gruß
C# Neuling Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 19.03.10 15:36 
Aber nicht auslachen :)
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
  public partial class MainForm : Form
  {
    float FaktorB, FaktorH, Faktor;
    bool freigabe = false;
    
    public MainForm()
    {
      InitializeComponent();
      txt_pfad.Text = "C:\\Dokumente und Einstellungen\\Administrator\\Desktop\\ET4\\bild\\Labrador.jpg";
                        this.ResizeRedraw = true;
    }

        private void btn_bild2_Click(object sender, EventArgs e)
        {
            this.Invalidate();
            freigabe = true;
        }
    
    void MainFormPaint(object sender, PaintEventArgs e)
    {
                            if (freigabe == true)
        BildLaden();
    }
    void BildLaden()
    {
                Graphics bild = this.CreateGraphics();
                bild.PageUnit = GraphicsUnit.Pixel;
                try
                    {
                        Image img = Image.FromFile(txt_pfad.Text);
                        txt_form_h.Text = Convert.ToString(img.Size.Height);
                        txt_format_b.Text = Convert.ToString(img.Size.Width);
                        FaktorB = img.Size.Width / (float)(this.Size.Width);
                        FaktorH = img.Size.Height / (float)(this.Size.Height);
                        if (FaktorB >= FaktorH)
                            Faktor = FaktorB;
                        else
                            Faktor = FaktorH;
                        if (Faktor < 1)
                            Faktor = 1;
                        bild.DrawImage(img, new Rectangle(550, (int)(img.Size.Width / Faktor - 80), (int)(img.Size.Height / Faktor - 80)));
                    }
                    catch
                    {
                        MessageBox.Show("Datei oder Pfad ungültig");
                    }


Moderiert von user profile iconChristian S.: Quote- durch C#-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 19.03.10 16:39 
Hallo!

Ich denke, das Problem lässt sich lösen, wenn Du das Bild nicht bei jedem Neuzeichnen von der Platte lädst (was ja irgendwo Quatsch ist), sondern nur einmal beim Klick auf den Button. Das dürfte alles deutlich beschleunigen und außerdem Dein Problem lösen.

Grüße
Christian


//Edit: Zeichnen dann weiterhin in der Paint-Methode.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
C# Neuling Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 19.03.10 16:47 
Und wie stelle ich das an dass ich das nichtmehr von der Platte laden muss?

Achso verstanden danke ich probiers mal aus


Zuletzt bearbeitet von C# Neuling am Fr 19.03.10 16:51, insgesamt 1-mal bearbeitet
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Fr 19.03.10 16:49 
Das kannst du nicht verhindern :) Er meint nur noch einmal von der Platte laden. (Die gleiche Idee wie ich auch schon geschildert habe).

Da steht eigentlich "alles" ;)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 19.03.10 16:49 
Du musst img zu einem Feld Deiner Klasse machen, damit Du es in der Click-Methode füllen kannst und in der Paint-Methode dann den Inhalt nur noch benutzt.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
C# Neuling Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 19.03.10 16:53 
Ja war grade etwas zu langsam beim zweiten mal durchlesen der Antwort hats dann klick gemacht wie gesagt ich probiers mal aus
C# Neuling Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 19.03.10 17:08 
Also ich bekomm das nicht ganz hin es heist immer das image im aktuellen kontext nicht vorhanden ist. Ich kenn mich mit dem Klassenzeug noch nicht so recht aus. Wie soll das denn klappen? Gibts sowas wie einen Image Datentyp dass ich ne Variable so deklariren kann oder wie soll das gehen?
C# Neuling Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 19.03.10 17:20 
Ha ich habs danke jungs echt gute und schnelle Hilfe.

Ich stell gleich mal mein gesamten Quelltext rein dann könnt ihrs euch nochmal anschaun.

Vielen Dank nochmal
C# Neuling Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 19.03.10 17:29 
Hier der gesamte Quelltext

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace Wackershauser_et4
{
  public partial class MainForm : Form
  {
    float FaktorB, FaktorH, Faktor;
    bool freigabe = false;
    Image img;
    public MainForm()
    {
      InitializeComponent();
      txt_pfad.Text = "C:\\Dokumente und Einstellungen\\Administrator\\Desktop\\ET4\\bild\\smurf.jpg";        
    }

        private void btn_bild2_Click(object sender, EventArgs e)
        {
            this.ResizeRedraw = true;
            this.Invalidate();
            try
            {
            img = Image.FromFile(txt_pfad.Text);
            }
            catch
            {
                    MessageBox.Show("Datei oder Pfad ungültig");
                    
            }
            freigabe = true;
        }
    
    void MainFormPaint(object sender, PaintEventArgs e)
    {
            if (freigabe == true)
        BildLaden();
    }
    void BildLaden()
    {
                Graphics bild = this.CreateGraphics();
                bild.PageUnit = GraphicsUnit.Pixel;    
                txt_form_h.Text = Convert.ToString(img.Size.Height);
                txt_format_b.Text = Convert.ToString(img.Size.Width);
                FaktorB = img.Size.Width / (float)(this.Size.Width);
                FaktorH = img.Size.Height / (float)(this.Size.Height);
                  if (FaktorB >= FaktorH)
                        Faktor = FaktorB;
                    else
                        Faktor = FaktorH;
                    if (Faktor < 1)
                        Faktor = 1;
                bild.DrawImage(img, new Rectangle(550, (int)(img.Size.Width / Faktor - 80), (int)(img.Size.Height / Faktor - 80)));                
        }
  }
}
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 19.03.10 18:29 
Also erst einmal würde ich gucken, dass die Einrückung stimmt.

Die Variable freigabe brauchst Du nicht, Du kannst ja jetzt einfach prüfen, ob in img was drin steht.

Convert.ToString würde ich dadurch ersetzen, dass Du die ToString-Methode der entsprechenden Variable aufrufst.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
C# Neuling Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 20.03.10 22:31 
Hm, ok aber wie stelle ich das an ich kenne die Befehle dafür nicht. Wie gesagt ich bin noch blutiger Anfänger.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 20.03.10 22:38 
user profile iconC# Neuling hat folgendes geschrieben Zum zitierten Posting springen:
Hm, ok aber wie stelle ich das an

Was?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
C# Neuling Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 21.03.10 13:41 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Also erst einmal würde ich gucken, dass die Einrückung stimmt.

Die Variable freigabe brauchst Du nicht, Du kannst ja jetzt einfach prüfen, ob in img was drin steht.

Convert.ToString würde ich dadurch ersetzen, dass Du die ToString-Methode der entsprechenden Variable aufrufst.


Naja Also ich weis nicht was eine ToString-Methode ist und wie ich diese aufrufe, und ich weis auch nicht wie ich prüfe ob in img was drinsteht dafür kenne ich keinen Bafehl ich kenn mich mit diesem Datentyp überhaupt nicht aus.

Es tut mir keid wenn ich eure zeit mit sowas verschwende aber ich bin nun mal noch anfänger und unser Lehrer hat uns bisher die Klassen nicht erklärt geschweigedenn von irgendwelchen methoden gesprochen er wusste noch nichtmla das es sowas wie trypharse gibt bis ich ihn darauf aufmerksam gemacht habe. Also erwartet nicht zuviel von mir :(

Also wenn mir da jemand ein kleines beispiel zeigen könnte wäre echt super.

Vielen dank im vorraus.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 21.03.10 14:10 
user profile iconC# Neuling hat folgendes geschrieben Zum zitierten Posting springen:
Naja Also ich weis nicht was eine ToString-Methode ist und wie ich diese aufrufe,

Alles in .NET hat eine ToString-Methode, weil sie in der Object-Klasse (also der Basisklasse für alles) implementiert ist. Generell ist Zweck, eine String-Repräsentation zu liefern. Viele Klassen überschreiben diese Methode, damit sie einen sinnvolleren Wert zurückliefert, so liefert die ToString-Methode bei einem int z.B. den Zahlenwert als String zurück. Aufrufen tust Du die Methode wie jede andere Methode auch.

user profile iconC# Neuling hat folgendes geschrieben Zum zitierten Posting springen:
und ich weis auch nicht wie ich prüfe ob in img was drinsteht dafür kenne ich keinen Bafehl ich kenn mich mit diesem Datentyp überhaupt nicht aus.

Das kannst Du bei jedem Referenzdatentypen (also z.B. Klassen) prüfen, indem Du schaust, ob die Variable null ist.

user profile iconC# Neuling hat folgendes geschrieben Zum zitierten Posting springen:
Es tut mir keid wenn ich eure zeit mit sowas verschwende

Tust Du nicht, aber mit Deiner vorherigen Beschreibung, wo Du nicht weiter kommst, konnte ich halt nichts anfangen ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
C# Neuling Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 21.03.10 15:53 
Hm, ok also das mit der freigabe Variable hab ich jetzt aber das mit der methode hab ich immernoch nicht ganz verstanden.

Ist mit Methode ein Unterprogramm gemeint sowas wie eine selbst geschriebene Funktion (bin da bischen BASIC geschädigt) also sowas in der art?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
using Systen;
public class Addieren
{
public static int Main(string[] Argumente)
{
int a, b;
a = Int32.Parse(Argumente[0]);
b = Int32.Parse(Argumente[1]);
return a + b;
}
}


Falls es das ist weis ich nur nicht wie ich das auf mein Programm übernehmen soll.



Hm hab nochmal was anderes Probiert, die ToString Methode ist denke ich schon vorgefertigt also einfach nur ToString() eingeben. Hab das mal wie folgt ausprobiert:
ausblenden C#-Quelltext
1:
txt_breite.Text = ToString(img.Size.Width);					


Nun gibt er mir aber folgenden fehler aus:

Keine Überladung für die ToString-Methode nimmt 1 Argumente an. (CS1501)

Und was hat der nun zu bedeuten????

Danke schon mal

Hey so funktionierts:
ausblenden C#-Quelltext
1:
txt_breite.Text = img.Size.Width.ToString();					

Ist das so auch korrekt geschrieben oder war das jetzt zufall???
C# Neuling Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 21.03.10 16:12 
Hätte da mal noch ne frage, wollte das ganze mal bischen weiterspinnen und hab mich gefragt wie das zu lösen ist dass ich mit einem Klick quasi durch die ganzen bilder in dem Ordner schalten kann. Also so wie bei der Windows Bild- und Faxanzeige. Dazu muss ich doch irgendwie den Inhalt eines Ordners Lesen wie macht man sowas denn??? Aber das ist jetzt nur mal so zweitrangig.