Laden...

Forenbeiträge von Rico913 Ingesamt 95 Beiträge

26.04.2023 - 11:59 Uhr

Hi,

ich habe ein umfangreiches Program zum Verarbeiten und Bemaßen von Bildern geschrieben und möchte es nun für unsere englisch-sprechenden Kollegen verfügbar machen.

Wenn ich nun die Kultur in der Program.cs, wie folgt ändere:

ResourceManager resMgm = new ResourceManager("user.settings", Assembly.GetExecutingAssembly());
           string Lang = resMgm.GetString("Spracheinstellung");
           string LangCode;
           if (Lang == "deutsch")
           {
               LangCode = "de";
           }
           else
           {
               LangCode = "en";
           }
           LangCode = "de";
           CultureInfo myCultureInfo = new CultureInfo(LangCode);
           Thread.CurrentThread.CurrentCulture = myCultureInfo;
           Thread.CurrentThread.CurrentUICulture = myCultureInfo;

habe ich das Problem, dass meine an den Stellen, wo Berechnungen durchgeführt oder Strings konvertiert werden, ich Probleme mit dem englischen Zahlenformat (Punkt statt Komma) bekomme und dies zu falschen Ergebnissen führt.

Ich hab es an einer Stelle so gelöst:

string LangText = Properties.User.Default.Spracheinstellung;
           string LangCode;
           string temp_DM3;
           string temp_SER;
           if (LangText == "deutsch")
           {
               temp_DM3 = Properties.User.Default.ImportFilter_DM3_setting;
               temp_SER = Properties.User.Default.ImportFilter_DM3_setting;
           }
           else
           {
               temp_DM3 = Properties.User.Default.ImportFilter_DM3_setting.ToString().Replace(",", ".");
               temp_SER = Properties.User.Default.ImportFilter_DM3_setting.ToString().Replace(",", ".");
           }

Aber, ich habe so viel Stellen im Programm, wo es zu einem Fehler kommen kann und ich jede einzelne finden und lösen muss.

Gibt es dafür eine elegantere, einfache Lösung? Oder vielleicht ein komplett anderen Ansatz?

19.01.2023 - 17:52 Uhr

Hi,

ich habe ein DatagridView (Quell-DGV), in dem ich Bilder anzeigen lasse. Beispielsweise 8 Spalten und 3 Zeilen je Zelle ein Bild.
Ich möchte ich per Drag & Drop einzelne Bilder in ein anderes Datagridview (Ziel-DGV) verschieben - das funktioniert stabil.

Nun möchte ich aber, dass das ausgewählte Bild, welches ins Ziel-DGV verschoben wurde, aus dem Quell-DGV verschwindet und die nachfolgenden Bilder "nachrücken".

Gibt es eine Möglichkeit eine bestimmte Zelle zu löschen oder auszublenden?
Leider habe ich in meiner Recherche nur Funktionen gefunden, die ganze Zeilen oder Spalten löschen.

Danke und viele Grüße

12.05.2022 - 16:32 Uhr

Hi,

vielen Dank - ich habe den "Ereignis"-Weg gewählt:


....
form_GS_Analysis.cmd_Close_with_Chart.Click += new System.EventHandler(form_GS_Analysis_GetChart_Click);
....

public void form_GS_Analysis_GetChart_Click(object sender, EventArgs e)
{
   MessageBox.Show("Test");
   form_GS_Analysis.cmd_Close_with_Chart.Click -= form_GS_Analysis_GetChart_Click;
}


11.05.2022 - 10:09 Uhr

Hi,

folgende Problemstellung:

Ich habe ein Hauptformular (Form_Main) von welchem ich aus Form2 (Form_GS_Analysis) starte:


Form_GS_Analysis form_GS_Analysis;

private void GSA_Open_Form()
{
//Form wird initialisiert
form_GS_Analysis = new Form_GS_Analysis();
form_GS_Analysis.FormClosed += new FormClosedEventHandler(form_GS_Analysis_FormClosed);

 //Form AssistCA wird angezeigt
form_GS_Analysis.Show();
}

private void form_GS_Analysis_FormClosed(object sender, FormClosedEventArgs e)
 /*
      tritt ein, wenn AssistCA geschlossen wird
 */
 {
            //Handler wird beendet
            form_GS_Analysis.FormClosed -= form_GS_Analysis_FormClosed;
            gBx_GSA.Visible = false;

            //Marker wird deaktiviert
            Is_GSAform_open = false;
}

Im Form2 (Form_GS_Analysis) führe ich nun verschiedenste Berechnung durch und erstelle ein Diagramm. Dieses Diagramm speichere ich als Bild und möchte es per Button im Form2 direkt in Form1 einfügen.

Wie ich das von Form1 aus realisiere, ist mir klar nur nicht wie es direkt von Form2 aus konstruiere. Also wenn der User im Form2 (Form_GS_Analysis) auf den Button drückt.

Danke schonmal im Vorraus für eure Hilfe!!!

30.09.2021 - 20:58 Uhr

Super ... vielen Dank!! Mit der statischen Methode hats geklappt 👍

30.09.2021 - 13:23 Uhr

Hi,

ich steh grad mal wieder auf dem Schlauch. Ich habe mir ein individuelles MessageForm mit DialogResult gebastelt. Das funktioniert auch alles, wie es soll.
Ich würde aber gern die Benutzung etwas abkürzen:

