Laden...

Forenbeiträge von Viper2000 Ingesamt 63 Beiträge

01.10.2020 - 13:43 Uhr

Das wäre eine Idee. Das könnte ich mal testen.

30.09.2020 - 15:48 Uhr

Hallo Forum,

ich habe eine anwendung bei der ich ein Zeigermessinstrument darstelle. Der Zeiger ist ein gefülltes Polygon dem ich im XAML einen "DropShadowEffect" mitgegeben habe. Die Bewegung des Zeigers animiere ich über eine DoubleAnimation mit der ich die Rotation des Zeiger-Polygons beeinflusse. Das klappt alles auch gut. Allerdings wandert logischerweise der DropShadow auch immer mit dem Zeiger mit. Da das nicht ganz natürlich ist (Die Lichtquelle ist ja in der realität fix) müsste auch der Winkel des Dropshadow während der animation angepasst werden. Hat jemand eine Idee wie man das bewerkstelligen könnte?

Viele Grüße

16.09.2020 - 11:40 Uhr

Vielen Dank für die Hilfe!
Ich habe alles wie vorgeschlagen auf einem Canvas absolut gezeichnet und eine ViewBox drumherum gesetzt. Damit ist das Problem gelöst. 😃

14.09.2020 - 16:59 Uhr

Wie meinst du das mit sin/cos?
Über eine Transformationsmatrix?

14.09.2020 - 12:09 Uhr

Hallo Liebes Forum,

ich habe noch ein Problem mit WPF. Ich möchte eine runde Skala mit 100 Teilstrichen zeichnen. Ich dachte mir in einer Schleife den ersten Teilstrich in die Mitte zu zeichnen, dann das ganze umgebende Element (Grid) um den Mittelpunkt um 3,6 Grad zu drehen und den nächsten Teilstrich an die selbe Stelle wie den ersten strich zu zeichnen und das in einer Schleife 100 mal. Leider wandert aber das Koordinatensystem mit wenn ich eine RotateTransform auf das äußere Grid anwende. Der ehemalige Punkt 0,0 ist also nach einer 90 Grad Drehung im Uhrzeigersinn nicht mehr oben Links sondern oben Rechts.
Ich würde aber gerne nach dem Rotieren das Koordinatensystem beibehalten. Gibt es dafür eine Möglichkeit?

Viele Grüße

11.09.2020 - 15:09 Uhr

Danke schonmal für die Antwort! Ich habe nun ein Grid anstatt einen Canvas genommen und die Hintergrund Ellipse in meinem Style passt sich auch der Größe des umgebenden Elements an wenn ich das CustomControl in einem Testprojekt in z.B. einem Stackpanel einbinde.
Mir ist aber noch nicht ganz klar wie ich weiter Elemente im Style meines Custom Controls zeichnen kann die später auch auf die größe des umgebenden Containers Skaliert werden. Wenn man sich das Thermometer vorstellt soll auch der Zeiger und die Skala usw. proportional zur größe des umgebenden Containers skaliert werden. Zum besseren Verständnis hier mien XAML. Die zweite Ellipse mit dem Namen "PART_Middle" soll auch nicht mit einer festen Height und Width gezeichnet werden sondern erstmal unabhängig. Und da stehe ich auf dem Schlauch:


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:VintageHandMeterView">
    <Style TargetType="local:VintageHandMeterView">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:VintageHandMeterView">
                    <Grid x:Name="outerGrid">
                        <!--<Ellipse x:Name="PART_Background" Stroke="#4f333633" StrokeThickness="1" Width="{Binding Path=Width, ElementName=outerGrid}" Height="{Binding Path=Height, ElementName=outerGrid}">-->
                        <Ellipse x:Name="PART_Background" Stroke="#4f333633" StrokeThickness="1">
                            <Ellipse.Effect>
                                <DropShadowEffect ShadowDepth="2.0"/>
                            </Ellipse.Effect>
                            <Ellipse.Fill>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                                    <LinearGradientBrush.GradientStops>
                                        <GradientStop Color="#F0F5F0" Offset="0.0"/>
                                        <GradientStop Color="#303130" Offset="1.0"/>
                                    </LinearGradientBrush.GradientStops>
                                </LinearGradientBrush>
                            </Ellipse.Fill>
                        </Ellipse>
                        <Ellipse x:Name="PART_Middle" Stroke="Black" StrokeThickness="1" Fill="Black" Width="10" Height="10">

                        </Ellipse>
                        <!--<Grid.RenderTransform>
                            <ScaleTransform ScaleX="0.5" ScaleY="0.5" CenterX="{Binding Path=Width, ElementName=outerGrid, Mode=OneWay}" CenterY="125"/>
                        </Grid.RenderTransform>-->
                    
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

