Laden...

Forenbeiträge von el_vital Ingesamt 346 Beiträge

29.08.2011 - 13:01 Uhr

Was meint ihr zu der Lösung das Bild in einer Windows-Form-Anwendung intern mit WPF zu laden, zu verkleinern und über ein ByteArray zurück in ein Bitmap-Objekt zu konvertieren und wie gewohnt weiter zu verwenden? Spricht etwas dagegen?

27.08.2011 - 11:47 Uhr

Vielen Dank herbivore für deine Versuche.
Ich überlege das Zeichnen in kleine Schritte zu unterteilen.
Ich könnte das eine Bild auch selbst unsafe auf das andere kopieren und dabei Pixel auslassen. Es wäre auch verkleinert, allerdings ohne irgend einer Interpolation.

26.08.2011 - 20:55 Uhr

herbivore hat mich netterweise gebeten ein Mini-Projekt anzuhängen, welches das Verhalten vorführt. (Trotz: 4.1 Bitte keine kompletten Projekte anhängen)

Hier ist es nun. Ich hoffe immer noch für dieses Problem eine Lösung zu finden.

25.08.2011 - 18:55 Uhr

Eine Frage habe ich noch. In meinem GUI Thread lasse ich jetzt eine Animation laufen. Es läuft auch flüssig bis in einem zweiten Thread folgendes passiert:


    Bitmap btmTemp = new Bitmap(BreiteNeuTemp, HoeheNeuTemp);
                    Graphics gf = Graphics.FromImage(btmTemp);
                    
                    gf.CompositingQuality = CompositingQuality.HighQuality;
                    gf.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    gf.SmoothingMode = SmoothingMode.HighQuality;
                    gf.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
                    

                    gf.DrawImage(btmUebergabe, new Rectangle(0, 0, BreiteNeuTemp, HoeheNeuTemp), new Rectangle(0, 0, btmUebergabe.Width, btmUebergabe.Height), GraphicsUnit.Pixel);
                  

Während der Operation gf.DrawImage stockt meine Animation in dem Haupt-Thread. Wie kann es passieren? Die CPU Kerne sind nur leicht ausgelastet und es sollte die GUI doch überhaupt nicht beeinflussen?

24.08.2011 - 18:11 Uhr

WOW, ich bin begeistert. Ich habe die Funktion in ein extra Thread ausgelagert und nicht nur das ich jetzt bequem eine "Bitte warten" Animation anzeigen kann, die Abarbeitung ist fast doppelt so schnell. In dem GUI Thread haben also Timer und verschiedenen Events die Abarbeitung zwischen durch gestört.

Danke für den Schubs in die richtige Richtung!

22.08.2011 - 18:49 Uhr

Ich danke euch für die Meinungen. Ganz tief im Inneren weiß ich, dass es sinnvoll und sauber ist solch eine Aufgabe in einen eigenen Thread auszulagern. Jedoch sperrt sich meine Faulheit und mein geringes Wissen in diesem Bereich das auch zu tun.

Wenn ich mal mehr zeit habe werde ich es so umsetzen. Das Problem ist, dass der Code in dem jetzigen Zustand nicht direkt in ein Thread auszulagern ist. Es ist nicht sauber programmiert und es gibt im Ablauf zu viele Zugriffe auf die GUI.

22.08.2011 - 16:19 Uhr

Ich habe in meinem Programm eine Funktion bei der der Benutzer ein Bild von einem Speichermedium auswählt. Nach der Auswahl wird es vorverarbeitet und angezeigt.
Diese Aktion mit Öffnen des Bildes, Vorverarbeitung und anschließendem Refresh() der PictureBox wo das Bild angezeigt wird, dauert rund 2 Sekunden. In dieser Zeit zeige ich ein Wait-Cursor an.

Jetzt habe ich hier im Forum gelesen, dass man Aktionen die länger als 1/10s dauern in eine extra Thread auslagern sollte. Macht es in diesem Fall Sinn? Auch wenn der Benutzer in diesen 2 Sekunden sowieso nichts anderes machen kann?

17.08.2011 - 20:52 Uhr