Momentan:


 MyMessageBox_Global myMSG = new MyMessageBox_Global();
 DialogResult dialog = myMSG.Get_DiaResult("Test 1 2 3 ", "hier steht die Nachricht", MyMessageBox_Global.msgButton.JaNein_Cancel, MyMessageBox_Global.msgIcon.Fehler, false);
 if(dialog == DialogResult.Yes)
            {........

Ich würde es gern wie die Standard-MessageBox benutzen. Also so:


MyMessageBox_Global.Get_DiaResult(......)

...ohne jedesmal neu zu Initialisieren.

Wie kann ich die Klasse "einbauen", dass ich sie direkt auffrufen kann. Könnt ihr mir bitte ein Stichwort geben?

Danke und viele Grüße
Rico

07.07.2021 - 14:07 Uhr

Hi,

ich würde gern ein String darauf prüfen, ob sein Inhalt einzeilig oder mehrzeilig ist.

Sozusagen möchte ich ja nach Inhalt das StringAlignment ändern:


string Text = XXX.Label_Text;
SizeF TextSize = TextRenderer.MeasureText(Text, new Font(Font_OCR_Label.Name, Font_Size_temp));

StringFormat sf = new StringFormat();

if(Text == einzeilig)
{
    sf.Alignment = StringAlignment.Center;
}
else
{
   sf.Alignment = StringAlignment.Near;
}


27.06.2021 - 15:44 Uhr

Hey,

ich bräuchte mal eure erfahrene Hilfe. Ich habe ein altes Script, welches in C geschrieben wurde und muss es, da ich die Funktion benötige, in C# integrieren.
Leider fehlt mir aber das Fachwissen - gerade im Punkto Zeiger - das hab ich in C noch nicht richtig kapiert.

Hier mal das Code-Beispiel:


UINT getuint( FILE *f) 
{
  int i;
  UINT ff;
  char *c;
  c = (char*)&ff;
  for( i=3; i>=0; i-- )
    c[i] = fgetc(f);
  return ff;
}

Könnte mir das bitte jemand in C# übersetzen?
Was bedeutet der Abschnitt:


char *c;
  c = (char*)&ff;

Warum gebe ich ff zurück, obwohl keine Operation stattfand? Woher kommt der Rückgabewert?

Vielen Dank schon mal im Vorraus....

25.04.2021 - 13:09 Uhr

Cool ... Danke dir!!!

25.04.2021 - 12:14 Uhr

Hallo,

ich möchte nach einer getätigten Aufgabe eine Mail über Outlook (Office365) versenden. Das funktioniert auch.
Nur habe ich zwei Optionen:

  1. Outlook ist beim Nutzer schon geöffnet und soll nach dem Versenden offen bleiben
    oder
  2. Outlook vom Nutzer ist geschlossen und soll nach dem Versenden wieder geschlossen werden

Mein Code:


try
            {
                Microsoft.Office.Interop.Outlook.Application OL = new Microsoft.Office.Interop.Outlook.Application();
                Microsoft.Office.Interop.Outlook.MailItem Mail = OL.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
                Mail.Subject = Betreff;
                Mail.To = Empfaenger;
                Mail.Body = Nachricht;
                Mail.Display(false);
                Nachricht = string.Empty;
                Mail.Send();
                OL.Quit();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Exception");
            }

Gibt es einen Weg, zu erkennen, ob Outlook geöffnet ist?

05.04.2021 - 17:04 Uhr

Hi,

ich habe ein Programm (Main_Form) und ein entsprechendes SubForm. In diesem Form lade ich eine dynamische Excel-Tabelle in ein DataGrid, welches ich nach bestimmten Anforderungen im Main_Form filtere.
Nun ist es so, dass es je größer die Tabelle ist, es spürbar länger dauert, bis ich im Main-Form eine Aktion ausführen kann.

Ist es möglich, das ganze SubForm in eine Art Backgroundworker o.ä. auszulagern? Und wenn ja, wie ist das Stichwort dafür? Können dabei Main_Form und SubForm "kommunizieren"?

Danke und viele Grüße
Rico

17.02.2021 - 14:30 Uhr

Ehrlich gesagt übersteigt diese Programmierung momentan meine Kompetenzen.

Was würde die Programmierung eines Parsers kosten, wenn man es in Auftrag geben würde? Entsprechende Vorlagen in C und Pyhton sind vorhanden.
Was ich brauche ist das Bild und die im Bild gespeicherten Informationen (Tags).

Gern auch per PN....

16.02.2021 - 11:08 Uhr

Hi,

ich habe schon seit längerem ein Problem, bei dem ich logisch festhänge:

Wenn ich den CellClick durchführe, dann beziehen sich alle Operationen auf die "neu" selektierte Zeile. Ich benötige aber den Index der Zeile von der ich komme.
Wenn ich eine Variable einsetze, wird diese beim CellClick überschrieben und ich bin wieder bei der neuen Zeile. 🙁 Gedanklich drehe ich mich im Kreis....

Zum Hintergrund:
Ich führe in der aktuellen Zeile eine Aktion durch, bei der die Zeile entsprechend eingefärbt wird. Wenn ich nun per CellClickEvent die Zeile verlasse, soll die "Alte" eingefärbt sein und bleiben. Aber wenn ich bspw. eine Variable setze, wird im zweiten Durchgang die erste weider gelöscht. Liegt natürlich daran, dass CellClick den Index überschreibt.

Gibt es eine andere Möglichkeit den Index der Zeile von der ich komme abzufangen?

Mein Code im CellClickEvent:


private void dGV_Zeilen_einfaerben(int IndexRow)
        {
            if (Is_ImageMeasurement == true)
            {
                dGV_paint_Rows(Farbe_dGV_IsMeasured, IndexRow);
                Is_ImageMeasurement = false;
            }
            else
            {
                if (dGV_ImageList[7, IndexRow].Value.ToString() == "0")
                {
                    dGV_paint_Rows(Color.IndianRed, IndexRow);
                }
                else
                {
                    dGV_paint_Rows(Color.White, IndexRow);
                }

            }
        }

03.02.2021 - 19:38 Uhr

Hi,

wenn ich aus der Google-Suche komme, lande ich seit der Umstellung immer auf der Forumseite und nicht beim entsprechenden Thema.
BeispielLink: MyCSharp.de - Diskussionsforum

Liegt es womöglich an meiner Browsereinstellung?? ...habe aber nix verändert.

Viele Grüße

07.01.2021 - 14:08 Uhr

Woher wusste ich nur, dass ich in puncto BinaryFormatter solch ein Statement bekomme 😉
Ich hatte das zwar schon des öfteren gelesen, aber er funktioniert in diesem Punkt gut.

Welche Probleme können denn damit auftreten??

Danke für die kurze Erklärung zum Serialisieren. Ehrlich gesagt habe ich da nach dem Schnellschussprinzip gearbeitet. -> Such bei Google, Kopiere, funzt, keine Gedanken drüber machen.
Ich weiß, dass ist nicht die feine Art und nun bedarf es doch etwas Einarbeitung.

Viele Grüße

07.01.2021 - 13:23 Uhr

Hallo,

ich möchte ein bestimmte Werte aus einem DatagridView (dgV_ImageList) in einem anderen DatagridView als Backup speichern.

Hier der Code:



DataGridView LoadImages_Info = new DataGridView();

private void Save_Project_Click(object sender, EventArgs e)
        {
            if (savFD_save_project.ShowDialog() == DialogResult.OK)
            {
                string SaveFile = savFD_save_project.FileName; //Filename mit Pfad
                Save_Listen_Recovery();
                Save_Messung_Daten_List(SaveFile, Liste_Recovery_Project);
            }
        }

private void Save_Listen_Recovery()
        {
            
            List<string> FileNames = new List<string>();

            foreach (DataGridViewRow row in dGV_ImageList.Rows)
            {
                FileNames.Add(dGV_ImageList.Rows[row.Index].Cells[5].Value.ToString());
                for (int i = 2; i < dGV_ImageList.Columns.Count; i++)
                {
                    LoadImages_Info.Columns.Add(i.ToString(),i.ToString());
                    LoadImages_Info.Rows.Add(dGV_ImageList.Rows[row.Index].Cells[i].Value);
                }
            }

            Liste_Recovery_Project.Add(new Liste_Recovery()
            {
                Liste_Messung_Recovery = Liste_Messung_Daten,
                FileListe_Recovery = FileNames,
                Image_DataGrid = LoadImages_Info
                
            });
        }

private void Save_Messung_Daten_List(string FilePath, List<Liste_Recovery> SaveList)
        {
            FileStream stream;
            stream = new FileStream(FilePath, FileMode.Create);
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, SaveList);
            stream.Close();
            SaveList.Clear();
        }