11.09.2020 - 13:38 Uhr

Hallo,

ich bin gerade ein WPF Custom Control am Entwickeln. Es wird ein analoges Thermometer. Also ein Control, dem man eine Temperatur geben kann und der Zeiger wandert dann an die Position.

Jetzt ist es so, dass ich in meiner Generic.xaml einen Style definiert habe der die Elemente des Controls beinhaltet (Ellipse mit Gradient als Hintergrund, Zeiger als Path usw.).

Da das Control später beliebig in andere Proejkte eingebunden werden soll, stelle ich mir die Frage wie ich die Elemente im Control skalenunabhängig zeichnen kann. Ich würde also gerne das Koordinatensystem des Controls auf 0 bis 1 skalieren und darin alles unabhängig von der späteren tatsächlichen Größe zeichnen. Wenn jemand später dieses Control einbindet, soll in der XAML über Width und Height der User die Größe des Controls Festlegen können.

Sowas ähnliches hatte ich in Android schonmal gemacht. Da gibt es folgende Lösung:


float scale = (float) getWidth();		
canvas.save(Canvas.MATRIX_SAVE_FLAG);
canvas.scale(scale, scale);

Hat jemand einen Denkanstoß wie ich das bewerkstelligen kann?

17.03.2011 - 20:58 Uhr

Hi Leute,

ich habe mich nach etwas Recherche entschieden ein bestehendes Programm zu modifizieren 😃

Das Tool von Qube Solution ist mit QT geschrieben und ist Open Source. Sollte einiges an Arbeit ersparen 😃

Viele Grüße

28.02.2011 - 18:14 Uhr

Hi herbivore,

ja das wäre sicherlich kein Problem. Allerdings soll der würfel auch mit der Maus dreidimensional gedreht und gezoomt werden können...

MfG

27.02.2011 - 23:05 Uhr

WPF kann 3D?! Hast du dafür vielleicht Einstiegspunkte wie Tutorials oder ähnliches?

Gruß

27.02.2011 - 21:34 Uhr

Hallo,

ich habe einen LED Cube gebaut. Wer nicht weiß was das ist kann sich dieses Video hier anschauen: Klick.

Ich würde gerne eine PC-Software schreiben die die Leuchtpunkte so eines 8x8x8 LED Würfels am PC abbildet. In etwa sowas hier: Klick. Mit der Software soll man dann diese Leuchtpunkte anklicken können. Wenn man die geünschten Punkte markiert hat, wird das 8x8x8 Array binär gespeichert (Also ein Frame für die Animation des LED Würfels).

Könnt ihr mir Tips geben welches Framework dafür gut geeignet wäre. Habe reichlich erfahrung mit Windows Forms. Allerdings bin ich im Bereich 3D Programmierung noch Neuling.

Ich denke bei dem Thema in Richtung OpenGL...

Viele Grüße
viper2000

11.01.2011 - 16:04 Uhr

Ich habe mir nun folgendes zusammengefrickelt. Es funktioniert damit tatsächlich. Da ich einen EventHandler Invoke konnte ich nicht den Lösungsweg mit dem "MethodInvoker" nehmen wie im FAQ beschrieben. Ist meine Lösung ok oder gibt es da einfacherer/elegantere Arten sowas zu beheben? Ich hab wirklich nur solange rumprobiert bis es funktioniert hat...wie es genau funktioniert habe ich noch nicht begriffen


private delegate void wrapperApi_Log_Delegate(object sender, iMonLogEventArgs e);
    
private void wrapperApi_Log(object sender, iMonLogEventArgs e)
{
      wrapperApi_Log_Delegate dele = wrapperApi_Log;

      if (this.InvokeRequired)
      {
          object[] args = {sender,e};
          this.BeginInvoke(dele, args);
          return;
      }

      listBoxLog.Items.Add(e.message);  
}

11.01.2011 - 15:08 Uhr

Hallo,