oh, ich habe gerade eine Lösung gefunden. Wenn ich die pictureBox in eine weitere Picturebox anstatt eines Panels packe, dann gibt es diese Probleme nicht. Schade, dass eine Picturebox nicht in dem Designer Child-Elemente aufnehmen kann.

Nachtrag: das geht auch mit einem Panel. Also Panel ableiten, DoubleBuffer Style zuweisen und dieses Panel als Untergrund verwenden.

17.08.2011 - 20:45 Uhr

Hallo herbivore,

ich habe die PictureBox dafür extra abgeleitet:


   class myPictureBox : PictureBox
    {
        public myPictureBox()
        {
            this.SetStyle(

              ControlStyles.AllPaintingInWmPaint |

              ControlStyles.UserPaint |

              ControlStyles.DoubleBuffer, true);

        }
    }

Oder ist es so falsch?

17.08.2011 - 19:45 Uhr

Ich habe die wichtigsten Themen zu dem Flackern eines Controls durchgelesen und schon alles durchprobiert, aber ich bekomme eine PictureBox nicht ohne Flackern vergrößert bzw. verkleinert.

Die PictureBox ist in einem Panel, beinhaltet ein Bild und SizeMode ist auf Zoom eingestellt. Die Größe wird über eine TrackBar mit diesem Code verändert:


   private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            pictureBox.SuspendLayout();

            int TempVar = 0;

            TempVar = trackBar1.Value - pictureBox.Height;

            if (TempVar < 0)
            {
                TempVar = TempVar * -1;
                if ((pictureBox.Width - TempVar) >= 50)
                {
                    pictureBox.Size = new System.Drawing.Size(pictureBox.Width - TempVar, trackBar1.Value);
                    pictureBox.Location = new System.Drawing.Point((int)Math.Round(pictureBox.Location.X + TempVar / 2f), (int)Math.Round(pictureBox.Location.Y + TempVar / 2f));  //--- Position des Vorschaubildes
                }
                else
                    return;
            }
            else
            {
                pictureBox.Size = new System.Drawing.Size(pictureBox.Width + TempVar, trackBar1.Value);
                pictureBox.Location = new System.Drawing.Point((int)Math.Round(pictureBox.Location.X - TempVar / 2f), (int)Math.Round(pictureBox.Location.Y - TempVar / 2f));  //--- Position des Vorschaubildes
            }

            pictureBox.ResumeLayout();
        }

Könnt ihr mir noch ein paar Tipps geben? Es flackert wenn die Ränder des Bildes zu sehen sind. Also wenn das Bild relativ klein ist.

Danke im Voraus.

11.08.2011 - 10:40 Uhr

Es gibt vorsichtige Nutzer die die Anwendung erst in der Virtuellen Maschine laufen lassen. Es hatten sich bei mir drei Leute deswegen gemeldet und darauf hin habe ich es überprüft.

10.08.2011 - 20:42 Uhr

Hallo,

ich habe ein Problem in dem 16 Bit Farbmodus unter Windows XP festgestellt. Dort funktioniert die Funktion Cursor.Hide(); nicht. Das Problem wurde mir letzte Zeit öfters gemeldet weil der "Windows XP Mode" unter Windows 7 auf 16Bit eingestellt ist.

Kennt jemand vielleicht eine Lösung dafür?

EDIT: Ich sehe gerade, dass es nichts mit 16Bit Farbqualität, sondern mit Integrationsfeatures zu tun hat. Da kann man wahrscheinlich nichts dran ändern.

07.08.2011 - 16:23 Uhr

Ich habe es jetzt so gemacht wie ich es vor hatte. Ich zeichne die fehlende Strecke zwischen den MouseMove-Ereignissen nach. Allerdings habe ich das Zeichnen auf 1ms reduziert. Ich hatte jedes mal bitmap.LockBits() durchgeführt und nach dem zeichnen wieder frei gegeben. Jetzt mache ich es nur bei MouseDown und gebe es bei MouseUp wieder frei.

06.08.2011 - 21:34 Uhr

Du kannst versuchen, das Zeichen und Verarbeiten komplett asynchron zu implementiern

Jede Aktion (Zeichnen) ist von der vorherigen abhängig, also muss es schon synchron ablaufen.