[Serializable]
public class Liste_Recovery
{
    public List<Liste_Messung> Liste_Messung_Recovery { get; set; }
    public List<string> FileListe_Recovery { get; set; }
    public DataGridView Image_DataGrid { get; set; }
}


Ich bekomme aber eine Exeption:> Fehlermeldung:

System.Runtime.Serialization.SerializationException: "Der Typ "System.Windows.Forms.DataGridView" in Assembly "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" ist nicht als serialisierbar gekennzeichnet."

Ich habe doch aber das DataGridView als Serializable markiert 🤔

Wenn ich das Image_DataGrid auskommentiere funktioniert es tadellos??

04.12.2020 - 21:25 Uhr

Meine Frage war an die Herangehensweise.

  1. Bild parsen
    --> krieg ich hin

  2. Blöcke abarbeiten
    --> theoretisch denke ich, weiß ich wie es gemeint ist.

Aber es geht los, dass ich ein Problem habe, die Doku zu verstehen. Mir fehlt der Ansatz 😦
D.h. was muss ich in C# tun, damit ich ein Block abarbeiten kann und wie komme ich an das Bild.

04.12.2020 - 15:33 Uhr

Danke für die Beiträge....

Das Format hat sich in den letzten 15 Jahren nicht geändert. Da die Tools auch keine Updates erhalten (frei dem Motto never change a running system - sind so schon teuer genug) wird sich an der Situation nichts ändern.

Es gibt schon diverse Importer für dieses Format. Aber entweder mit einer zusätzlichen Programmkomponente (Softwareeigene Sprache) oder in C bzw Python.
Nur nicht in C# und zum "Übersetzen" fehlt mir das Wissen über den Ablauf.

Will es auch nicht nur abschreiben, sondern eben verstehen, was passiert bzw. was passieren muss, damit ich am Ende ein Bild + die dazugehörigen Tags habe.

03.12.2020 - 15:14 Uhr

Hi,

ich arbeite schon seit längeren an einem Bemaßungsprogramm. Das funktioniert bisher sehr gut für die gängigen Bildformate.

Nun habe ich aber eine Toolgruppe, die Bilder in einem softwareeigenem Format abspeichert (*.dm3).

Ich habe für dieses Dateiformat eine Dokumentation vorliegen, aber mir fehlt der Ansatz/Wissen darüber, wie man dieses Format in ein C#-lesbares Bild umwandelt.

Vermutlich muss die Datei zeilenweise eingelesen und umgewandelt werden, oder? Könnt ihr mir bitte ein Denkanstoß geben oder kurz die Prozedur theoretisch anreissen, damit ich weiß, wonach ich suchen muss bzw. ich mich einarbeiten kann?

Ich hab die Doku mal angehangen.

Danke im Voraus.....

16.11.2020 - 17:29 Uhr

Das isses ... ich danke dir!!!!!

16.11.2020 - 17:24 Uhr

Anscheinend werden die Werte richtig ausgegeben, aber bei der Übergabe scheitert es:


XMLgenerator AdminXML = new XMLgenerator();

        public void Load_Settings()
        {
            AdminXML.Load();
            num_Messlinie_Thickness.Value = AdminXML.Messlinie_Thickness;
             ........
             ........
        }

16.11.2020 - 16:45 Uhr

