Laden...
Avatar #avatar-2603.jpg
Dr.Z myCSharp.de - Member
Fachinformatiker Nettetal Dabei seit 07.12.2007 88 Beiträge
Benutzerbeschreibung

Forenbeiträge von Dr.Z Ingesamt 88 Beiträge

17.12.2015 - 17:29 Uhr

Die BindingSource wird ja definitiv nicht "null" sein, da du ja eine neue Instanz erzeugst und bereits Daten übergibst. Wenn du ein leeres Ergebnis zurück bekommst, müsste doch die DataTable leer / null sein, oder irre ich mich da?

18.04.2012 - 10:52 Uhr

Hallo zusammen,

erst einmal Danke für eure Antworten.
@husky410: Werde ich mir mal angucken, vllt ist eine Lösung dabei, die mir entgegenkommt.
@inflames2k:
Entwicklungssystem als auch späteres Zielsystem sind Windows XP.
Die Möglichkeit die Server als Netzlaufwerk einzubinden besteht. Da ich mir die Pfade aber aus einer Datenbank hole, finde ich das irgendwie "unsauber" - oder nicht?

12.04.2012 - 12:07 Uhr

Hallo zusammen,

ich möchte ein paar Dateien von \ServerA\Fraigabe\ nach \ServerB\Freigabe\ kopieren.
Bisher habe ich das immer mit File.Copy gelöst und dies funktioniert auch Einwandfrei.
Da ich gerne eine Kopier-Fortschritsanzeige für die aktuelle Datei hätte, habe ich auf die Klasse ShellProvider von inflames2k zurückgegriffen.

Nur bekomme ich immer die Fehlermeldung, die schon in diesem Beitrag
SHFileOperation kopiert nicht von CD-Laufwerk:> Fehlermeldung:

Datei kann nicht kopiert werden: Die Quelldatei oder vom Quelldatenträger kann nicht gelesen werden.

Die Beiträge in diesem Thread konnten mein Problem bisher nicht lösen

Mein Programm ist so aufgebaut, dass ich auf ServerA die zu kopierenden / zu verschiebenden Dateien suche und erst in ein tmp-Verzeichnis (auf ServerB) kopieren will und von dort in das entsprechende Zielverzeichnis (ebenfalls auf ServerB) verschieben möchte.

Die folgende Methode läuft in einem Thread, damit die GUI nicht hängt:


public void Move()
        {
            bool moved = true;
            DirectoryInfo di = Directory.GetParent(destination);
            string tempPath = di.FullName;

            string[] temp = new string[files.Length];

            try
            {
                for (int i = 0; i < files.Length; i++)
                {
                    // - Dateien aus Backup in tmp-Verzeichnis kopieren.
                    PreCopy(files[i]);
                    temp[i] = Path.Combine(tempPath, Path.GetFileName(files[i])); 
                    tempPath += files[i];
                    MyShellProvider.Copy(files[i], temp[i], true);
                    //File.Copy(files[i], temp[i], true);
                    tempPath = di.FullName;
                    CopiedOne();
                }

                for (int i = 0; i < temp.Length; i++)
                {
                    // - Dateien aus tmp-Verzeichnis in entsprechendes Zielverzeichnis kopieren.
                    PreMove(files[i]);
                    string DestPath =Path.Combine(destination, Path.GetFileName(files[i]));
                    MyShellProvider.Move(temp[i], DestPath, true);
                    //File.Move(temp[i], DestPath);
                    MovedOne();
                }
            }
            catch (Exception ex)
            {
                moved = false;
                errorMessage = ex.Message;
            }

            MovedAll(moved);
            //return moved;
        }

Den Fehler liefert mir schon die ShellProvider-Klasse - zum einen mit der obigen Fehlermeldung, zum anderen ist der Rückgabewert dieser Methode

private int RunFileOperation(string sSource, string sDestination, FO_Func func, FILEOP_FLAGS_ENUM flags)

in der ShellProviderKlasse 1026.

Hat jemand eine Idee, wo das Problem liegen kann?
Vielen Dank für eure Hilfe und Mühe. 😃

Dr. Z

13.02.2012 - 14:55 Uhr

Ich persönlich würde zum Datenbankdesign + x tendieren.
So hast du mit der Datenbank schon mal eine Grundlage für alle späteren von dir genannten Möglichkeiten.
Wenn du dann noch den Teil der Webseiten gestaltet bekommst, in dem es um die Datenpflege geht, hast du schon viel von deinen 70 Stunden verbraucht.

Das ist aber nur das, wie ich es machen würde - welchen Teil du letztendlich bearbeitest, bleibt natürlich ganz alleine dir und deinen Interessen überlassen.

Alles andere kannst (wenn du denn dann nach deiner Prüfung noch im Betrieb bist 😉 ) dann noch machen - oder es wird eines von diesen "never-ending-projekten" die gerne mal aus einer solchen Abschlussprüfung hervor gehen 😃