Alternativ könntest du mal einen Blick auf DirectInput werfen - evtl. lassen sich damit höhere Inputfrequenzen erreichen. Allerdings kommt ein wenig Aufwand für Umrechnungen etc. hinzu.

Danke für das Stichwort, ich schaue es mir an.

06.08.2011 - 21:15 Uhr

Ich versuche ein Stempelwerkzeug zum retuschieren von Bildern zu implementieren.
Soweit funktioniert alles. Nur das MouseMove wird nicht oft genug ausgelöst um bei schnelleren Mausbewegung durchgehend zu zeichnen. Meine Funktion zum zeichnen ist parallelisiert und optimiert, so dass es im Schnitt 15ms für die Abarbeitung benötigt.

Jetzt kann ich mir die alte Mausposition merken und eine Differenz mit der neuen Bilden. In diesem Abstand muss ich dann alles zeichnen. Ich habe also zwei Punkte mit den jeweiligen X/Y- Koordinaten. Ich müßte mir die Steigung errechnen und zu jedem X-Wert den Y-Wert errechnen und zeichnen. Beziehungsweise würde ich nicht auf jedem Punkt zeichnen, sondern an jedem Viertel des Radius meines Werkzeugs.

Oder gibt es eine Möglichkeit die aktuelle Mausposition öfters zu bekommen?

09.07.2011 - 11:08 Uhr

Wenn ich unter Windows 7 folgendes mache:
Directory.GetDirectories("C:\Users\VS\AppData\Local", "test", SearchOption.AllDirectories);

Bekomme ich eine Exception:

System.UnauthorizedAccessException:

Der Zugriff auf den Pfad "C:\Users\VS\AppData\Local\Anwendungsdaten&quot; wurde verweigert.

Unter Windows XP funktionierte es noch.

Gibt es eine Alternative zu Directory.GetDirectories() wo alle Verzeichnisse zurück geliefert werden auf die Zugriff möglich ist?

21.06.2011 - 21:18 Uhr

Dieses Tool kann die Einträge sehr schnell umsortieren. Es scheint so zu sein, dass die Indizes in der Datentabelle einfach geändert werden.
Ich finde aber leider keine Informationen darüber wie es gemacht wird.

21.06.2011 - 12:37 Uhr

Das Thema ist zwar schon sehr alt, aber genau darum geht es bei meiner Frage.
Ich möchte ein kleines Programm für mich programmieren um den Inhalt einer Fat32 Speicherkarte nach meinem Wunsch zu sortieren.

Die Dateien werden unter Windows zwar sortiert angezeigt, aber in Geräten mit embedet Systemen sind die Dateien durcheinander. Ich nehme an, dass es die Reihenfolge wie die Daten auf das Dateisystem geschrieben wurden.

Gibt es eine einfache Möglichkeit die Reihenfolge unter C# zu beeinflussen?

14.05.2011 - 12:43 Uhr

verwendetes Datenbanksystem: Dateisystem/Textfile

Ich suche eine einfache Logging-Klasse die eine einfache Textdatei beschreibt und die Länge der Datei durch die maximale Anzahl der Zeilen verwaltet.

Ich hatte soetwas hier mal im Forum gesehen, finde es aber leider nicht wieder. Das gute an der Klasse war auch, dass neue Einträge oben hinzugefügt wurden und wenn die max. Länge auf 1000 Zeilen eingestellt war, dann wurde nach dem Erreichen der Zahl immer die letzte Zeile gelöscht.

Es muss nicht multi-thread-sicher sein. Vielleicht kann mir jemand ein Tip geben wo ich soetwas finden kann. Ich habe jetzt leider keine Zeit es selbst zu programmieren. Und etwas wie Log4Net ist für diesen Zweck zu viel.

Danke im Voraus.

12.04.2011 - 17:34 Uhr

Ich habe es mit VS2010 und den DLL's getestet und es funktioniert tatsächlich.
Mit VS2008 und FW3.5 funktioniert es bei mir mit Windows 7 nicht.

11.04.2011 - 17:37 Uhr

Hallo el_vital,