[Serializable]
	class XMLgenerator
	{
	        public decimal Messlinie_Thickness;
		public SerializableFont Draw_Label_Image_Font, Draw_Label_Messlinie_Font;
		public decimal LinienEnde_Radius;
		public Color LinienEnde_Farbe;
		public Color Messlinie_Farbe, Draw_Guideline_Farbe;
		public bool NummerierungLinien;
		public int Messen_Text_Rundung;
		public string LDaten_Drive;
		public decimal Unit_Switch_PixelSize_threshold;

		
		private void SetDefaultValues()
		{
			this.Messlinie_Thickness = 1;
			this.Draw_Label_Image_Font = new SerializableFont(new Font("Arial", 8));
			this.Draw_Label_Messlinie_Font = new SerializableFont(new Font("Arial", 8));
			this.LinienEnde_Radius = 1;
			this.LinienEnde_Farbe = Color.Red;
			
			this.NummerierungLinien = false;
			this.Messen_Text_Rundung = 1;
			this.Unit_Switch_PixelSize_threshold = 10;
			this.LDaten_Drive = @"\\sdrsmalabp03\malab$";
		}

		// ---------------------------------------------------------------------------------------

		
		[XmlIgnore]
		public const string FileName = "......\Programmdaten\\admin_config.dat";

		
		[XmlIgnore]
		public static XMLgenerator Setting { get; set; }

		
		public XMLgenerator()
		{
		}

		public static void Default()
		{
			XMLgenerator.Setting = new XMLgenerator();
			XMLgenerator.Setting.SetDefaultValues();
		}
		
		public XMLgenerator Load()
		{
		
			var serializer = new DataContractSerializer(typeof(XMLgenerator));
			using (var stream = new XmlTextReader(FileName))
			{
				XMLgenerator config = serializer.ReadObject(stream) as XMLgenerator;
				return config;
			}

		}


		public void Save()
		{
			var serializer = new DataContractSerializer(typeof(XMLgenerator));
			using (var stream = new XmlTextWriter(FileName, Encoding.Unicode))
			{
				serializer.WriteObject(stream, this);
			}
		}
	}


	[DataContract]
	internal class Setting
	{
		[DataMember]
		public decimal Messlinie_Thickness { get; set; }
		[DataMember]
		public SerializableFont Draw_Label_Image_Font { get; set; }
		[DataMember]
		public decimal LinienEnde_Radius { get; set; }
		[DataMember]
		public SerializableFont Draw_Label_Messlinie_Font { get; set; }
		[DataMember]
		public Color LinienEnde_Farbe { get; set; }
		[DataMember]
		public Color Messlinie_Farbe { get; set; }
		[DataMember]
		public Color Draw_Guideline_Farbe { get; set; }
		[DataMember]
		public bool NummerierungLinien { get; set; }
		[DataMember]
		public int Messen_Text_Rundung { get; set; }
		[DataMember]
		public string LDaten_Drive { get; set; }
		[DataMember]
		public decimal Unit_Switch_PixelSize_threshold { get; set; }

	}

16.11.2020 - 16:31 Uhr

Ich stehe momentan vor folgendem Problem:

Ich serialisiere eine XML-Datei -> funktioniert:


public void Save()
		{
			
			var serializer = new DataContractSerializer(typeof(XMLgenerator));
			using (var stream = new XmlTextWriter(FileName, Encoding.Unicode))
			{
				serializer.WriteObject(stream, this);
			}
		}

Der Code für die Deserialisierung sieht wie folgt aus:


public XMLgenerator Load()
		{
		
			var deserializer = new DataContractSerializer(typeof(XMLgenerator));
			using (var stream = new XmlTextReader(FileName))
			{
				XMLgenerator config = deserializer.ReadObject(stream) as XMLgenerator;
				return config;
			}

		}

Leider wird aber in der Zeile return config nichts ausgegeben.
Laut Debugger liest er aber alle Daten eine Zeile vorher "XMLgenerator config ...." richtig aus.

Warum werden diese nicht "übergeben"? Was mache ich falsch?

16.11.2020 - 16:27 Uhr

Danke für eure Meinungen.
Ich habe jetzt die user-Settings unberührt gelassen und für die Admin-Setting nutze ich die XML-Serialisierung.

10.11.2020 - 13:08 Uhr

Ich möchte gern differenzieren zwischen User-Settings und Admin-Settings.

Die User-Settings können unbehandelt bleiben.

Die Admin-Settings sollen auf einem zentralen Netzwerklaufwerk gespeichert werden, damit alle mit den selben Einstellungen arbeiten.

10.11.2020 - 12:41 Uhr

Hi,

gibt es eine Möglichkeit den Speicherort der user.config-Datei festzulegen.
Konnte dazu leider nichts Genaues finden.

Danke und viele Grüße

07.11.2020 - 14:27 Uhr

Danke für die Hinweise!

@TH69: ShowDialog() hat bei mir nicht funktioniert, da das Form direkt geschlossen wird. Möglicherweise gibt es da einen Weg, aber da fehlt mir noch etwas Wissen.

Dein Tutorial kannte ich bis dato nicht. Da ich öffter, verschiedenste Unterformulare öffnen muss, werde ich das nachher durcharbeiten. Da gibt es sicher Überarbeitungsbedarf - vielen Dank!

Bis dahin habe ich die für mich gängige Lösung:


Form_Kalibrierungsfenster _Kalibrierungsfenster;

        public void Berechnung_Kalibrierung()
        {
            

            if (WaitHandler == false)
            {
                
                _Kalibrierungsfenster = new Form_Kalibrierungsfenster();
                _Kalibrierungsfenster.Show();
                _Kalibrierungsfenster.TopMost = true;
                _Kalibrierungsfenster.lbl_Bilddaten.Text = Image_Width.ToString() + " x " + Image_Height.ToString() + " Pixel";

            }
            else if (WaitHandler == true)
            {
                WaitHandler = false;
                _Kalibrierungsfenster.lbl_PixelSize.Text = Math.Round(PixelSize_Kali, 5).ToString() + " " + Kali_Unit_Input + " pro Pixel";

            }
        }

