Laden...

Forenbeiträge von Zerstreute Ingesamt 7 Beiträge

05.08.2023 - 09:15 Uhr

Ja, die 4 Elemente sollen an in bestimmte Bereiche eines Formulars gedruckt werden. Das die Ränder mir hier dazwischengrätschen könnten, der Gedanke kam mir gestern auch.

Ich muß mir in der GUI  mal die Ränder anzeigen lassen, nachdem ich den Drucker ausgewählt habe. Die Werte scheinen ja auch davon abzuhängen welcher Drucker und welches Papier ausgewählt wurde. Werde das mal ausprobieren.

Danke nochmal für den Tip

04.08.2023 - 12:44 Uhr

Hi, erstmal Danke für den Hinweis mit dem dispose, habe das mal umgebaut.

Während der weiteren Versuche ist mir aufgefallen, dass ich dem Drucker erst mitteilen muß welches Format ich nutze. Sprich, entweder den Drucker selber auswählen durch eine eigene Auswahlbox oder nach der "printdocument.showDialog" das papierformat und Parameter zuweisen.

Dann passen die Positionen deutlich besser, nachdem der Drucker ausgewählt wurde, wurde jedesmal das Papier wieder auf A4 gestellt und dann auf a5 gezoomt .. das ergab komische Druckergebnisse.

Allerdings sind jetzt die Druckbereiche immernoch ganz leicht verschoben (x/y+5mm).. da muß ich mal schauen wo das her kommt ..

04.08.2023 - 06:53 Uhr

Hallo zusammen,

ich bin hier gerade etwas am verzweifeln. Ich möchte gern 4 Stringzeilen an einer bestimmten Stelle auf einem A5 Blatt ausgeben. Nun muß ich feststellen, dass die DrawString Methode unter Windows 7 und Windows 10 unterschiedlich arbeitet.

es geht um folgende Codeabschnitte, zuerst die Werte mit denen ich arbeite

 ZertifikatInfos = new ZertPosInfos()
            {
                PosName = new Point(62, 59),
                SizeName = 77.5,
                PosMAC = new Point(104,86),
                SizeMAC=36,
                PosVersion = new Point(40,86),
                SizeVersion=36,
                Abmessung = new Point(148,210)
            };	

und hier werden die Daten zur Positionierung benutzt :

        /// <summary>
        /// rechnet die Millimeterangaben der Zertifikatparameter in 1/100stel Zoll um
        /// </summary>
        /// <param name="milimeters">Abmessungen in mm</param>
        /// <returns>Wert in 1/100 inch</returns>
        int toInch(double milimeters)
        { return Convert.ToInt32(milimeters / 0.2536585); }

        /// <summary>
        /// Formatiert die Seitengröße 
        /// </summary> void createPrintData()
        {
            // Papierabmessungen in mm umrechnen in 1/100 inch
            int inchWidth = toInch(config.ZertifikatInfos.Abmessung.X);
            int inchHeight = toInch(config.ZertifikatInfos.Abmessung.Y);

            zert_printDocument.DefaultPageSettings.PaperSize = new PaperSize("custom", inchWidth, inchHeight);
        }
        
        /// <summary>
        /// wird durch die Druckvorschau und Druckvorgang ausgetriggert. füllt die Seite mit den Werten
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="ev"></param>
        void zert_PrintPage(object sender, PrintPageEventArgs ev)
        {
            int startX;
            int startY;
            int FontHeigth;
            Pen p = new Pen(Brushes.Black, 2.5F);
            float leftMargin = ev.MarginBounds.Left;
            float topMargin = ev.MarginBounds.Top;
            StringFormat sf = new StringFormat() { LineAlignment = StringAlignment.Center, Alignment = StringAlignment.Center };
            Rectangle area;
            // Variablen zuordnen
            string name = comboBox_device.SelectedItem.ToString() + "\n" + maskedTextBox_SerNoKW.Text + label_ID.Text + maskedTextBox_serNoLFN.Text;
            string version = textBox_FW.Text;
            string mac = textBox_MAC.Text;

            // Texte schreiben
            #region Gerätename und SerNo
            printFont = new Font("Arial", 12);
            FontHeigth = Convert.ToInt32(printFont.GetHeight(ev.Graphics));
            startX = toInch(config.ZertifikatInfos.PosName.X);
            startY = toInch(config.ZertifikatInfos.PosName.Y) - 3 * FontHeigth;

            area = new Rectangle(startX, startY, toInch(config.ZertifikatInfos.SizeName), Convert.ToInt32(FontHeigth * 3));
            ev.Graphics.DrawString(name, printFont, Brushes.Black, area, sf);
            ev.Graphics.DrawRectangle(p,area);
            #endregion

            #region Versionsnummer 
            printFont = new Font("Arial", 10);
            FontHeigth = Convert.ToInt32(printFont.GetHeight(ev.Graphics));
            startX = toInch(config.ZertifikatInfos.PosVersion.X);
            startY = toInch(config.ZertifikatInfos.PosVersion.Y) - (FontHeigth + 4);


            area = new Rectangle(startX, startY, toInch(config.ZertifikatInfos.SizeVersion), FontHeigth + 4);
            ev.Graphics.DrawString("V " + version, printFont, Brushes.Black, area, sf);
            ev.Graphics.DrawRectangle(p, area);
            #endregion

            #region MAC Adresse
            if (mac.Length > 8)
            {
                startX = toInch(config.ZertifikatInfos.PosMAC.X);
                startY = toInch(config.ZertifikatInfos.PosMAC.Y) - (FontHeigth + 4);
                area = new Rectangle(startX, startY, toInch(config.ZertifikatInfos.SizeMAC), FontHeigth + 4);
                ev.Graphics.DrawString(mac, printFont, Brushes.Black, area, sf);
                ev.Graphics.DrawRectangle(p, area);
            }
            #endregion
        }