die DLLs liegen im Verzeichnis "C:\Programme\Microsoft SQL Server\100\SDK\Assemblies", d.h. einfach bei "Referenz hinzufügen" zu diesem Ordner navigieren und dann die entsprechenden DLLs auswählen.

Vielen Dank für den Hinweis. Leider funktionieren die Sachen bei Windows 7 nicht mehr. Bei Wondows 7 wird nichts gefunden.

10.04.2011 - 21:22 Uhr

Leider nein. Und ich habe eben gesehen, dass der Code unter Windows 7 auch nicht funktioniert, bzw. keine Server findet.

Mit diesem Code geht es unter 3.5 und Win XP:


Verweise hinzufügen:
Microsoft.SqlServer.Management.Sdk.Sfc
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SqlWmiManagement


using Microsoft.SqlServer.Management.Smo.Wmi;

ManagedComputer mc = new ManagedComputer();
foreach (ServerInstance si in mc.ServerInstances) MessageBox.Show(si.Name);

Unter 4.0 und WPF sind diese drei DLL's nicht mal verfügbar:


Microsoft.SqlServer.Management.Sdk.Sfc
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SqlWmiManagement

10.04.2011 - 17:36 Uhr

verwendetes Datenbanksystem: Microsoft SQL Server 2008 Express

Ich möchte in meinem C# Code einer WPF Anwendung mit Framework 4.0 alle SQL Serverinstanznamen auf dem lokalen Rechner auslesen. Alle Möglichkeiten die ich gefunden habe waren für Framework 3.5. Mit 4.0 finde ich leider nichts.

Hat jemand eine Idee wie ich es auslesen kann?

09.04.2011 - 19:13 Uhr

Super, danke !

Ich musste folgende Verweise hinzufügen :

Microsoft.SqlServer.SqlWmiManagement
Microsoft.SqlServer.Smo
Microsoft.SqlServer.Management.Sdk.Sfc

im Visual Studio 2008 mit Framework 2.0

Grüße Bernd

In VS2010 (bei einem WPF Projekt) sind diese Verweise nicht mehr verfügbar. Gibt es da andere Lösungen?

17.03.2011 - 18:25 Uhr

Ach, ich habe die zwei Parameter beim entschlüßeln vertauscht. Ich danke dir für den Hinweis!

16.03.2011 - 19:17 Uhr

Ich wollte den Algorithmus von hinrich ausprobieren.

Bei mir kommt in der Zeile decStream.FlushFinalBlock(); die Exception "Ungültige Daten"

Weiß vielleicht jemand woran es liegt?

11.01.2011 - 15:17 Uhr

Ich erstelle die Insert Anweisung jetzt dynamisch mit vereinfacht folgendem Code:



string sTeil1 = "";
string sTeil2 = "";

for (int i = 0; i < reader.FieldCount; i++)
{

   if (i > 0 && i != 3) // ID und Datum auslassen. Diese werden automatisch erzeugt
   {
      if (i > 1 )
      {
         sTeil1 = sTeil1 + ", ";
         sTeil2 = sTeil2 + ", ";
      }

      sTeil1 = sTeil1 + reader.GetName(i);

      // MaterialId ändern
      if (i == 2)
	sTeil2 = sTeil2 + iID;
      else
	sTeil2 = sTeil2 + "'" + reader[i].ToString() + "'";
   }
}

sInsertQuery = "INSERT INTO Table_Rezepte (" + sTeil1 + ") VALUES (" + sTeil2 + ")";


11.01.2011 - 14:15 Uhr

ah, ok. Mit GetName Methode.

11.01.2011 - 14:13 Uhr

Ist es für dich wirklich so schwer, sich die Member des Readers mal anzusehen?

nein ist es nicht, aber so wie es aussieht kann ich den Spaltennamen nicht auslesen. Vielleicht gibt es aber doch eine Möglichkeit die ich übersehe?

11.01.2011 - 13:53 Uhr

Mit reader_.ToString() bekomme ich den Wert. Kann ich auch irgendwie den Spaltennamen auslesen?

11.01.2011 - 13:35 Uhr

na ja, das läuft so seit einem Jahr 🙂