Viele Grüße

07.11.2020 - 13:20 Uhr

Hi,

folgendes:
Ich greife von Form1 auf ein anderes Form (Form_Kalibrierungsfenster) zu. Darin habe ich zwei Textboxen, Comboboxen und zwei Buttons.
Der User soll in den Comboboxen einen Wert und eine Einheit auswählen. Daraus wird ein Pixelwert berechnet, der mit Klick auf den Button, angezeigt werden soll.

Nun habe ich folgendes Problem:
Wenn mein Code, folgend aussieht, dass Form_Kalibrierungsfenster aushalb der Funktion erstellt wird, wird lbl_PixelSize.Text geändert:



       Form_Kalibrierungsfenster _Kalibrierungsfenster = new Form_Kalibrierungsfenster();
        
        public void Berechnung_Kalibrierung()
        {
            
            if (WaitHandler == false)
            {
                _Kalibrierungsfenster.lbl_Bilddaten.Text = Image_Width.ToString() + " x " + Image_Height.ToString() + " Pixel";

                _Kalibrierungsfenster.Show();
                _Kalibrierungsfenster.TopMost = true;

            }
            else if (WaitHandler == true)
            {
                WaitHandler = false;
                _Kalibrierungsfenster.lbl_PixelSize.Text = Math.Round(PixelSize_Kali, 5).ToString() + " " + Kali_Unit_Input + " pro Pixel";

            }
        }

Problem dabei, ich kann das geschlossene Form nicht nochmal öffnen.

Wenn ich aber:


 Form_Kalibrierungsfenster _Kalibrierungsfenster;
        
        public void Berechnung_Kalibrierung()
        {
            _Kalibrierungsfenster = new Form_Kalibrierungsfenster();

            if (WaitHandler == false)
            {
                _Kalibrierungsfenster.lbl_Bilddaten.Text = Image_Width.ToString() + " x " + Image_Height.ToString() + " Pixel";

                _Kalibrierungsfenster.Show();
                _Kalibrierungsfenster.TopMost = true;

            }
            else if (WaitHandler == true)
            {
                WaitHandler = false;
                _Kalibrierungsfenster.lbl_PixelSize.Text = Math.Round(PixelSize_Kali, 5).ToString() + " " + Kali_Unit_Input + " pro Pixel";

            }
        }

Wenn ich es aber so schreibe, funktioniert das Form-Handling, wie ich es möchte, aber nach Klick auf meinen Button wird lbl_PixelSize.Text nicht aktualisiert.

Woran liegt das?

14.10.2020 - 11:30 Uhr

Super ... Danke filename.ToLower().EndsWith(".jpg") ist genau das, was ich gesucht habe 😄

Den Verzeichnishinweis hab ich übernommen.

14.10.2020 - 08:22 Uhr

Hi,

Ich habe ein OpenFileDialog mit dem ich verschiedene Bilddateien öffnen möchte.
Nun ist es aber so, dass ich von verschiedenen Tool-Herstellern unterschiedliche Bildformate mit entsprechenden Dateiendungen habe, für die ich einen Import-Filter schreiben muss.

Ich stell mir das ganze so vor:

  • Öffne Dateien
  • Wenn Datei Endung *.ser hat, dann mach das