ich nutze die API eines Displayherstellers um ein USB-LCD Display anzusprechen. Im GUI-Thread (in meiner Form) erzeuge ich ein Objekt der Diplayklasse und registriere einen EventHandler. Der Eventhandler wird aufgerufen wenn die API eine Logmeldung auszugeben hat. Diese Logmeldung schreibe ich dann im EventHandler in eine ListBox auf meiner Form. Das funktioniert auch alles super solange ich die ganze Logik des Displays im GUI-Thread erledige. Da dies aber aus diversen Gründen nicht geht habe ich die ganze Funktionalität in einen separaten Thread ausgelagert.

Das Objekt der Diplayklasse übergebe ich in meiner Form an den Konstruktor einer von BackgroundWorker abgeleiteten Klasse die die ganze Arbeit mit dem Display in einem seperaten Thread erledigt.

Sobald nun der Log-Eventhandler aufgerufen wird (der ja im GUI Thread registriert ist) kommt es zum "ungültigen Threadübergreifenden Vorgang". Das aber nicht immer! Nur in dem Falle wenn im BackgroundWorker ein anderes Event der API ausgelöst wird (ScrollFinished Event - Wenn das Display einen kompletten Text-Scrolldurchgang erledigt hat). Ich erkenne keinen direkten Zusammenhang warum dieses Event etwas direkt mit dem Log zu tun haben sollte (denn alle anderen Logmeldungen die nicht durch das ScrollFinished Event im BackgroundWorker ausgelöst werden kommen ja durch).
Dafür habe ich noch keine geeignete Lösung gefunden. Der Sachverhalt ist nicht ganz einfach, ich hoffe ich konnte es halbwegs verständlich rüberbringen. Hier ein paar Code-Snippets:

GUI Klasse:


private iMonWrapperApi imon; //Das ist die API
private DisplayHandler displayHandler; //Das ist die von BackgroundWorker abgeleitete Klasse die die Logik enthält
this.imon = new iMonWrapperApi();
this.imon.Log += wrapperApi_Log; //Registrierung des Eventhandlers im GUI Thread
this.imon.StateChanged += wrapperApi_StateChanged;  //Wenn z.b. ein Diplay vom USB angeschlossen oder abgezogen wird wird dieses Ereignis aufgerufen
this.displayHandler = new DisplayHandler(this.imon); //Übergabe des API Objekts an den BackgroundWorker
this.displayHandler.RunWorkerAsync(); //Starte den Backgroundworker

private void wrapperApi_Log(object sender, iMonLogEventArgs e)
{            
    listBoxLog.Items.Add(e.message);
}

BackGroundWorker Klasse:


class DisplayHandler : BackgroundWorker
{
      public DisplayHandler(iMonWrapperApi imon)
      {
           .....
           this.imon.StateChanged += stateChanged;
      }
      protected override void OnDoWork(DoWorkEventArgs e)
      {
           //Hier wird die Arbeit verrichtet
      }

      private void stateChanged(object sender, iMonStateChangedEventArgs e)
      {
             //Falls ein LCD Display angeschlossen wurde unterstützt es die Scrollfunktion und der passende EventHandler muss registriert werden. Bei anderen Displaytypen wird dieser Eventhandler wieder getrennt!
            if (diplayType == iMonDisplayType.LCD)
                 this.imon.LCD.ScrollFinished += lcdScrollFinished;
            else
                 this.imon.LCD.ScrollFinished -= lcdScrollFinished;
      }
      private void lcdScrollFinished(object sender, EventArgs e)
       {
            Thread.Sleep(1000);   //Warte eine Sekunde
            
             this.update(); //Beginne Text von Vorne aufs LCD zu schreiben
            
      }
}

Ich hoffe Ihr habt ein paar Tips für mich.
Viele Grüße Viper

09.09.2010 - 14:55 Uhr

Einwandfrei! Danke.
Hier auch nochmal der genaue code falls es jemanden interessiert:


string value = "&HAFAF"; //Debug only
string temp1 = value.Remove(0, 2); //Remove the leading "&H" from string
short temp2 = Convert.ToInt16(temp1, 16); //Convert the 16-bit hex-value to short
string temp3 = Convert.ToString(temp2, 2); //Convert the short value to binary string
string result = temp3.PadLeft(16, '0'); //Fill with zeros

09.09.2010 - 13:33 Uhr

Hallo Forum,