Komischerweise scheint die Routine, mit der ich die Papiergröße festlege, nicht zu funktionieren. In der Vorschau ist alles korrekt aber auf dem Papier ist dann am Ende alles falsch angeordnet. was übersehe ich hier ? (XPS Print W7/W10 im Anhang)

Wäre echt toll, wenn mir hier jemand helfen könnte.
Danke schonmal im Vorraus.

16.04.2019 - 09:18 Uhr

Eine Vermutung hätte ich schon anzubieten: das OutputDataReceived-Event wird nur ausgelöst, wenn das externe Programm eine vollständige Zeile inklusive Zeilenumbruch schreibt.

Hallo MarsStein,

so was in der Art ist auch meine Vermutung da sobald ich das externe Programm starte auch mein Programm im Debugger keine Zeile weiter abarbeitet. Sprich sobald ich im Einzelschritt Betrieb den Process.Start() ausgeführt hab, gehts einfach im Programm nirgends weiter und eine Fehlermeldung bekomme ich auch nicht.

Obwohl im Fenster (bei nicht umgeleitetem Output) mehrere Zeilen stehen, scheint der StreamReader nicht ausgelöst zu werden. Ich befürchte beinahe das im externen Programm noch ein Programm oder Prozess gestartet wird der nicht im Output Stream ausgegeben wird. (ähnlich wie bei Putty)

könnte ich sowas irgendwie heraus bekommen ?

Gruß und Dank schonmal an alle

11.04.2019 - 15:54 Uhr

Ich sehe da eindeutig zu viele

KillTasks();  

tja .. leider ist die einzige Alternative die kontrolle über das DOS Tool zu nehmen und über windows an das Fenster den Druck der Space Taste zu simulieren - was am Ende übrigens nix anderes macht als das Programm zu beenden..

Vom Ablauf her sieht das so aus :

Programm mit Parametern starten .. dieses läuft dann im Shell Fenster und wartet auf "Space"-Druck in dieser Zeit zählt einfach nur ein Zähler die bereits abgespielten Samples.

Über 'Kill Prozess' stelle ich nur sicher das definitiv immer nur eine Instanz des Programms läuft da 2 Instanzen nicht gleichzeitig auf die ASIO Schnittstelle zugreifen können.

Was das Anpassen der KomboBox betrifft, hier wird diese Schleife vor der Freigabe der Box für den Benutzer modifiziert. Im Idealfall würde die Prüfung und Anpassung innerhalb weniger Millisekunden abgeschlossen sein. Der Grund für dieses unschöne Vorgehen ist, das ich über das externe Tool die "angeblich möglichen Samplefrequenzen" abfragen kann aber es mir leider immer alle von sich selbst unterstützten, jedoch nicht nur die von der Hardware unterstützen Frequenzen angibt. Daher muß ich, um es für den Benutzer möglichst ohne Fehlermeldungen laufen zu lassen, die Combobox immer beim Wechsel des ASIO Devices neu befüllen und dabei die nicht unterstützten entfernen.

Was ich mir jedoch als alternative Lösung vorstellen könnte, wäre:
Ich prüfe nur die kritischen Frequenzen und befülle dann die ComboBox mit den übrigen Frequenzen. Das wäre sicherlich auch vom Code her deutlich schöner und käme auch mit weniger Kills aus.

Abschließend nur ein Hinweis auf die Sleeps. Diese habe ich hinzugefügt weil es ohne Wartezeit z.T. Probleme beim Start des Shell Programms gab. Hier könnte ich sicherlich auch die Wartezeit noch etwas reduzieren.