if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                
                string[] selectedFiles = openFileDialog1.SafeFileNames;
                string[] files = openFileDialog1.FileNames;
                

                Bilder_Anzahl += files.Length;
                

                for (int i = 0; i < files.Length; i++)
                {
                ........

Wie der Filter vor dem Öffnen funktioniert ist mir klar, aber danach?
Gibt es da eine einfache Möglichkeit?

30.09.2020 - 16:28 Uhr

Hi,

ich habe eine PictureBox mit einem Bild. Dieses soll vermessen werden.

Mit der Maus soll eine Art Fadenkreuz, wie bspw. im CAD, angezeigt werden. Dies kann der Nutzer mit einem Checkbox-Schalter aktivieren und deaktivieren.
Das funktioniert auch, aber das Fadenkreuz bleibt nach Deaktivierung immer noch gezeichnet und ich bekomme es einfach nicht weg 😦

Hier mein Code:


 private void picBox_Measurement_Overlay_MouseMove(object sender, MouseEventArgs e)
        {
            if (CenterCross_Active == true)
            {
                pictureBox_Image.Paint += new PaintEventHandler(pictureBox_Image_Paint);
                CenterCross_X = e.Location.X;
                CenterCross_Y = e.Location.Y;
                pictureBox_Image.Refresh();
            }
        }

private void togSW_CenterCross_CheckedChanged(object sender, EventArgs e)
        {
            if (togSW_CenterCross.Checked == true)
            {
                CenterCross_Active = true;
            }
            else if (togSW_CenterCross.Checked == false)
            {
                CenterCross_Active = false;
                pictureBox_Image.Paint -= new PaintEventHandler(pictureBox_Image_Paint);
                pictureBox_Image.Refresh();
            }
        }
        
private void pictureBox_Image_Paint(object sender, PaintEventArgs e)
        {
                Pen CenterCross = new Pen(Color.Blue);
                e.Graphics.DrawLine(CenterCross, CenterCross_X, 0, CenterCross_X, pictureBox_Image.Height);
                e.Graphics.DrawLine(CenterCross, 0, CenterCross_Y, pictureBox_Image.Width, CenterCross_Y);
        }

Habt ihr ein Hinweis?

16.09.2020 - 10:17 Uhr

ohh .. ich hatte ein Copy&Paste-Feher drin:

Der Variablen der Listenwerte haben folgende Werte:
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X = 153
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y = 235

Eben nicht gleich:


int Liste_Messung_Filter_Daten_MovingSegment_Start_Point_Y_temp =  Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y;

236 = 235

MovingSegment hat den Richtigen und bei allen den gleichen Wert, bspw. hier 0

16.09.2020 - 09:48 Uhr

Leider habe ich bei den Listen-Werten eine Fehlermeldung bekommen.
Ich habe diese in einer extra Klasse definiert:


public class Liste_Messung_Filter
{
    public int Image_ID_Lst { get; set; }
    public int Messlinie_ID_Lst { get; set; }
    public double Laenge_Lst { get; set; }
    public int Start_Point_X { get; set; }
    public int Start_Point_Y { get; set; }
    public int End_Point_X { get; set; }
    public int End_Point_Y { get; set; }
    public float Scale_Lst { get; set; }
}

Der Variablen der Listenwerte haben folgende Werte:
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X = 153
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y = 235

Um sie auszulesen habe ich sie in eine extra-Variable schreiben lassen:


int Liste_Messung_Filter_Daten_MovingSegment_Start_Point_X_temp =  Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X;
int Liste_Messung_Filter_Daten_MovingSegment_Start_Point_Y_temp =  Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y;

Und dort passiert bei Y etwas Merkwürdiges:
Ergebnis: 236 = 235 🤔

16.09.2020 - 07:43 Uhr

Ich rate einfach mal:
MovingSegment ist ein Index einer Schleife. Du inkrementierst diesen und vergleichst dann die Werte aus dem letzten mit denen aus dem aktuellen Durchlauf.

Fast.
MovingSegment ist der Index einer bestimmten Linie in einem Bild, welche ich verschieben möchte. Das klappt auch alles ohne Probleme.

Nun habe ich ein Zoomfaktor eingeführt. Das heisst in meiner Liste wird der jeweilige Zoomfaktor (Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst) gespeichert. Hinzu kommt der Zoomfaktor des aktuellen Bildausschnittes (scale). Diese beiden Werte multipliziere ich mit einander - beides float.

In meinem Testbeispiel ergibt dies 1.

Um nun in der jeweiligen Zoomstufe zu verschieben, brauche ich den Startpunkt, hochgerechnet auf die aktuelle Zoomstufe. D.h. den alten Startpunkt (Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y) * scale_temp_Y

Und da kommt nicht das heraus, was ich bei der Multiplikation mit eins erwarten würde.

14.09.2020 - 20:46 Uhr

Ich habe jetzt mal "Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y" nach oben genommen und float in double geändert.


double scale_temp_Y = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y * scale * Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst;

Debugger:


scale_temp_Y = 201.99999586120248 == Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y * scale * Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst = 202.99999584071338

Das Ergebnis vom Debugger ist also folgendes:

links = rechts
201.99999586120248 = 202.99999584071338

Ich verstehe nicht, wo die 1 herkommt. Ich habe es mit dem Taschenrechner überprüft und rechts stimmt. Mir raucht der Kopf....

14.09.2020 - 17:27 Uhr

Ich hab es hinbekommen - Danke für die Hinweise.

@Stefan:
Das Passwort ist zwar nicht systemkritisch, aber ich dachte mir, dass ich es in den settings verschlüsseln werde. Ich hatte da mal was gelesen, muss mich aber erst reinarbeiten. Eins nach dem Anderen 😉

14.09.2020 - 17:04 Uhr

Hi,

ich habe ein Fehler in meiner Berechnung, der mir einige Zeit schon Kopfzerbrechen bereitet.
Zuerstmal der Code:


float scale_temp = scale * Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst;
int Startpunkt_alt_X = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X * (int)scale_temp;
int Startpunkt_alt_Y = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y * (int)scale_temp;

Die Werte der Variablen lt. Debugger:
Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst = 1.29949236
scale = 0.76953125
scale_temp = 1
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X = 243
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y = 228
Startpunkt_alt_X = 243
Startpunkt_alt_Y = 226

Der Knackpunkt liegt bei Y. Ich habe schon einige Durchgänge durchgespielt - bei X stimmt der Wert (Start_Point_X = Startpunkt_alt_X).
Y hat meistens eine Abweichung von 1. In diesem Beispiel sogar 2.
Ich verstehe es einfach nicht - hat jemand von euch eine Idee?

*Edit*
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X & ..Y sind als int deklariert.

10.09.2020 - 21:32 Uhr

Hi,

ich habe ein Form1 (Form_Optionen) in dem ich ein TabPage (tab_AdminOption) habe. Dieses soll nur angezeigt werden, wenn in Form2 (Form_Passwortabfrage) das richtige Passwort eingeben wird.
Damit das Tabpage angezeigt wird möchte ich die Größe des Formulars ändern und tab_AdminOption auf true setzen.

Mein Code in der Passwortabfrage sieht so aus:


string PW_admin;

        private void Passwortabfrage()
        {
            if (txt_PW_Abfrage.Text == PW_admin)
            {
                Form_Optionen FM_Opt = new Form_Optionen();
                FM_Opt.Size = new Size(820, 650);
                FM_Opt.tab_AdminOption.Visible = true;
                FM_Opt.Refresh();
                
                this.Close();
            }
            else
                MessageBox.Show(this, "Falsche Eingabe! \n Bitte wiederholen!");
        }

        private void cmd_OK_Click(object sender, EventArgs e)
        {
            Passwortabfrage();
        }

        private void cmd_close_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void txt_PW_Abfrage_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                Passwortabfrage();
            }
        }


Es passiert nichts 😦

Ich vermute, dass hier "Form_Optionen FM_Opt = new Form_Optionen();" falsch ist, da Form_Optionen schon offen ist, oder?
Aber wie kann ich dann Form_Optionen ansprechen?

02.09.2020 - 12:41 Uhr

Hab es gelöst bekommen:


double num;
 decimal Zahl_dec;
 double.TryParse(Zahl_exp, NumberStyles.Any, CultureInfo.InvariantCulture, out num);
Zahl_dec = ((decimal)num);

02.09.2020 - 12:02 Uhr

Hi,

ich möchte eine Expotentialschreibweise in Double oder Float umwandeln, um weitere Berechnungen durchzuführen.


string Zahl_exp = 8,46667e-007;
double epot = double.Parse(Zahl_exp);
Zahl_dec = epot.ToString();


Leider funktioniert dies nicht, ich bekomme als Ergebnis: 0,0846667, was ja nicht stimmen kann. Müsste doch 0,000000846667 rauskommen, oder?

Im Netz bin ich nicht fündig geworden bzw. hat dies nicht zum Erfolg beigetragen 😦

17.07.2020 - 15:19 Uhr

Lieber Abt,
ohne die Tipps der Helfer wäre ich noch nicht so weit gekommen, wie bisher!!
Da ich zur Zeit in Elternzeit bin habe ich ungefähr 1 bis 2 Stunden, wenn überhaupt, am Tag Zeit für mein Projekt. Da dieses, wie du sicherlich schon in Erfahrung gebracht hast, mehrere Baustellen hat, arbeite ich mal an der Problemlösung und mal an dem Problem.
Googlen, Recherchieren und einarbeiten dauert eine Weile und ich lerne noch. Ich stehe sozusagen am Anfang und bin dankbar! dass es dieses Forum gibt. Nur weil ich ein Thema nicht zeitnah umsetze, heißt das noch lange nicht, dass ich das Thema bzw. die Hilfestellung nicht auf dem Schirm habe. Von daher finde ich:

Zu unterstellen, ich würde die Tipps nicht umsetzen, sehr entmutigend!!!

Eben bspw. Dank der Hilfe bzw. des Hinweises von JimStark habe ich das Thema der 2ten Linie gelöst! Und wie so oft ist ein neues Problem aufgetaucht, eben das die vielen gezeichneten Linien nicht mehr gelöscht werden können 😦

16.07.2020 - 13:59 Uhr

Sorry, stimmt natürlich:


        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox_Image.SizeMode = PictureBoxSizeMode.Zoom;
            pictureBox_Overlay.SizeMode = PictureBoxSizeMode.Zoom;
            pictureBox_Overlay.Parent = pictureBox_Image;
            pictureBox_Overlay.Location = new Point(0, 0);
        }


private void panel1_draw_horizontal(object sender, PaintEventArgs e)
        {
            foreach (MessKoordinaten_Test Messlinie in Messung_Test)
                Messlinie.Draw(e.Graphics, Messen_Text_Rundung);
        }


public void Draw(Graphics gr, int Messen_Text_Rundung)
    {
        Pen pen = new Pen(Color.Green, 1);
        Font font = new Font("Arial", 8, FontStyle.Bold);
        pen.StartCap = LineCap.SquareAnchor;
        pen.EndCap = LineCap.RoundAnchor;
        gr.DrawLine(pen, MousePosition_Start_X_picBox_Lst, MousePosition_Start_Y_picBox_Lst, MousePosition_Ende_X_picBox_Lst, MousePosition_Start_Y_picBox_Lst);
        int Point_Text_X = ((MousePosition_Ende_X_picBox_Lst - MousePosition_Start_X_picBox_Lst) / 2) + MousePosition_Start_X_picBox_Lst - 10;
        int Point_Text_Y = MousePosition_Start_Y_picBox_Lst - 15;
        Laenge_Lst = Math.Round(Laenge_Lst, Messen_Text_Rundung);
        gr.DrawString(Laenge_Lst.ToString(), font, Brushes.Black, new Point(Point_Text_X, Point_Text_Y));
      }


        private void Messung_horz_Click(object sender, EventArgs e)
        {
            Check_MessenEnde = false;
            pictureBox_Image.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
            pictureBox_Overlay.Paint += new PaintEventHandler(panel1_draw_horizontal);
            Click_First = true;
        }


        private void Image_Delete_Measurement()
        {
           ????
        }

16.07.2020 - 13:47 Uhr

Bin grad am Verzweifeln und hab schon Einiges durchprobiert aber leider ohne Erfolg.

Ich habe eine PictureBox als Overlay über eine andere Picturebox gelegt.
In diese lasse ich Linien zeichnen.

Über ein Datagridview kann der User zum nächsten Bild wechseln. Dort sollen aber die Linien vom vorherigen Bild (Overlay) gelöscht werden. Und genau das passiert nicht - egal was ich probiere Refresh/Invalidate / graphics.clear die Linien bleiben.

Dispose funktioniert zwar, aber das Overlay ist dann ja bekanntermaßen weg, Kann ich dieses eventuell reaktivieren?

Könnt ihr mir bitte helfen?

10.07.2020 - 12:59 Uhr

Hi,
mal wieder meine Problemstellung:

Ich habe ein DataGridview1 in dem ich per openFileDialog Bilder lade. Diese Bilder kann der User einzeln anwählen und das ausgewählte Bild wird in einer PictureBox angezeigt.
Nun hat der User die Möglichkeit dieses per Mouseklick zu bemaßen:
Click1 + Click2 = Maß1 = Linie1; Click3 + Click4 = Maß2 = Linie2

Für die Berechnung schreibe ich fortlaufend die Mauspositionen + berechnetes Maß in ein zweites DataGridView2.
Nun ist es aber so, dass wenn ich zum nächsten Bild springe, möchte ich das DataGridView2 zum dazugehörigen Bild irgendwie speichern und ein neues View soll zur Verfügung stehen.
Sprich jedes Bild hat seine eigene Datentabelle.
Am Besten wäre natürlich, wenn ich DataGridView2 direkt in DataGridView1 schreiben könnte.