Ich muß jetzt nur zusehen, dass ich die Daten sauber umkopiere beim anlegen eines neuen Materials. Wie das gehen soll habe ich noch nicht verstanden.

Hat jemand einen kleinen Beispiel für mich? Oder kann ich es irgendwo nachlesen?

11.01.2011 - 13:19 Uhr

Also um auf Normalisierung einzugehen. Es ist eine Tabelle für Rezepte. Diese Rezepte gehören zu einem Material. Pro Material gibt es 9 Rezepte die Maschinenabhängig sind.

Bei jedem Material haben die Rezepte die selben Spalten mit unter Umständen unterschiedlichen Werten.

Wenn ein neues Material angelegt wird, könnten neun leere Rezepte angelegt werden. Das Konfigurieren wäre dann aber extrem mühsam. Deswegen werden beim anlegen eins neuen Materials die Rezepte von einem ähnlichen Material kopiert und nur die notwendigen Werte angepasst.

Für Maschinen und Materialien gibt es eigene Tabellen. In der Tabelle Rezepte werden in jedem Datensatz die ID's des Materials und der Maschine gespeichert.

Die Tabelle Rezepte hat so viele Spalten, weil es halt so viele Parameter sind.

11.01.2011 - 13:01 Uhr

Mit einer Parametrisierten Query ist das kein Problem... Diese kannst du dir auch durch VS erzeugen lassen.

Neben bei bemerkt solltest du unbedingt diese Tabelle Normalisieren....

Es ist normalisiert. Wie kannst du ohne die Tabelle zu kennen wiessen ob es normalisiert ist oder nicht? Die Spaltennamen habe ich für dieses Beispiel frei erfunden. Es ist aber ein anderes Thema.

Wie kann ich so eine Query automatisch von VS erzeugen lassen? Und Parametrisierte Query ist schön und gut, aber die Werte müßte ich trotz dem umkopieren!?

11.01.2011 - 12:53 Uhr

verwendetes Datenbanksystem: Microsoft SQL 2008 Express

Ich habe eine Tabelle mit über 100 Spalten/Feldern. Jetzt möchte ich mehrere bestimmte Datensätze auslesen, jeweils einen Wert ändern und in die selbe Tabelle neue Datensätze mit den neuen Daten hinzufügen.

Ich lese die Datensätze wie folgt aus:



SqlCommand cmd = new SqlCommand(string.Format("SELECT * FROM Table_Daten WHERE FarbenID = {0} ORDER BY SizeID ", iAlteFarbenID), SqlConn);

try
{
   cmd.ExecuteNonQuery();
   reader = cmd.ExecuteReader();

   while (reader.Read())
   {
      if (reader.HasRows)
      {
           int iTemp = Convert.ToInt32(reader["SizeID"]);
      }
   }
   reader.Close();
}
catch (Exception)
{
   return false;
}

Jetzt alle Spalten einzeln in eine neue Insert-Anweisung zu kopieren ist viel zu umständlich, aber ich finde leider keinen beseren Weg um das eine Feld zu ändern und die Daten automatisch rein zu schreiben.

Vielleicht weiß hier jemand wie soetwas in .NET am besten zu machen ist?

04.01.2011 - 09:17 Uhr

Hier ist mein Code:


process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.WorkingDirectory = tempPath;
process.Start();
process.WaitForExit();

string output = process.StandardOutput.ReadToEnd();

Wahrscheinlich liegt es bei dir an der fehlenden Anweisung: process.WaitForExit();

EDIT: Nein, bei mir wird auch ohne "process.WaitForExit();" alles ausgegeben.

03.01.2011 - 21:07 Uhr

Ja es funktioniert bei mir. Bekomme die vollständige Ausgabe als String.
Den Code habe ich auf der Arbeit. Stelle es morgen hier rein.

03.01.2011 - 15:35 Uhr

Ganu das brauche ich zur Zeit auch. Ich starte eine cmd-Programm aus einer C# Anwendung, führe paar Anweisungen aus und benötige die von dem Programm erstellte Ausgabe.

Noch habe ich keine Möglichkeit gefunden diese Ausgabe bei dem C#-Programm einzulesen.