ich habe ein Gerät das mir über die RS232 Schnittstelle fortlaufend einen String mit einem 16-bit Hex-Wert sendet. Der String hat das Format: "&HFFFF". Also zuerst immer &H mit anschließender Information. Aus diesem String würde ich gerne einen anderen String erzeugen der die Informationen Binär Codiert enthält. Das Resultat aus obigem Beispiel würde also dann: "1111111111111111" sein. Ich habe also aus dem Stirng die ersten zwei Zeichen entfernt um den reinen Wert zu bekommen. Nun hapert es also daran den String "FFFF" in "1111111111111111" umzuwnadlen...

Vielleicht habt ihr eine Idee? 🤔

Viele Grüße!

04.08.2010 - 17:02 Uhr

Hallo Forum,

ich habe eine Klasse "ProgramParser". Die Klasse hat eine statische Klassenvariable "ArrayList program". Diese ArrayList wird in einer ebenfalls statischen Methode der Klasse instanziert und gefüllt. In einer anderen statischen Methode wird wieder auf diese Instanz der ArrayList zugegriffen. Meine Frage wäre nun wie man das aus SW-Architekten Sicht eleganter lösen kann. Oder ist das OK so?

Mein anderer Gedanke war die komplette Klasse von "außen" zu instanzieren und im Konstruktor dann die ArrayList zu instanzieren. Diese würde ja dann solange leben wie das Objekt der Klasse lebt. Aber auf die unten programmierte Art müsste ja die ArrayList bis zum Ende des Programms leben oder? Die Daten darin sind jedenfalls wichtig und sie müssen während der Laufzeit des Programms ständig verfügbar sein.

Hier der stark gekürzte Code:

Viele Grüße
Viper


class ProgramParser
    {
        public static string lastError;
        //TODO: Ist das so okay???
        static ArrayList program;

        public ProgramParser()
        {
        }

        
        public static bool StartConvertingFromQBasicToDeviceIndependent(string filename)
        {
            program = new ArrayList();

            try
            {
                 ...tue viele Dinge...
                    program.Add(line);
                    
                }

            }
            catch (Exception ex)
            {
                lastError = ex.Message;
                return false;
            }
        }

        public static bool saveProgramToFile(string filename)
        {
            try
            {                                                       
                  ...tue vieles...
                foreach (string line in program)
                {
                    sw.WriteLine(line);
                }

                sw.Close();                
                return true;
            }                                                            
            catch (Exception ex)
            {
                lastError = ex.Message;
                return false;
            }
        }
    }

27.10.2009 - 09:56 Uhr

danke! 😃

26.10.2009 - 19:47 Uhr

Hallo Forum,

ich würde gerne den Namen und die Taktfrequenz des/der eingebauten Prozessors/en ermitteln.
Ist das aus .NET heraus möglich?

Viele Grüße

24.10.2009 - 11:50 Uhr

Hi herbivore,

ja die Dateien werden anscheinend nicht mit dem Setup des Visual Studio 2008 Express mit auf den Zielrechner kopiert. Wie gesagt, in der Debug Session bekomme ich keinen FileNotFoundException. Beid er Debug Session liegen die Files dann auch wirklich im Ordner /bin/Debug/CUDAKernel. Aber wenn ichd as Projekt veröffentliche landen diese nicht im Setup Projekt...

23.10.2009 - 19:01 Uhr

Das bringt auch nichts...die Binärdateien habe ich im VS2008 im Ordner CUDAKErnel organisiert. Wie muss ich diese bereitstellen (als Resource, eingebettete Ressource,...???) damit sie mit dem SETUP-Projekt mitkopiert werden und ich auf diese an definierter Stelle aus dem Code heraus zugreifen kann.

23.10.2009 - 14:27 Uhr

Hallo,

ich lade in meinem C# Projekt Binärdateien die im Unterordner "CUDAKernel" liegen.
Diese Binärdateien habe ich markiert als "Ins Ausgabeverzeichnis immer kopieren".

Folgenden Code verwende ich zum Laden:

cuda.LoadModule(Path.Combine(Environment.CurrentDirectory, @"CUDAKernel\vecAdd_kernel.cubin"));

Wenn ich nun das Projekt aus VS Express 2008 heraus starte funktioniert alles wunderbar, wenn ich es jedoch mit dem Veröffentlichungsassistenten veröffentliche und anschließend installiere dann wirft obengenannter Code eine "FileNotFound" Exception.