Wie gesagt: Setz dich hin und zerlege dir mal die einzelnen genannten Aufgabenbereiche bis ins kleinste Detail und schreib dir Zeiten dafür auf wie lange du dafür benötigen würdest. Die Zeiten sollten nicht ins Blaue geraten sein, sondern auf vorherigen Erfahrungswerten basieren, denn schließlich wirst du ja nicht zum ersten mal eine DB oder Webseiten erstellen.

Dann wirst du sehr schnell sehen, dass sich alles nicht realisieren lässt.

13.02.2012 - 13:55 Uhr

So auf den ersten Blick finde ich das Projekt an sich sehr umfangreich.

Die zentrale Frage ist:
Gibt es denn schon eine Datenbank in der die Infromationen vorhanden sind auf die du dann zurück greifen kannst, oder fällt das ganze Datenbankdesign dann auch noch mit in die Entwicklungsphase?

Ich denke, dass die auch schon so genügend zu tun haben wirst - und dir vllt zu viel Arbeit machst.

Aber letztendlich kann dir unsere Meinung doch egal sein, denn

  1. Ist es dein Abschlussprojekt
  2. Musst du dir das Thema auswählen, welches
    a. Die am besten gefällt
    b. einen Nutzen haben wird
    c. in der vorgegebenen Zeit realisieren lässt
  3. solltest du ein Thema wählen in dem du absolut fit bist - sogar fitter als als dein Prüfer. So kannst du sichergehen, dass du alle deren Fragen beantworten und nicht plötzlich (auch bei der Durchführung) vor unvorhergesehen Problemen stehst.
13.02.2012 - 13:05 Uhr

@bredator:
Ja, nur kann man das nicht unbedingt in die Zeitplanung schreiben 😉

Noch ein Tipp: Lege den Zeitplan so, dass du zwei Wochenenden in der Projektphase hast. Deine Dokumentation wird es dir danken.

13.02.2012 - 11:58 Uhr

Hi,

ob die von dir angesprochenen Punkte zeitlich zu realisieren sind, musst du doch selber ermiteln. Schließlich will die IHK von dir auch einen detallierten Zeitplan in dem die einzelnen Aufgabenschwerpunkte inhaltlich und zeitlich gegliedert sein müssen.

Am einfachsten ist es, wenn du anhand deines Erfahrungsschatzes das mögliche Projekt in die einzelnen Teileaufgaben gliederst und versuchst die einzelnen Aufgaben mit realistischen Zeitangaben zu versehen.

Schließlich wirst du sehen, ob du mit den vorgegebenen (70?) Stunden hin kommst, oder nicht.

Tip: Unterschätze nicht die Dokumentation vom Zeitumfang her.

21.04.2011 - 08:43 Uhr

picturebox.Image = Image.FromFile(Pfad zum Bild); ?

31.03.2010 - 09:03 Uhr

Vielen Dank für die Hilfe!

Werde mich mal mit dem genannten Programm auseinander setzen.

31.03.2010 - 08:00 Uhr

Ja genau, der Taskmanager.
Also ist's eigentlich kein "Problem" im eigentlichen Sinne?

Habe mal ausprobiert, wie sich das Ganze mit eine sehr vielen Bildern verhält. Die Speicherauslastung geht immer bis ca. 450MB hoch und fängt dann wieder bei ca 30MB an. Dieses Spiel wiederholt sich so lange, bis alle Bilder angezeigt sind.

30.03.2010 - 15:22 Uhr

Danke für die Antwort.

Mit dem Thread hast du recht. Das mit dem Application.DoEvents() war nur die quick and dirty Kurzversion 😃

Habe das mit dem Thumbnail grade mal eingepflegt:


pb.Image = Image.FromFile(files[i]).GetThumbnailImage(120, 90, null, IntPtr.Zero);

Erste Erkennstnis: Programmwachstum besteht weiterhin.
Beobachtung:
Sowohl mit als auch ohne Thumbnail sinkt die Speicherauslastung irgednwann wieder ein auf ca. 40MB und beginnt dann wieder, bei jedem erneuten Anzeigen an zu steigen.

Habe ich sehr viele Bilder, sinkt die Auslastung zwischen durch wieder und steigt weiter an.
Dieses Spiel wiederholt sich so lange, bis alle Bilder angezeigt sind.

30.03.2010 - 14:49 Uhr

Zeile 183 gibts bei mir gar nicht 😉

Also, der Code sieht so aus:


private void CreatePreview(string dir, string pattern)
        {
            pgb_load.Value = 0;

            //entfernen der alten, nicht mehr benötigten PictureBoxen
            for (int i = 0; i < pnl_picture.Controls.Count; i++)
            {
                pnl_picture.Controls.RemoveAt(i);
                i--;
            }

            
            //filtern der Suchergebnisse
            List<string> files = new List<string>();
            files.AddRange(Directory.GetFiles(dir, pattern));

            for (int i = 0; i < files.Count; i++)
            {
                if (files[i].Contains("thumb"))
                {
                    files.RemoveAt(i);
                    i--;
                }
            }

            int j = 0;
            int Top = 0;
            int Left = 0;

            pgb_load.Maximum = files.Count;

            //Anzeigen der gefundenen Bilddaten
            //immer 4 pro Zeile
            for (int i = 0; i < files.Count; i++)
            {
                PictureBox pb = new PictureBox();
                pb.Image = Image.FromFile(files[i]);
                pb.Height = 90;
                pb.Width = 120;                

                ...
                Anordnen der Bilder
                ...

                pb.Top = Top;
                pb.Left = Left;
                pb.SizeMode = PictureBoxSizeMode.StretchImage;
                pnl_picture.Controls.Add(pb);
                pgb_load.Value++;
                Application.DoEvents();
                j++;
            }
        }