Am Ende habe ich jetzt aber irgendwie den Eindruck das keiner von Euch mir sagen kann warum mein Programm hängt sobald das externe Tool gestartet wurde (und ohne Fehler läuft).

04.04.2019 - 16:31 Uhr

Hallo Zusammen,

ich habe mich mal wieder festgefressen bei einem Problem das wahrscheinlich viel einfacher zu lösen ist als ich denke.

Folgendes habe ich vor :

Ich schreibe an einer GUI für einen Ton-Generator der als Commandozeilentool vorliegt.
Dieser Generator wird mit Angabe von SampleFrequenz und Sinusfrequenz und weiteren Parametern gestartet, läuft dann im Fenster so lange bis man eine Taste drückt. In dieser Zeit läuft in diesem Fenster noch ein Zähler wodurch der Datenstrom in dem Fenster nicht aufhört bis man das Programm beendet oder im Fenster die Space Taste drückt.

Eine Teilfunktion meines Tools soll sein die möglichen Samplefrequenzen der ausgewählten Soundkarte zu erkennen.

Dazu starte ich das Tool einmal mit jeder bekannten Samplefrequenz und möchte eigentlich gern das er soweit kein Fehler auftritt sofort das Programm beendet und mit der nächsten Frequenz weiter macht. Leider wird die von mir vorgesehene Umleitung des Output Stroms nicht wie gewünscht angesprungen wodurch das Programm in eine Endlosschleife gerät und nicht weiter arbeitet bis ich das externe Fenster schließe.

Hier ist mein bisheriger Lösungansatz, der leider nicht wie gewünscht funktioniert :


...
Process Gen = new Process();
...
                        void Button_testClick(object sender, EventArgs e)
		{
			
			Gen.StartInfo.UseShellExecute=false;
			Gen.StartInfo.RedirectStandardOutput=true;
			Gen.OutputDataReceived +=proc_OutputDataReceived;
			Gen.StartInfo.RedirectStandardError=true;
			Gen.StartInfo.CreateNoWindow=false;
			
			for (int i=0;i<comboBox_SampleFreq.Items.Count;i++)
			{
				
				comboBox_SampleFreq.SelectedIndex=i;
				KillTasks();
				Gen.StartInfo.Arguments=Param.AsioArguments;

				Gen.Start();
				Gen.BeginOutputReadLine();
				if (Gen.StandardError.Peek()>0)
				{
					comboBox_SampleFreq.Items.RemoveAt(i--);
					
				}

			}
			Gen.OutputDataReceived -=proc_OutputDataReceived;
			comboBox_SampleFreq.SelectedIndex=0;
		}
		void proc_OutputDataReceived(object sender, DataReceivedEventArgs e)
		{
				string text =  e.Data;		
				KillTasks();
		}
		void KillTasks()
		{
			foreach (Process p in Process.GetProcessesByName(AsioTool.Replace(".exe",""))) {
				p.Kill();
				Thread.Sleep(500);
			}
		}

Hängt das Tool weil ich den Datenstrom im selben Thread laufen lasse wie die Hauptanwendung ? Oder wo liegt hier das Problem das nach ausführung von Gen.Start() alles wartet ?

Würde mich hier über Kritik, Anregungen und Hilfe sehr freuen.

Danke schonmal im Vorraus

04.05.2017 - 21:55 Uhr

Hallo Leute,

ich arbeite gerade an einem kleinen Prüfprogramm um bestimmte Prozesse bei mir zu vereinfachen.
Ich habe dabei innerhalb des Codes eine Datenklasse angelegt welche im Programmverlauf als Array verwendet wird.

Sprich aktuell sieht es bei mir so aus ..


Class Datablock
{
            string Path = @"d:\bin";
            public string Name;
            public string LANMode;
            public bool Note;
            public string ID;
            public Byte[] USB_Remap = new byte[3] { 0x21, 0x43, 0x05 }; // Image Address 0x36-0x38
            public Byte[] USB_Config = new byte[3] { 0x9b, 0x18, 0x00 };// Image Address 0x26-0x28
}

der dann im public Class Form1 zu nem Array wird ..


  ...
Datablock[] DataList = new Datablock[17];
...

nun möchte ich dieses Array gern in eine XML Datei exportieren. Am besten so das ich die einzelnen Datenfelder nicht im Programcode halten muß, sondern beim Start aus der XML lade.
Dabei sollte natürlich zu jedem Arrayeintrag alle Parameter ins XML übergeben werden.

Leider werde ich hierzu nicht wirklich fündig bei Google , also hoffe ich das Ihr mir hier weiter helfen könnt. Dieser ganze XML Bereich ist komplettes Neuland und irgendwie steig ich da noch nicht so richtig durch.

Bei Unklarheiten bitte ruhig nachfragen..

Danke schonma vorweg ..