Ich habe jetzt schon einiges herumprobiert aber war noch nicht erfolgreich. Ich muss diese Binärdateien auch nach dem Veröffentlichen laden können.

Kann mir jemand vielleicht bitte helfen!?

Gruß

22.10.2009 - 15:14 Uhr

Danke für die Hilfe!

Ich hab ZedGraph genommen und ein Standard-Beispiel auf meine Bedürfnisse angepasst! Ist eine feine Sache.

Viele Grüße

22.10.2009 - 13:27 Uhr

Hallo,

möchte gerne in meiner Windows Form Zeiten durch ein Balkendiagramm darstellen.

Ich führe Berechnungen auf CUDA Grafikkarten und die gleichen Berechnungen auf der CPU durch. Die vergangenen Zeiten messe ich dann und will diese gerne skaliert als Balkendiagramm darstellne.

Ich benötige also 2 Balken:

  1. Zeit für CUDA Berechnung
  2. Zeit für CPU Berechnung

Ein Beispiel:

Matrizenmultiplipkation 1024x1024 Matrix:
CUDA: 212,46363 ms
CPU: 668,2464 ms

Die x-Dimension soll dann auf eine Sinnvolle Größe skaliert werden. Nach obigem Beispiel wären das dann 700 ms.

Gibt es für solch ein Vorhaben ein Control oder sonstwas fertiges? Die Zeit bis zu meinem Projektabschluss drängt 🙂

Viele Grüße

19.10.2009 - 18:16 Uhr

Hallo,

ich beschäftige mich gerade mit CUDA.NET und habe diverse Matrix-Berechnungen auf die GPUs von NVidia ausgelagert.

Zum Vergleich der eingesparten Zeit möchte ich gerne die Zeiten der Matrizenberechnungen auf der normalen CPU unter .NET messen. Die Berechnungsfunktionen liefern auf der GPU und CPU das gleiche Ergebnis. Allerdings erwarte ich auf der GPU bei großen Matrizen eine deutlich geringere Ausführungszeit.

Eine Stopwatch ist für meine Bedürfnisse nicht hochauflösend genug. Manche Berechnungen dauern deutlich unter 1ms.

Was empfehlt ihr mir?

Viele Grüße

08.09.2009 - 03:41 Uhr

Hallo,

in VB.NET gibt es das Shared Schlüsselwort mit dem man Klassen- oder Strukturmember freigeben kann und dann nur an eine Stelle auf den Speicher zugeriffen wird.

Wie ist die Entsprechung dazu in C# ?

Gruß,
viper

27.07.2009 - 10:56 Uhr

Sandcastle ist ja relativ kryptisch zu nutzen um einfach mal schnell eine HTML Doku zu erzeugen. Gibt es wirklich kein "One-Click-Tool" für diese Aufgabe? Falls nein werde ich mich wohl mal in Sandcastle einarbeiten müssen.

Viele Grüße

21.07.2009 - 20:46 Uhr

Hallo,

habs jetzt so gemacht: also ich hab das Objekt jetzt nur einmalig in meiner Basisklasse erzeugt und fülle dieses Objekt jeweils in den abgeleiteten Klassen und stopfe es in den ReportProgress. Funktioniert wunderbar 😃

Thx

20.07.2009 - 15:26 Uhr

Hallo,

ich nutze in meinem Projekt einen BackgroundWorker und würde gerne im ReportProgress neben dem Progress in % auch noch einen String und eine boolsche Variable im Userstate mitgeben. Dazu habe ich mir folgende Klasse angelegt:

namespace XYZProjekt
{
    class UserStateObject
    {
        public string message;
        public bool success;
    }
}

im ProgressChanged Eventhandler des Backgroundworkers mache ich dann prinzipiell folgendes:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;            
            UserStateObject uso = (UserStateObject)e.UserState;
            this.textBox1.Text = uso.message;
            this.checkBox1.Checked = uso.success;
        }

jetzt muss ich aber immer bei jedem GUI Zugriff des Backgroundworkers(und das sind sehr viele) eine Instanz von der Klasse UserStateObject erzeugen und diese dann füllen und übergeben.

Geht das nicht irgendwie einfacher? Also ohne jedesmal eine neue Instanz von UserStateObject zu erzeugen?

Viele Grüße

14.07.2009 - 13:42 Uhr

Hat keiner dazu eine Idee?

09.07.2009 - 15:09 Uhr