That's it. Nicht wirklich was kompliziertes in meinen Augen.

30.03.2010 - 14:00 Uhr

Hallo zusammen,

ich scanne einen Barcode und muss zu diesem Barcode im System Bilder suchen und in einer Miniaturansicht anzeigen.

Eigentlich alles soweit kein Problem. Das Einzige was mir aufgefallen ist, dass nach jedem Anzeigevorgang der Bilder die Speicherauslastung um 20MB (bei 4 Bildern) ansteigt und auch so bleibt - bis zum nächsten Anzeigen.

An sich nicht schlimm, wenn die Anwendung nur einmal täglich, oder nach jedem Gebrauch wieder geschlossen werden würde. Dies ist aber nicht der Fall, sie wird sehr oft am Tag benutzt werden.

Die Pictureboxen mit denen ich die Bilder Anzeige erzeuge ich zur Laufzeit dynamisch.
Als übergeordnetes Steuerelement nutze ich ein Panel und füge die PictureBoxen diesem zu.

Ich habe schon versucht, die erzeugten Pictureboxen vor dem nächsten Anzeigen zu löschen mit

MyPanel.Controls.RemoveAt(index)
als auch
das Komplette Pnael zu löschen und neu zu erzeugen, aber das ändert nichts an der Problematik, dass sich die Speicherauslastung meiner Anwendung nicht verringert.

Würde mich sehr über ein paar hilfreiche Tips freuen!

20.01.2010 - 10:06 Uhr

In einer Schleife die in einer Schleife läuft.
Man das auch besteimmt direkt in einem Rutsch in die DB schreiben.
Da weiß ich aber grade nicht wie. Denke, dass es dann noch schneller geht.

Dr.Z

20.01.2010 - 08:33 Uhr

Wenn mich nicht alles täuscht, dann fehlt dir dein SQL-Stament.
"Insert Into" oder "Update"

02.09.2009 - 15:14 Uhr

Hi, ja, das hatte ich gemeint. 😃 War auch nur ne spontane Idee, die ich hatte.
Nebenbei heißt die if-schleife nicht if-schleife, weils keijne schleife ist, sondern nur eine Abfrage 😃

Ich denk nochmal drüber nach 😉

02.09.2009 - 13:49 Uhr

Dann setze doch den Focus vor dem Überpüfen einfach auf das Form zurück.

Viele Grüße

Dr. Z

07.04.2009 - 14:52 Uhr

Hat sonst noch wer eine Idee?

Ich habe da mal was programmiert, aber das funktioniert auch noch nicht so richtig:


files = Directory.GetFiles(@"\\10.156.107.130\Jobs\canon_1\HotFolder\", "*.pdf", SearchOption.TopDirectoryOnly);
                    if (files.Length > 0)
                    {
                        p = 1;
                        //late bind to the wsh network com object
                        //create an instance of a reflection type
                        Type t = Type.GetTypeFromProgID("WScript.Network");
                        //create an instance using the system activator, consuming the type
                        Object o = Activator.CreateInstance(t);
                        //invoke the method using the object we created
                        t.InvokeMember("SetDefaultPrinter", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] { "LFP1" });
                        Thread.Sleep(1000);

                        Process proc = new Process();
                        proc.StartInfo.CreateNoWindow = false;
                        proc.StartInfo.Verb = "print";
                        proc.StartInfo.FileName = files[0];
                        proc.Start();
                        proc.WaitForExit(5000);
                        proc.CloseMainWindow();
                        proc.Close();
                    }

so verfahre ich auch mit den anderen beiden Druckern, direkt im anschluss daran. nur klappt das nicht wirklich. ich schaffe es einen job zu drucken. Beim nächsten DruckJob mit dem nächsten Drucker schmiert mit das Programm mit einer

InvalidOperationException: Die angeforderten Informationen sind nicht verfügbarm da der Prozess beendet wurde.

ab.

Dr.Z

03.04.2009 - 10:38 Uhr

Danke für deine schnelle Antwort. Mit diesen Klassen habe ich mich auch schon beschäftigt, nur ist mir da schleierhaft, wie ich dort vorgefertigte .pdf Dateien an einen drucker senden kann.

Ich kann doch nur Streams an die einzelnen Drucker senden und eine pdf Datei ist ja in dem Sinne kein Stream.

Habe schonmal dran gedacht, immer den Standardrucker zu ändern, je nach dem in welchem Ordner grade eine .pdf Datei erzeugt wird.
Aber das ist ja sicherlich auch nicht das gelbe vom Ei.

Das war so gedacht, dass ich das Programmiertechnisch löse und nicht jedesmal manuell in die einzelnen Ordner gucke und den entsprechenden Drucker zum Standardrucker mache.