EDIT: ok, habs gefunden:

string output = process.StandardOutput.ReadToEnd();

EDIT: ach, es steht ja bereits oben in dem ersten Beitrag. 😄

28.12.2010 - 18:20 Uhr

Das MediaElement in WPF hat keine AudioStreamIndex Eigenschaft.

28.12.2010 - 17:56 Uhr

Wenn entsprechende Codecs auf dem rechner installiert sind, wird alles abgespielt, auch DiVX.

Wie kann ich einem MediaElement nur den Ton eines Videos zuweisen und auch nur von der richtigen Tonspur?

28.12.2010 - 16:32 Uhr

Ist es möglich bei dem MediaElement die Tonspur einer Videodatei anzugeben, die abgespielt werden soll?

02.11.2010 - 17:49 Uhr

Funktioniert bestens, danke. Das Fenster wird jetzt erst garnicht angezeigt.

02.11.2010 - 00:33 Uhr

Wenn in meiner Anwendung auf einem virtuellen Drucker (PDF) gedruckt wird und in dem Dialog wo der Speicherort angegeben werden soll, auf Abbrechen geklickt wird, dann wird eine Exception geworfen mit der Message: "Der Vorgang wurde erfolgreich beendet".

So weit wäre alles gut und sauber, aber es bleibt das "Drucken" Fenster auf.
Ich finde leider keinen Weg um das Fenster zu schließen, da es ja nicht von mir explizit erstellt wird, sondern von dem Aufruf von printDocument.Print();

Weiß jemand vielleicht wie ich es schließen kann?

24.10.2010 - 10:31 Uhr

Hallo,

hast du das tatsächliche Intervall ermittelt?

Schau mal
>
an. Dort ist beschrieben eine per Frame-Animation durchgeführt wird. Ich denke auch das ist besser als der Timer und immer noch "altmodisch" genug 😉

mfG Gü

wenn man sich dieses Beispiel anschaut, dann sieht man auch da, das das Bild ab und zu Flackert.

24.10.2010 - 10:29 Uhr

Ich habe es jetzt mit Storyboard probiert. Das Bild flimmert genau so. Ich werde jetzt direkt anfangen für das iPhone mit XCode zu programmieren. Ich wollte das Spiel erst in c# in Silverlight programmieren und dann in XCode übertragen, da c# für mich einfacher ist, aber eine flüssige Bewegung in Silverlight zu erzeugen scheint nicht möglich zu sein. Zu mindestens ich bekomme es nicht hin.

21.10.2010 - 18:08 Uhr

Sobald ich Zeit habe setze ich mir wieder damit auseinander und teste die Alternativen. Sobald ich eine Lösung habe poste ich es hier.

19.10.2010 - 22:14 Uhr

Ich habe jetzt den Timer von System.Threading verwendet und die Zeiten gemessen. Es geht nie über 30ms meistens ca. 15ms und trotz dem flimmert das Bild.

19.10.2010 - 08:58 Uhr

Bei 15ms wären es 66 fps. Das ist mehr als ausreichend um eine flüßige Bewegung zu haben. 40ms wären sogar genug. Das Flimmern muss andere Ursachen haben.

18.10.2010 - 23:33 Uhr

Interval ist 1ms. Ich habe auch größere Zeiten ausprobiert.

Es soll keine Animation sein sondern ein kleines Spiel. Ich weiß nicht ob StoryBoard dafür geeignet ist. Ich würde es gerne auf die altmodische Art programmieren.

18.10.2010 - 23:23 Uhr

Ich habe mal versucht ein Image in Silverlight zu bewegen. Dabei flimmert das Bild.
Gibt es soetwas wie double buffering bei Silverlight?

Ein Beispiel ist im Anhang. Mit den Pfeiltasten nach Rechts/Links bewegen.

Bewegt wird es mit folgendem Code in einem Timer. Hier für links:

   if(bLeft)
            {
                double dLeft = Canvas.GetLeft(imagePlatform);
                if (dLeft > (imagePlatform.ActualWidth - canvasDesktop.ActualWidth - 5) * -1)
                    Canvas.SetLeft(imagePlatform, dLeft - 5);
            }