Leider habe ich dazu nichts konkretes gefunden. Hat jemand ein Tipp, wie ich mein Problem lösen kann?

10.07.2020 - 12:33 Uhr

Danke für die Hinweise 👍

Die Labels sind für mich nur Dummy-Anzeiger zur Kontrolle, ob die Funktion das tut, was sie soll. Die fallen am Ende weg und ich benutze sie für jede Problemstellung wieder neu.

09.07.2020 - 13:15 Uhr

Danke ....konnte das "Egal" auch nicht richtig deuten 😁
Also ungefähr so:

Speicher Click1 + Click2 in Liste, Zeige an, Speicher Click3+Click4 in Liste, Zeige Linie1 + Linie2 .....

Das ist ein guter Ansatz, da ich den Vorteil habe, die Maße direkt in einer Liste auszugeben und dem User die Möglichkeit geben kann, diese anzuzeigen.
Es sei denn es geht noch einfacher auf die Schnelle 😉

09.07.2020 - 12:31 Uhr

Komm mal wieder nicht weiter 😦

Ich habe ein Bild in einer PictureBox, welches ich bemaßen möchte. Dazu soll der Nutzer die Start- und Endpunkte per Mausklick markieren und das Maß wird gesetzt (Linie gezeichnet)
Für eine Linie funktioniert das auch wunder bar, aber wenn ich die nächste zeichne, wird die vorhergehende gelöscht.
Wie kann ich das realisieren? Im Netz wird leider immer nur eine Linie behandelt 😦
Mein Code bisher:

User startet Messung mit Button:


private void button2_Click(object sender, EventArgs e)
        {
            Check_MessenEnde = false;
            pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
            pictureBox1.Paint += new PaintEventHandler(panel1_draw);
            pictureBox1.Refresh();
            Click_First = true;
        }


private void panel1_draw(object sender, PaintEventArgs e)
        {
                Pen pen = new Pen(Color.Green, 1);
                pen.StartCap = LineCap.SquareAnchor;
                pen.EndCap = LineCap.RoundAnchor;
                e.Graphics.DrawLine(pen, MousePosition_Start_X_picBox, MousePosition_Start_Y_picBox, MousePosition_Ende_X_picBox, MousePosition_Start_Y_picBox);
                int current_Row = dGV_ImageList.CurrentCell.RowIndex;
                var text = dGV_ImageList.Rows[current_Row].Cells[7].Value;
                double Laenge = (Convert.ToDouble(MousePosition_Ende_X) - Convert.ToDouble(MousePosition_Start_X)) * Convert.ToDouble(text);
                e.Graphics.DrawString(Laenge.ToString(), Font, Brushes.Black, new Point(14, 5));
         
        }

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {

            if (Click_First == true)
            {
                Bitmap b = new Bitmap(pictureBox1.Image);
                MousePosition_Start_X_picBox = e.X;
                MousePosition_Start_Y_picBox = e.Y;
                MousePosition_Start_X = (b.Width * e.X / pictureBox1.Width);
                MousePosition_Start_Y = (b.Height * e.Y / pictureBox1.Height);
                label8.Text = "StartX:  " + MousePosition_Start_X;
                label7.Text = "StartY:  " + MousePosition_Start_Y;
                Click_First = false;
                label3.Text = Click_First.ToString();
            }
            else if (Click_First == false)
            {
                Bitmap b = new Bitmap(pictureBox1.Image);
                MousePosition_Ende_X_picBox = e.X;
                MousePosition_Ende_Y_picBox = e.Y;
                MousePosition_Ende_X = (b.Width * e.X / pictureBox1.Width);
                MousePosition_Ende_Y = (b.Height * e.Y / pictureBox1.Height);
                label6.Text = "Ende_X:  " + MousePosition_Ende_X;
                label5.Text = "Ende_Y:  " + MousePosition_Ende_Y;
                Click_First = true;
                pictureBox1.Refresh();
                label3.Text = Click_First.ToString();
            }
            
            if (e.Button == MouseButtons.Right)
            {
             Check_MessenEnde = true;
             pictureBox1.MouseDown -= new MouseEventHandler(pictureBox1_MouseDown);
             }
          }

07.07.2020 - 13:26 Uhr

Ich habe folgendes Projekt:
Ein Programm soll es ermöglichen eine undefinierte Menge an Bildern zuladen, diese anzuzeigen und im Nachhinein beliebig zu bemaßen.

Das Einladen funktioniert über ein DataGridView. Da ich es gerade parallel laufen lassen, d.h. PictureBox und Panel, es wahrscheinlich komplexer wird und ich mich langsam auf eins einigen muss, meine Frage an euch, was ist auf lange Sicht "besser"?

Wichtige spätere Funktionen sind:

  • mehrere Linien nacheinander oder getrennt zeichnen und mit entsprechendem Maß (Textbox) anzeigen
  • Labelfunktion - Textfeld mit eingelesenen Bildinformationen
  • Winkelmessung
  • Kontraständerungen/ Inverted
  • Bemasste Bilder abspeichern
    .....

Momentan habe ich mich mit der PictureBox angefreundet, aber ich bin mir nicht sicher, ob es der richtige Weg ist?

04.07.2020 - 13:59 Uhr

Hi,

ich lese TIFF-Bilder in ein DataGridview ein.
Um die Bilder weiterverarbeiten zu können brauche ich bestimmte Infos, die im Header gespeichert sind.
Zum Beispiel muss ich wissen, wieviel Nanometer einem Pixel entsprechen, um so später Bemassungen durchzuführen.

Nun aber zur eigentlichen Frage :
Gibt es eine einfache Möglichkeit, diese auszulesen?

Danke und viele Grüße

24.06.2020 - 11:06 Uhr

Weiß nicht warum, aber ohne was zu ändern läuft es jetzt. Danke für den Hinweis 😄