Dr.Z

03.04.2009 - 08:40 Uhr

Hallo zusammen,

ich habe folgendes Problem:
Es gibt drei Ordner und drei an den PC angeschlossene Drucker. Die Dokumente die in Ordner_A laden, sollen auf Drucker_A gedurckt werden. Ebenso verhält es sich mit den anderen Ordnern und Druckern:
Ordner_A -> Drucker_A
Ordner_B -> Drucker_B
Ordner_C -> Drucker_C

Bei den Dateien, die gedruckt werden sollen, handelt es sich um .pdf Dateien.

Ich habe schon gesucht, wie man die Datei einfach drucken kann. Mit folgendem Code


Process proc = new Process ();
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.Verb = “print”;
proc.StartInfo.FileName = “C:\\test.pdf”;
proc.Start();
proc.WaitForExit(10000);
proc.CloseMainWindow();
proc.Close();

ist es mir möglich, pdfs Dateien entsprechend zu drucken, allerdings nur auf dem Standardrucker. Gibt es evtl eine ergänzung, wie ich den Drucker festlegen kann, auf dem ich drucken kann?
Habe schonmal dran gedacht, immer den Standardrucker zu ändern, je nach dem in welchem Ordner grade eine .pdf Datei erzeugt wird.
Aber das ist ja sicherlich auch nicht das gelbe vom Ei.

Habt ihr da einen Vorschlag, oder kennt ihr vllt gar ein freeware tool, welches mir diese Arbeit abnehmen würde?

Dr.Z

01.10.2008 - 08:15 Uhr

Hi Bernd,

Danke für deine Antwort und mit zwei kleinen Modifikation klappt das ganze. 😉

  1. Dem da.SelectCommand kann man keinen String direkt zuweisen. Musste mit mit Hilfe von