Okay, danke!

09.07.2009 - 13:50 Uhr

Hallo,

habe ein Problem mit einem Backgroundworker. Nutze eine DLL die ein Gerät ansteuert. Die ausführung des Codes geschieht in einem Backgroundworker. Klappt alles wunderbar. Ab und zu kann es aber vorkommen, dass die DLL Funktion nicht mehr zurückkehrt. In diesem Fall würde ich gerne den Backgroundworker hart beenden.

Ist so etwas möglich?

Gruß

09.07.2009 - 10:57 Uhr

Hallo Forum,

ich nutze in meinem Projekt eine XSL Transformation. Funktioniert soweit auch wunderbar. Das zur Transformation benötigte XSLT Stylesheet würde ich gerne so ins Projekt integrieren das es bei Weitergabe des fertigen Setups an einer definierter Stelle liegt und ohne absoluten Pfad angesprochen werden kann.

Momentan muss man das XSLT Stylesheet mit einem Filebrowser aussuchen und ich muss es immer zusätzlich zum Setup meines Projekts mit weitergeben.

Irgendwie muss das doch integrierbar sein.

Über Hilfe wäre ich dankbar!

Viele Grüße.

30.06.2009 - 13:24 Uhr

Also mit List<Test> wars kein Problem 😃
Danke!

29.06.2009 - 11:54 Uhr

Okay,

danke schonmal für die Antworten. Heute Nachmittag werde ich genug Zeit haben um es zu testen =)

29.06.2009 - 11:32 Uhr

Klar weiß ich dass es Schleifen gibt 🙂 Aber es kam mir halt zu einfach vor das so zu lösen. Ich werde mich mal in Queue und List etwas einlesen.

Beim Array müsste ich ja vorher schon wissen wieviele Tests gemacht werden, da es sich nicht dynamisch vergrößert.
Vielleicht bietet ja Queue<> oder List<> diese Funktion 🤔

Viele Grüße

29.06.2009 - 11:15 Uhr

Hallo,

die Entwicklung meiner Forms-Anwendung geht langsam in die Endphase.

Ich habe aber noch ein Problem: Meine Anwendung führt Tests auf externer Hardware aus. Für jeden dieser Test habe ich eine Klasse erstellt die von der Basisklasse "Test" abgeleitet ist. Jede Klasse enthält die Methode Start() die den Test startet.

Wenn nun der User in den Optionen mehrere Tests zum Ausführen per Checkbox anhakt sollen diese natürlich nacheinander ausgeführt werden. Bisher stoße ich die einzelnen Tests per separatem Button an.

Wie kann ich nun automatisiert diese Tests nacheinander anstoßen? Hatte überlegt eine Art Array der Basisklasse Test zu machen und die einzelnen Objekte der Test-Subklassen darein zu stopfen. Nachdem dann die Start() Methode des ersten Tests zurückkehrt müsste der zweite Test beginnen usw.
Aber macht man das so und ist dies möglich? Könnte mir vorstellen, dass ein solches Problem öfters in derPraxis auftaucht und dass es spezielle Techniken dafür gibt.

Viele Grüße
Viper

17.06.2009 - 11:44 Uhr

mhm so wie ich das sehe funktioniert der ErrorProvider nur mit einer einzeiligen TextBox...ich habe halt so eine Art "Loggerfenster" wo alle Meldungen dann untereinander mit dem Icon vornedran angezeigt werden sollen.

Wenn eine neue Meldung eintrifft wird diese an die mehrzeilige Textbox Appendet und die alten Meldungen "rutschen hoch" und sind später mit der Scrollbar noch durchsehbar.

Hoffe ihr versteht was ich meine...

17.06.2009 - 11:34 Uhr

Danke für den Tipp mit dem ErrorProvider. Werde mich mal einlesen und schauen ob das für mich brauchbar ist.
Melde mich ggfs. nochmal 😃

17.06.2009 - 11:24 Uhr

Hallo Forum,

ich habe schon gesucht aber nichts zu diesem Thema gefunden.
Ich schreibe gerade ein Tool das Erfolgs/Misserfolgsmeldungen in einer Textbox ausgibt. Dazu muss ich laut Spezifikation bei Erfolg ein kleines grünes Icon(Häkchen) vor der Zeile einblenden und bei Misserfolg ein kleiner rotes Icon(Kreuz).