SQLCOmmand cmd = new SQLComman("SELECT * FROM " + dt.TableName";

einen Command zusammen bauen.

  1. Dann noch dem SQLCommand.Connection Propertie die SQLCOnnection zur DB mitgegeben werden.
SQLCommand.Connection = SQLConnection;

Anschließend wie du bereits erwähnt hast den CommandBuilder initialisieren und los gehts mit

SQLDataDataAdapter.Update(DataSet, TableName);

Vielen Dank für deine Hilfe 🙂

30.09.2008 - 15:28 Uhr

Hi,

ich habe das gleiche Problem. Ich hole mir dir DB in mein Programm, füge Zeilen an die einzelnen Tabellen an und möchte die Datenbank dann wieder mit SQLDataAdapter.Update(DataSet) in die Datenbank schieben. Leider funktioniert dieser Vorgang bei mir nicht bzw. nciht vollständig. Es wird nur die erste Tabelle (die nur eine Kundennummer enthält) aktualisiert.

Ale weiteren Tabellen werden nicht aktualisiert.

Das Thema habe ich hier Nur teilweises Datenbankupdate eröffnet.

Hast du mitlerweile einen Lösungsweg gefunden? Ich trickste mich da momentan mehr oder weniger selber aus.

23.09.2008 - 18:30 Uhr

Hi Bernd,

danke für deine Antwort. Da habe ich mich wohl undeutlich ausgedrückt. Das ist nur ein Beispiel für eine Tabelle. Die Anderen Tabellen fülle ich genau so.

Also auch die Zeile erstellen, mit Daten füllen und dann an die Tablle anfügen.

Diese Anweisungen werden in einer Schleife durchlaufen. Ist diese beendet will ich das ganze DataSet dann wieder in die Datenbank schieben, aber das scheint ja aus einem mir nicht bekannten Grund nicht zu funktionieren. Habt ihr sonst noch eine Idee?


UPDATE:

Da sonst niemand eine Idee hat, präsentiere ich euch einfach mal meine momentane Vorgehensweise:

Da das Updaten der kompletten Datenbank mittels des DataSets nicht funktioniert, arbeite ich mit dem normalen SQLCommand. Ich mache ein Insert mit den entsprechenden Daten auf die Datenbank.
Vorher überprüfe ich jedoch mittels

DataTable.Select(SQLStatement);

ob dieser Datensatz schon in der Tabelle vorhanden ist.
Bei dieser DataTable handelt es sich allerding um eine Tabelle in meinem lokalen DataSet.

Ist der anzufügende Datensatz noch nicht vorhanden, so wird er mit dem oben angesprochenen SQLCommand an die Datenbank direkt angefügt. Zusätzlich muss ich diesen Datensatz an mein internes DataSet anfügen, damit die folgenden Abfrageprüfungen einen Sinn ergeben und nicht ins Leere laufen.

Das ganze klappt zwar, aber ich finde dies ist nicht wirklich elegant gelöst. Optimal wäre es meiner Meinung nach, wenn man das DataSet mit neuen Daten / Zeilen / Datensätzen füllt und mittels eines

SQLDataAdapter.Update(DataSet);

wieder alles in die Datenbank schieben könnte.

Für neue / weitere Hilfen, Anregungen und Infos würde ich mich freuen.

23.09.2008 - 18:03 Uhr

Ich benutze doch einen SQL Data Adapter. Mit diesem stelle ich die Verbindung zur DB her und hole mir doch mit

MyAdapter.Fill(db_dpterm);

alle Tabellen meiner DB in mein DataSet.
Ich kann ja auch alle einzelnen Tabellen per Index oder vorheriges TableMapping ansprechen und Werte hinzufügen.

Nur das Updaten fnktioniert nicht (richtig). Oder meinst du, dass ich für jede einzelne Tabelle ein eigenes DataSet respektive einen SQLAdapter erstellen?

23.09.2008 - 16:00 Uhr

verwendetes Datenbanksystem: MS SQL Server 2005 Express Edition

Hallo zusammen.

ich komme einfach nicht mehr weiter. Auch die Suche im Forum hat mir viele nützliche Tips geliefert, aber jetzt bin ich wirklich mit meinen Ideen am Ende.
Habe auch die KApitel des OpenBooks dazu gelsen 🤔 X( ?(

Ich habe eine Datenbank mit 4 Tabellen.

Mit


MyAdapter = new SqlDataAdapter(SQLStatement, MySQLConnection);
db_dpterm = new DataSet("db_dpterm");
MyAdapter.Fill(db_dpterm);

hole ich mir die (leere) Datenbank in mein Programm.

Anschließend möchte ich in die einzelnen Tabellen des DatsSets neue Zeilen anfügen. Das klappt auch alles soweit:


if (!TableContainsKey(tbl_Auftrag, "auftragsnr= " + Auftragsnummer + " AND kundennr=" + Kundennummer + " AND teileID=" + TeileID.ToString()))
            {
                DataRow NewRow = db_dpterm.Tables["tbl_Auftrag"].NewRow();
                NewRow[0] = Auftragsnummer;
                NewRow[1] = Kundennummer;
                NewRow[2] = TeileID.ToString();
                NewRow[3] = Datum;
                db_dpterm.Tables["tbl_Auftrag"].Rows.Add(NewRow);
            }

(Dies ist ein Beispiel für eine Tabelle. Alle anderen Tabellen fülle ich genau so. Das ganze wird (für alle Tabellen) in einer Schleife durchlaufen)

Vor meinem


MyAdapter.Update(db_dpterm);

weisen die Tabellen des DataSets alle die richtigen Einträge auf.
Mache ich das Update und möchte ich mir die Daten über die MS SQL Mangement Studio Console angucken, stelle ich erstaunt fest, dass nur die eine Tabelle (Tabelle Kunde --> eine Spalte --> Kundennummer) neue Werte besitzt.

Alle anderen Tabellen sind weiterhin komplett leer. Ich komm einfach nicht dahinter, woran das liegt.

Wenn wenigstens keine Tablle mit Werten gefüllt werden würde, wäre das irgendwie verständlicher, aber nur die eine Tabelle und die anderen nicht? da steige ich einfach nicht hinter.
Hoffe ihr habt da noch eine greifende Idee, ich häng nun schon fast den ganzen Tag dran. Ich habe sämtliche möglichkeiten ausprobiert.

04.08.2008 - 10:22 Uhr

Hallo zusammen,

ich beschäftige mich momentan mit dem Drucken aus C# heraus. Das klappt an sich eigentlich ganz gut.
Um das drucken an sich wesentlich flexibler zu gestalten, habe ich mich gefragt, ob es möglich ist, anhand der Schriftgröße und z.B der Papiergröße des Druckers eine maximale Zeilenanzahl bzw. Zeichenanzahl pro Zeile zu ermitteln.

Als Schrifttyp verwende ich immer "FontFamily.GenericMonospace". Das heißt, alle Zeichen besitzen die selbe Breite.

Da aber die Schriftgröße von Druck zu Druck varieren kann, wollte ich fragen, ob es eine möglichkeit gibt zu ermitteln, wieviele Zeichen pro Zeile und Zeilen mir insgesamt zur Verfügung stehen.

Bei einer Seitengröße von 200 + 400 LE und einer Schriftgröße von 11 kann ich ja nicht wie folgt vorgehen:
200 / 11 = 18,18... -> 18 Zeichen Pro Zeile
400 / 11 = 36,36... -> 36 Zeichen Pro Zeile.

Das geht ja nicht. 🙂
Habt ihr da eine Idee, wie ich da genau vorgehen kann / soll / muss?

vielen Dank

Dr. Z

21.07.2008 - 10:57 Uhr

Hallo zusammen 🙂

Vielen Dank für eure Antworten.

Einen entsprechenden Verweis hinzufügen hat mein Problem gelöst. Nun habe ich alle Klassen zur Verfügung, die ich zum Drucken benötige.

vielen Dank nochmal an euch beiden.

21.07.2008 - 08:23 Uhr

Hallo, danke für deine Antwort.

Schon das Wort "Verweis" hat mich glaub ich auf den richtigen Pfad gebracht. Ich habe nun einfach einen Verweis zum Projekt hinzugefügt und werde dieses nun mal testen.

vielen Dank für deine Antwort.

21.07.2008 - 08:14 Uhr

Hallo zusammen,

es muss doch möglich sein, aus der Konsole heraus zu drucken, oder etwa nciht? Bei einer Windows-Forms-Anwendung steht mir der Namespace System.Drawing.Printing zur Verfügung. In einer Konsolenanwendung aber nicht.

Kann mir jemand den entscheidenden Tip geben?

Danke für eure Hilfe

Dr. Z

16.07.2008 - 12:10 Uhr

Hallo Joetempes,

danke für deine Antwort, das hört sich sehr einfach und logisch an. Werde das mal ausprobieren. 🙂

Was mir daran vllt nicht so gefällt, ist die Tatsache, dass das ganze ja nicht wirklich unabhängig ist. Ich müsste ja jedesmal, wenn ich in einem anderen Projekt ein Etikett drucken müsste, dieses Form komplett neu anlegen.

Hatte mir das Konzept in etwa so vorgestellt, dass ich eine Klasse / Methode erzeuge, die entweder eine Datei oder halt den String entgegen nimmt und dann druckt. So müsste ich immer nur diese KLasse / Methode in meine anderen Projekte bei bedarf implementieren und könnte auch hier Etikettendesignunabhängig (wow, was für ein Wort 🙂 drucken.

Von daher würde mir eine varaibler Lösungsansatz mehr zusprechen.

Danke für deine Antwort.

Dr. Z

16.07.2008 - 11:44 Uhr

Konvertier die Farbe erst in einen ARGB-Wert, diesen anschließend in einen String und dann speichern.
Beim laden kannst du den String dann einfach mit Color.FromARGB(gepseicherte_Farbe_als_String) wieder herstellen.

Hoffe das hilft dir weiter.

Dr. Z

16.07.2008 - 11:31 Uhr

Hallo juetho,

danke für deine Antwort. Natürlich habe ich die Suche benutzt, nur kann mir leider keiner dieser Beitrage helfen. Einige Beiträge passen garnicht auf meine Suche, andere schon eher, jedoch geht es dabei nicht wirklich um den Vorgang, wie ich zum Drucken gelange.

Das wiederum sind ja meine eigentlichen beiden Fragen. Welche Methode geeigneter ist. Und je nach geeigneterer Methode kommen dann natürlich neue Fragen auf, die es dann zu einem späteren Zeitpunkt zu klären gillt.

Auch habe ich das Openbook zur Hilfe gezogen, jedoch wird hier an sich nur der Druckvorgang an sich beschrieben, nicht jedoch wie ich z.B. einen Text zum Drucken erzeuge. Ob ich diesen temporär speichere oder sofrt ausgebe.

Die in der Suche gefunden Themen helfen mir in diesen Punkten leider nicht weiter.

Dr. Z

16.07.2008 - 11:03 Uhr

Vllt wenn du eine weitere Propertie in deiner Klasser erzeugst. Diese Propertie könnte vllt eine Collection sein in der alle anderen Propertiers der Klasse enthalten sind. So könntest du diee Collection dann nutzen um sie zu durchlaufen.

Ist nur ne spontane Idee von mir.

Dr. Z

16.07.2008 - 10:05 Uhr

Hallo zusammen,

ich habe in einer Anwendung Daten, die ich auf einem Etikettendrucker ausdrucken muss. Bisher habe ich mir so geholfen, die zu druckenden Daten in einem String inklusive "\n" zusammen zu fügen und anschließend zu drucken.

Nun geht es an die Überarbeitung / mehr Neuentwicklung des Programms, da im Laufe der Zeit sich vieles als sehr sehr schwachsinnig programmiert heraus gestellt hat. Nun denke ich, dass dies auch meine Drucklösung ist.


str_print = str_print + "\n                   " + str_kiste + "\n\n" + str_teil + "\n    Ältester Auftrag ist vom:\n    " + str_date;
                prd_print.DocumentName = "Etikettet wird gedurckt";
                prd_print.Print();              
.
.
.

            Font a = new Font(FontFamily.GenericSansSerif, 12, FontStyle.Bold);
            Point p = new Point(0, 0);
            e.Graphics.DrawString(str_print, a, Brushes.Black, rec_etikett);
 

Die Daten nachher an den Drucker zu bekommen, ist nicht das Problem, sondern die Vorgehensweise vorher.

Sollte ich mir vorher eine temporäre Datei erzeugen und meine Daten Zeilenweise darin speichern und diese Datei dann letztendlich drucken?
Sollte diese Methode geeignet sein, was muss ich dann letztendlich beim drucken beachten? Papiergröße, Ränder usw?!

Oder ist dies eher nicht so sinnvoll und ein Drucker der Daten "direkt" aus der anwendung heraus wäre geeignetet, so wie ich es jetzt löse? Ich finde diese Art des Druckens aber sehr "grauenhaft", da ich mir wirklich jede einzelne Zeile Zeichenweise zusammenbauen muss usw...

Würde mich sehr über nützliche Tips, Links und Ideen freuen.

Dr. Z

07.07.2008 - 13:28 Uhr

Hallo zusammen,

danke für eure Tips, hat mir sehr geholfen. Habe es wie Khalid vorgeschlagen hat umgesetzt.

Danke nochmals

Dr. J. Z.

07.07.2008 - 12:24 Uhr

Hallo zusammen,

ich nutze eine TreeView um mir grade gescannte Werte und deren Details anzeigen zu lassen.

Nun reicht irgendwann der Platz nicht mehr aus um alle Daten anzeigen zu lassen und die Scrollbar taucht auf. Alles halb so wild, nur möchte ich gerne, dass die ich beim erneuten Anfügen eines Datensatzes automatisch runter zu diesem (letzten angeüfgten Satz) scrolle.

Bei einer RichTextBox war dies ja noch recht simple mit SelectionStart und SelectionLength.

Hat jemand ne Idee, wie ich hier vorgehen muss?

Vielen Dank

Dr. Z

12.06.2008 - 15:07 Uhr

Danke für den Link,

aber ich glaube der MS Certified Partner ist vllt doch was "aufgeblasen" im Umfang.
Es geht sich halt darum, möglichst viele Developer Tools zu bekommen, zu einem reltivgeringem Preis.

gibt es sowas wie einen "certified developer", dem nur speziell die Developer-Produkte von MS zur Verfügung stehen?

Dr. John Z.

12.06.2008 - 10:57 Uhr

Hi und danke für deine Antwort 🙂

das mit dem MCP = Microsoft Certified Partner war meine "Eigenkreation". Wusste nicht, dass dieses kürzel schon "belegt" ist und einem anderen Sinne zu gute kommt 🙂

Das mit dem ISV ist so ne Sache. Ich arbeite für ne Firma, die eigentlich rein garnichts mit Softwareentwicklung für den freien Markt zu tun hat.

Denke von daher wäre der ISV wohl der flasche Ansatz.
Heißt dies dann, dass sowieso nur Firmen, freie Softwareentwickler, die Software für den freien Markt entwickeln zum ISV oder Microsoft Certified Partner werden können?

VG Dr. Z

12.06.2008 - 10:34 Uhr

Hallo zusammen,

beim belesen über c# stößt man immer wieder über den Begriff Microsoft Certified Partner und deren Vorteile, was Lizenzen und neue Programme und so betrifft. Nun meine Frage:

Wie wird man MCP?
Welche Bedingungen muss mal (als Unternehmen) erfüllen?

Habe mal diverse Seiten bei MS durchsucht, nur findet man da was zu allen mögliche Partnerprogrammen und nichts für mich relevantes.

Wenn ihr mehr wisst, oder gar nen guten Link habt, wäre ich euch sehr dankbar mir diese Infos zu kommen zu lassen.

Dr. Z

04.06.2008 - 12:39 Uhr

Vllt genau so wie du es auf dem Papier gelöst hast 😉

Meinst du, es ist möglich das ganze mal hier als Beispiel zu posten?

Dr. J. Z.

03.06.2008 - 17:06 Uhr

Hallo Psy,

danke für deine ausführliche Erklärung. Bin jetzt um vieles schlauer.
Großes Lob 🙂

Danke nochmals.

Dr. J. Z.

03.06.2008 - 14:46 Uhr

Hi! Wenn Du die Ideen der Helfenden nicht aufgreifst, ist eine Lösung des Problems nicht möglich. 😦

Es heißt nicht, dass ich seine Lösung nicht aufgreifen möchte oder akzeptiere. Ich denke halt nur, dass diese MEthode aus meiner Sicht für das Programm weniger gut geeignet ist, auch wenn ich damit vllt relativ felxibel bleibe.

Ob Deine Logik stimmt, kannst Du mit Hilfe des Debuggers verifizieren.

Mit meinen Kenntnissen, die ich bis eben hatte, stimmte die Logik. Laut Debugger waren immer genau die Teile Text markiert, die ich auch markieren wollte.

Du wirst doch irgendeinen Indikator für den Wechsel der Farbe in Deinem Pflichtenheft stehen haben? 🙂

Ich verweise mal auf den Anhang. Besondern interesant um deine Aussage zu beantworten ist das bild unten links. 😉
Oder: Der Indikator für den Farbwechsel ist der Moment, in dem neuer Text in meine RTB geschrieben wird 😉
Such dir doch bitte die Möglichkeit aus, die dir mehr zusagt 😉

Viele Grüße Dr. J. Z.

Edit:
Hier dann noch wie verlangt der Code. Hat sich nicht viel verändert, das alte wurde auskommentiert und durch das neue ersetzt:


        private void button1_Click(object sender, EventArgs e)
        {
            laenge = output.Length;
            //richTextBox1.Text += output; <-- Das war der "Übeltäter"
            richTextBox1.AppendText(output); //<--So gehts Prima
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            richTextBox1.SelectionStart = richTextBox1.Text.Length  - laenge;
            richTextBox1.SelectionLength = richTextBox1.TextLength;
            
            if (black)
            {
                richTextBox1.SelectionColor = Color.Green;
                black = false;
            }
            else
            {
                richTextBox1.SelectionColor = Color.Blue;
                black = true;
            }
            
            richTextBox1.ScrollToCaret();
        }
03.06.2008 - 14:35 Uhr

Hi psy

danke für deine Antwort. Diese hat mir sehr geholfen, dein Vorschlag funktioniert prima.
Trotzdem wirft mir die Antwort noch eine Frage auf 🙂

Du sagst, dass wenn ich mit

+=

arbeite, alle komplette Formatierungen verloren gehen.
Aber wieso funktioniert meine Methode dann zweimal? 🙂
Nach dem ersten Clicken ist der Text schwarz. Nach erneutem Clicken bleibt der vorherige Text schwarz, der neue Text is grün.

Nach deiner Aussage müsste doch der komplette Text dann grün werden, oder sehe ich das falsch?

Ich weiß, das wird eine Diskussion um 1000 Ecken, aber ich finds irgendwie höchst interessant 🙂

03.06.2008 - 13:53 Uhr

Hallo 🙂

Ja, natürlich würde das gehen, werds jetzt auch erstmal so in Angriff nehmen.
Trotzdem würde ich gerne wissen, warum meine Methode nicht so ganz funktioniert?
Vor allem muss ich dann keine Schleife durchlaufen, was bei immer mehreren Datensätzen doch recht intensiv wird.

Und so wie ich das sehe, würde ich doch bei der hier angebotenen Methode bei jedem Adden wieder das komplette Array durchlaufen und würde alle Textteile neu einfärben.
Oder sehe ich das falsch?

Viele Grüße

Dr. J. Z.

03.06.2008 - 12:56 Uhr

Hallo und danke für deine Antwort.

Jedoch gehet bei mir eine Textausgabe übermehrere Zeilen. Wieviele Zeilen genau, kann vorher nicht bestimmt werden, es ist also variabel.

Ich könnte natürlich deine Methode anders umsetzen, jedoch finde ich dies sehr aufwendig.

Zusätzlich würde ich gerne wissen, wo denn bei meiner Methode der Haken an der Sache ist. Weil rein logisch gesehen müsste das doch hinhauen, oder nicht?

Vielen Dank für deine Antwort:

Dr. J. Z.

03.06.2008 - 11:04 Uhr
  
            textBox1.SelectionStart = 0;  
            textBox1.SelectionLength = 0;  
            textBox1.ScrollToCaret();  
  

jap, das meinte ich ja auch 🙂

Wohl was unklar ausgedrückt auf Grund der RichTextBox

Dr. J. Z.

03.06.2008 - 10:50 Uhr

kann mich wer verschieben? 🙂

03.06.2008 - 10:45 Uhr

Hallo.

Die RichTextBox scrollt auch nicht automatisch nach unten. vllt ist das auch eine geeignete Lösung für dein Problem. Man sieht immer den obersten Eintrag.

Bei einer RichTextBox gibt es die Funktion ScrollToScaret().
Diese Funktion scrollt automatisch bis zum Ende der mit SelectionStart und SelectionLength markierten Stelle. Markierst du also deinen Kompletten Text mit SelectionStart = 0 und SelectionLength = Length und führst anschließen ScrollToScaret() aus, scrollt die RichTeextbox automatisch na ganz unten.

Viele Grüße

Dr. J. Z

03.06.2008 - 10:20 Uhr

Hallo.

ich dachte immer, dass es eines deiner eigenen Programme ist. Kannst du den Quellcode einsehen? Wenn ja, müsste die Stelle doch leicht zu finden sein, wie und wo das Programm sich den angegebenen Sprachen bemächtigt.

Ansonsten hätte ich aber auch leider keine Idee mehr.

Dr. J. Z

03.06.2008 - 10:15 Uhr

Hallo zusammen,

ich habe eine Richtextbox und muss die automatischen Ausgaben (die über mehrere Zeilen gehen) immer im wechsel unterschiedlich farblich gestalten.
Ich Arbeite mit SelectionStart, SelectionLength und SelectionColor.
Die ersten beiden Ausgaben werden korrekt angezeigt (die Erste ist schwarz, die Zweite grün).
Kommt nun die dritte Ausgabe hinzu, ändern alle 3 Ausgaben ihren Farbe auf schwarz. Die vierte Ausgabe ist wieder entsprechend grün. Mit der fünften Ausgabe wird wieder alles schwarz. Und so geht das Spiel immer munter weiter.

So realisiere ich das ganze:


private void button1_Click(object sender, EventArgs e)
        {
            laenge = output.Length;
            richTextBox1.Text += output;
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            richTextBox1.SelectionStart = richTextBox1.Text.Length - laenge;
            richTextBox1.SelectionLength = laenge;
            string a = richTextBox1.SelectedText;

            if (black)
            {
                richTextBox1.SelectionColor = Color.Green;
                black = false;
            }
            else
            {
                richTextBox1.SelectionColor = Color.Black;
                black = true;
            }
            
            richTextBox1.ScrollToCaret();
        }

Ich kann mir nicht erklären, wo das Problem liegt. Entweder sehe ich den Wald vor lauter Bäumen nicht, oder es ist doch ein anderes Problem.

Hoffe ihr könnt mir helfen

Dr. J. Z.