Ist dies möglich bzw. anders komfortabler lösbar?

Viele Grüße!

15.05.2009 - 15:02 Uhr

hat noch jemand ne Idee?

14.05.2009 - 11:56 Uhr

Ok, zuerst die Basisklasse mit einer Beispielmethode (Den Namen der DLL habe ich mal auf XYZDll geändert und die Klasseninstanz ist: "Automation".


abstract class Test
    {
        protected XYZDll Automation;
        protected bool connected;
        protected Config config;

        public Test()
        {
            Automation = new XYZDll();
            connected = false;
        }

        public abstract void Start();

        protected void Connect()
        {
             Automation.Connect(true);
        }
    }

Dann eine ageleitete Klasse:


class RomTest : Test
    {        
        public RomTest(Config iConfig)
        {
            this.config = iConfig;            
        }

        public override void Start()
        {            
            Automation.PerformRomTest();
        }

Wenn ich un eine Instanz der Klasse RomTest erstelle und die Methode Start() anstoßen will dann crasht das Progamm.

14.05.2009 - 10:41 Uhr

Guten Morgen...

ich muss nochmal eine Frage stellen:

Habe eine Basisklasse und mehrere davon abgeleitete Subklassen.
Alle Klassen dienen der Kommunikation mit einem USB Gerät über eine DLL die als Referenz eingebunden ist.

In der Basisklasse habe ich eine Variable dieser DLL erstellt und die Kommunikations-Methoden implementiert die von allen Subklassen mehrfach benötigt werden. Wenn ich nun allerdings aus einer Subklasse auf eine geerbte Methode der Basisklasse zugreifen will, bekomme ich folgenden Fehler:

Message "Die Quellklasse des verknüpften Objekts hat sich geändert. (Ausnahme von HRESULT: 0x80040008 (OLE_E_CLASSDIFF))" string

Ich verstehe nur nicht ganz warum? Die Variable der DLL müsste doch auch an die Subklassen vererbt werden. Aber bei jedem Zugriff auf eine dieser Funktionen schmier es mit obiger Fehlermeldung ab...

Hoffe einer kann helfen.

Gruß,
Viper

13.05.2009 - 15:57 Uhr

Ok aber wo wäre der richtige Ort um den Backgroundworker zu starten? Im Mainform oder im Objekt meiner abgeleiteten Klasse oder in dem zusätzlichen Form das ich für die Fortschrittsanzeige nutzen will...

Und wie bekomme ich die Textstrings die ich in meiner Klasse dann von dem USB Gerät "zurückbekomme" in den Eventhandler rein um diese in die Form zu bringen?

13.05.2009 - 15:48 Uhr

Hallo Forum,

weiß nicht wie ich diese Frage sonst formulieren soll. 😃
Ich schreibe eine Applikation bei der über eine externe DLL ein Gerät angesteuert wird was dann diverse Tests ausführt und die Ergebnisse zurückmeldet.

Das funktioniert jetzt auch alles schon sehr gut. Allerdings alles im GUI Thread.

Ich habe mir eine Basisklasse "Tests" erstellt, die alle "gemeinsamen" Felder und Methoden enthält. diese Klasse enthält eine abstrakte Methode "Start()".

Für jeden denkbaren Test habe ich je eine Klasse erstellt die dann von der Basisklasse "Tests" abgeleitet ist. Diese abgeleiteten Klassen überschreiben jeweils die abstarkte Methode "Start()" der Basisklasse mit "override". Diese override Methode stößt die reale Testausführung an.

Ich würde nun gerne in meinem Hauptform Objekte dieser speziellen Tests instanzieren und Nacheinander im Hintergrund abarbeiten lassen. Dazu soll der Fortschritt in einem Fenster was beim Starten der Tests aufpoppt dargestellt werden. Zum einen als Progressbar und zum anderen als "Loggerbereich"(TextBox) wo Textmeldungen über den Fortschritt ausgegeben werden. Ich muss also aus meiner Instanz des Tests auf dieses Form irgendiwe zugruiff erhalten um die Progressbar und die TextBox zu aktualisieren.

Wie kann ich das sauber in eine .NET Technologie wie "Backgroundworker" oder halt in Threads auslagern?

Also nochmal zusammenfassend:

  1. Haupform erzeugt Objekte der speziellen Tests, jedes Objekt enthält die Methode Start() die den eigentlichen Test startet (über DLL auf einem USB Gerät).

  2. Nach Aufruf der Start() Methode soll die ganze Geschichte im "Hintergrund" ablaufen ohne das Mainform zu blockieren.

  3. Während des Ablaufes soll in einem zusätzlichen Form der Fortschritt über eine TextBox und eine Progressbar ersichtlich sein.

Über Hilfe dazu wäre ich sehr dankbar.

Viele Grüße

30.04.2009 - 09:22 Uhr

Ich habe es nun verstanden und habe etwas wichtiges hinzugelernt... Danke euch für die Hilfe! 🙂

28.04.2009 - 11:26 Uhr

okayyyyyy, aber diese Aussage spricht doch genau gegen den von Herivore verlinkten Artikel. Dort wird auch eine Klasse erzeugt und per ref übergeben. Bei der übergabe ohne ref passiert ja dann genau das was ich nciht so unbedingt möchte 🤔

28.04.2009 - 11:05 Uhr

Guter Artikel!

Jetzt bin ich aber leicht verwirrt weil gerade in meinem Fall müsste ich doch dann die Referenz übergeben damit das Objekt in der Hauptform ebenfalls beeinflusst wird wenn ich in meinem Settings Form Einstellungen ändere.

Wenn ich das Objekt ohne ref an den Konstruktor des Settings Forms übergebe dann spiele ich doch nur auf dem kopieren Objekt und mein Config Objekt in der Hauptform bleibt auf den alten Werten stehen...

28.04.2009 - 10:47 Uhr

Hallo Forum,

ich habe mal eine Frage. Ich denke die Frage bewegt sich richtung Objektorientierung.

Ich habe eine Windows Form Applikation und mir dazu eine eigene recht umfangreiche Klasse zur Anwendungskonfiguration geschrieben. Die Klasse verwaltet Einstellungen die ich in meiner Form für andere Aufgaben brauche.

Ich erzeuge in meinem Form eine Instanz der Config-Klasse und kann dann über die Methoden dieser Klasse die Einstellungen beeinflussen und in einer Konfigurationsdatei schreiben und auch wieder einlesen. Soweit so gut.

Jetzt möchte ich allerdings die Einstellungen nicht direkt in meinem Hauptform befüllen sondern in einem seperaten Formular eine TreeView bauen wo ich die Einstellungen bearbeiten kann.

Ich möchte also das Objekt in einem seperaten Form lesen und schreiben und in meinem Hauptform nur lesend auf die Einstellungen zugreifen um den Programmablauf entsprechend zu beeinflussen.

Wie macht man das? Tut man dem neuen Form das Objekt mit dem Schlüsselwort ref übergeben? Oder wie ist die allgemeine Vorgehensweise für ein solches Problem?

Viele Grüße
viper

16.04.2009 - 15:44 Uhr

Hallo Forum,

ich nutze ein Gerät zu dem der Hersteller eine DLL mitliefert. Diese DLL ist als Verweis in Visual C# Express 2008 eingebunden.

Ich kann auch alles schön ansteuern. Wenn ich allerdings eine Methode anstoße und diese nicht erfolgreich ist dann wird ein HRESULT zurückgegeben. Dieses HRESULT würde ich gerne auswerten. Momentan habe ich ein try-catch um die Methode gebaut. Diese landet im Fehlerfall auch im Catch-Block. Dort gelingt es mir allerdings nicht auf das HRESULT zuzugreifen.

Der Debugger meldet im Fehlerfall folgendes im Statusfenster:

System.Runtime.InteropServices.COMException (0x80004005): Beim Aufruf einer COM-Komponente wurde ein HRESULT E_FAIL-Fehler zurückgegeben.
bei XXXXXXXXXXXXXXXXXXX
bei XXXXXXXXXXXX.ResetAndRun() in D:\XXX\XXXXX\Visual Studio 2008\Projects\XXXXXXXXXXXXX\XXXXXX\XXX.cs:Zeile 39.
Eine Ausnahme (erste Chance) des Typs "System.Runtime.InteropServices.COMException" ist in XXXXX.exe aufgetreten. 🤔

16.04.2009 - 15:37 Uhr

Die Lösung war ganz einfach, fast schon peinlich 😄:

object buffer = new byte[Size];
byte[] buffer2 = new byte[Size];

//buffer füllen

buffer2 = (byte[])buffer;  //stinknormaler Cast

🙂