Laden...

Forenbeiträge von robmir Ingesamt 155 Beiträge

16.07.2008 - 08:42 Uhr

Hallo *,

ich möchte in einer anderen Sprache Hashtable implementieren, da ich C# besser kenne habe ich zuerst versucht die Hashtable in C# zu implementieren.
Im Internet habe ich Hashfunktionen gefunden und angewendet. Ich versuche einfach in einer Schleife 100000 hashcodes zu erzeugen. Problem ist, dass nach 20 Durchläufen wiederholt sich das hashcode. Dann habe ich andere Funktionen versucht aber immer das gleiche Problem.
Was mache ich falsch??

Wenn ich das gleiche mit

i.ToString().GetHashCode

versuche, also C# Implementierung, dann bekomme ich immer eindeutige hashcodes.

Unten habe ich aufgelistet wie ich das mache:

private void funktion1()
{
	Dictionary<string, object> dict = new Dictionary<string, object>();
	
	for (int i = 0; i < 1000000; i++)
	{
		int hash = GetMyHashCode(i.ToString());

		if (!dict.ContainsKey(hash.ToString()))
		{
			dict.Add(hash.ToString(), null);
		}else
		{
		}
		
	}
}


private int GetMyHashCode(string s)
{
	int z = 0;
	int m = 1000000;
	char charTemp;

	for (int i = 0; i < s.Length; i++)
	{
		charTemp = s[i];
		z = ((z << 1) ^ s[i]);
		//z = (z * 256 + charTemp) % m;
	}

	z = z % m;

	return z;
}


Grüße

09.06.2008 - 10:11 Uhr

Hallo,

wie bekomme ich in einer Hide Form die key events? d.h. ich habe ein Suchfenster entwickelt und möchte beim schließen das Fenster verstecken (also nicht schließen) und auf F3 Taste hören.

Grüße

21.03.2008 - 22:11 Uhr

Bevor ich jetzt nur noch Sterne sehe musst Du mal bitte erklären was Du genau meinst.

Beispiel: Ich habe ein generisches Datenmodell (D.h. viele Klassen mit properties). Das Datenmodell soll Format unabhängig sein aber wesentliche Informationen beinhalten. Sagen wir ich soll ein Auto beschreiben, dann habe ich Klasse Auto als einstig (eine Art von Facade). Das Auto beinhaltet Klassen wie Axe, Rad, Motor, Karroserie usw. und das alles verschachtelt. D.h. Axen beinhalten Räder, Räder beinhalten Sensoren, Karroserie beinhaltet Türe, Türe beinhaltet Scheiben usw.... Alles schön abstrakt und Format unabhängig.
Jetzt bekomme ich die Beschreibung von einem Auto in Form XML datei dann schreibe ich einen XMLConverter (siehe Code unten), sollte ich auch das Auto im KWP2000 Format beschreiben schreibe ich wieder einen KWP2000Konverter...
So kann ich das Datamodell von XML datei füllen und aus dem Datenmodell in KWP2000 Format wieder rausschreiben und umgekehrt. Mit so einem Model kann ich daten von einem format ins anderes format exportieren.


public class XMLConverter : IConverter
{
    public AutoDataModell Import()
    {
         .............
    }

    public void Export(AutoDataModell auto)
    {
        ....................
    }
}

Ich meine die einfachste Lösung ist doch vielleicht 'ne Art Name-Value Paare per DTD festzulegen, die Namen und die Values können dann beliebig hinzugefügt werden.

über den Aufbau von dem XML Schema entscheidet ein Konsortium (d.h. viele Konzerne sind da beteiligt). Ich muss mein Tool so flexibel schreiben,dass ich mit wenigen Änderungen zu Recht komme.

21.03.2008 - 20:25 Uhr

Vielen Dank für die Antworten. Also XML Schema existiert auch und über den Aufbau von dem XML Schema entscheidet ein Konsortium (ich habe null zum sagen). Das Problem ist, dass sie ständig etwas ändern und man muss immer hinterher laufen...heh. ich habe mir überlegt so ein generisches datenmodell aufbauen und für jedes Release einen Konverter zu schreiben. Dann habe ich eine Art von Sternkonverter (ist eine super Sache).

Das mit Delphi geschriebene Tool funktioniert einigermaßen und wird ständig erweitert. und angepasst. Ich persönlich bevorzuge .Net (C#) Mit .Net kann man schöner bzw. einfacher Objektorientiert programmieren. Viele Sachen sind vereinfacht (:net 2.0) z.B. Delegates, Generics (Dictionary<>, List<> super Sache), StringBuilder, Reflections..und und und. Was noch dazu kommt sind die ganze features von Visual Studio 2005. Delphi Entwicklungsumgebung ist einfach Schei...e, z.B. was fehlt ist Refactoring...
Bis jetzt für das Tool sind keine DUnits geschrieben..hmmm...dass es läuft, ist ein Wunder.

ich würde sogar behaupten, dass die Weiterentwicklung mit C# wird sich schon produktiver gestalten. Nur die Frage ist, wie groß ist der Aufwand, wie gesagt 5 Jahre Delphi Entwicklung, das ist schon eine Menge an Klassen.

21.03.2008 - 19:03 Uhr

hmm..also kein generisches Datenmodell 😉

Ich habe noch zweite Frage: Das Tool ist mit Delphi 6 entwickelt worden (ca. 5 Jahre Entwicklung). Was sprich dafür oder dagegen um auf .Net (C#) umzusteigen? Welche Risiken sind damit verbunden (ich bin eher freund von C# 🙂) z.B. Reverse Engineering.
Oder besser gesagt, wie kann ich die Vorgesetzten überzeugen, dass der Aufwand sich lohnt?

Grüße

21.03.2008 - 10:10 Uhr

Hallo,

ich habe eine Design Frage. Ich arbeite letzte zeit viel mit XML Dateien d.h so eine Art Konfiguratoren. Es wird eine XML - Datei eingelesen und von Benutzer bearbeitet und dann wieder abgespeichert. Die XML Datei entspricht einem Format, welches auch von dem Benutzer erweitert werden kann (d.h. kann zusätzliche Elemente hinzufügen).
Problem ist auch, dass das Format sich ständig ändert. D.h. Version 2.0 ist nicht kompatibel mit Version 1.0.
Meine Frage ist, ob ich ein generisches Datenmodell (so was wie Composite Pattern) dafür schreiben soll oder einfach mit xmlDocument arbeiten?

Grüße

robmir

13.03.2008 - 07:49 Uhr

ok, jetzt habe ich so etwas gefunden


string xmlContent = xmlNode.OuterXml;

jetzt ist meine frage, ob ich den string wieder anzeigen kann (dh. mit xml Formatierung...). Ich habe es mit richTextBox probiert aber ohne gute Ergebnis zu bekommen. Vielleicht muss man selbst den string parsen und dementsprechend an RTF Format anpassen oder gibt es schon einen fertigen XML-Viewer als control für .net 2.0?

Grüße

robmir

12.03.2008 - 12:36 Uhr

na ja, eben habe ich mir XmlDocument, XmlTextReader angeschaut. Wo kann ich so zum Beispiel etwas schreiben:



string content = xmlObject.GetXMLContent( Element element);


Also ich habe so etwas nicht gefunden.

Grüße

robmir

12.03.2008 - 11:34 Uhr

verwendetes Datenbanksystem: xml

Hallo,

gib es die Möglichkeit in C# .net 2.0 eine XML-Datei einlesen dann z.B. alle Elemente in einer Liste (ListView) auflisten und dann wenn der Benutzer ein Element in der Liste auswählt soll das Element und alle dazugehörige Elemente in XML- Format ausgegeben werden.

Beispiel:

XML - Datei

<kundenliste>
  <kunde id="01">
    <name>kunde1</name>
    <tel>123456</tel>
    <email>kunde1@yahoo.de</email>
  </kunde>

  <kunde id="02">
    <name>kunde2</name>
    <tel>876543212</tel>
    <email>kunde2@gmx.de</email>
  </kunde>
</kundenliste>

ListeView mit Elementen

kunde1
kunde2

wenn ich jetzt kunde2 selektieren werde soll ich als string das hier bekommen:

<kunde id="01">
<name>kunde1</name>
<tel>123456</tel>
<email>kunde1@yahoo.de</email>
</kunde>

Grüße

robmir

03.12.2007 - 14:21 Uhr

na ja, habe ich schon verschiedene Einstellungen eingestellt usw. z.B gleiche Baudrate, StopBits, Parity.... aber ohne Erfolg. Dann habe ich auf einem anderen Rechner ausprobiert und gings genau so: empfangen geht, senden aber nicht.

03.12.2007 - 13:12 Uhr

Hallo,

ich habe ein Laptop ohne Serielle schnittstelle und möchte via Serielle schnittstelle mit einem ECU kommunizieren. Problem ist dabei, dass ich Dtaen emfangen aber nicht senden kann. Weisst jemand woran das liegen kann??

Grüße

robmir

05.10.2007 - 11:52 Uhr

das mache ich auch, das Data Model neu füllen.

05.10.2007 - 09:26 Uhr

Hej,

genau, schon wieder Kreisverkehr 😉 y.VorneLinks und list [0] sollten auf dasselbe (deserialisierte) Objekt verweisen aber machen es nicht. Nachher sind das zwei verschiedene Instanzen.

Grüße

04.10.2007 - 18:34 Uhr

nöö in list [0] ist auch die Referenz auf das deserialisierte Objekt aber trotzdem Danke für die hilfe. Ich glaube, dass es schwierig zu machen wird. Na ja, ich muss da etwas helfen, das gleiche Problem ist mit events, wenn man deserialisiert, dann kann der Deserialisier nicht wissen, dass die objekte Event-Methoden registrieren (einbinden) müssen 🙁

also bis Morgen

04.10.2007 - 18:09 Uhr

Ich meine das hier:


List<Rad> list = new List<Rad>();
Rad x = new Rad();
Auto y = new Auto(); // Klasse nur erfunden
y.VorneLinks = x;
list.Add(x);

// Dann irgendwo anders im Code
y.VorneLinks.Durchmesser = 60; 

also wenn ich nach der Deserialisierung zb. y.VorneLinks.Durchmesser einen neuen Wert zuweise (in dem fall 60) dann wird der Wert in der Liste nicht geändert, weil da bestimmt andere Referenz ist.

04.10.2007 - 17:57 Uhr

das ist mir schon klar, aber beim Erzeugen kann man doch wieder auf das gleiche zeigen lassen, oder?

04.10.2007 - 17:53 Uhr

Hej,

ich habe noch eine Frage, nämlich: wenn ich meinen dataModel mit XmlSerializer serializiere und deserialisiere funktioniert so weit so gut alles wunderbar. Das einzige Problem ist, dass nach der Deserialisierung meine Referenzen verschwinden (sind einfach nicht mehr da). Das Problem mit den Referenzen habe ich hier oben beschrieben. Kann ich meinen DataModel so serializieren, dass die Referenzen in XML-Datei auch abgespeichert werden?? man kann doch im XML auch referenzieren ( keyref ) , oder?

Grüße

robmir

02.10.2007 - 11:39 Uhr

Original von JuyJuka
Um auf "gleiche Instanz" zu prüfen gibt es System.Object.ReferenceEquals()

Vielen Dank für den Hinweis 🙂

02.10.2007 - 08:34 Uhr

Hallo,

sorry, dass ich so spät antworte aber ich bin im Umzug Stress 🙁 Was ich habe das sind Klassen. Ich mach jetzt zur Sicherheit mit hashcode zu arbeiten um auf Nummer sicher zu gehen, dass ich mit gleicher Instanz arbeite.
Aber trotzdem vielen Dank für die Hilfe.

Grüße

robmir

ps. jetzt auf einmal scheint es zu funktionieren, tja.

01.10.2007 - 16:28 Uhr

Ich habe schon ausprobiert und es hat nicht funktioniert, darum habe ich hier im forum nach der Ursache gefragt.

01.10.2007 - 14:58 Uhr

Ganz genau das habe ich auch gedacht wie Du es schreibst. Ich hoffe das es so auch ist.

01.10.2007 - 14:41 Uhr

ja, das meine ich "Referenz auf ein Objekt". dann wie mache ich das hier:


List<Rad> list = new List<Rad>();
Rad x = new Rad();
Auto y = new Auto(); // Klasse nur erfunden
y.VorneLinks = x;
list.Add(x);

// Dann irgendwo anders im Code

y.VorneLinks.Durchmesser = 60;


arbeite ich hier an gleichem objekt was in der liste steckt?? oder habe ich immer noch problem mit

Versuche mal zwischen Objekt und Variable zu trennen 😉

01.10.2007 - 13:24 Uhr

dh. dass in C# keine Möglichkeit gibt, um eine typisierte Liste mit referenzen zu verwalten?

01.10.2007 - 13:12 Uhr

nöö, ich will an

y.VorneLinks = new Rad();

kein neues Rad zuweisen, sondern ein Attribut von y.VorneLinks ändern. Und das Attribut sollte auch in der Liste bei der gleicher Instanz geändert werden. Problem ist, dass man keine Referenzen (ref) in eine Liste hinzufügen darf.
Ich möchte soetwas wie Zeiger in einer Liste.

01.10.2007 - 13:00 Uhr

@herbivore ganz genau

in y.x und xList[0] jeweils eine Referenz auf dasselbe Objekt stehen aber in einer Liste kann ich doch keine Referenz hinzufügen, oder?

01.10.2007 - 12:14 Uhr

Das ist von Typ "Rad" also eigener Typ.

01.10.2007 - 12:09 Uhr

hallo,

Wenn ich ein Objekt, sagen wir objekt x, in eine Liste hinzufüge und das gleiche Objekt an eine variable xv, ist das gleiche Referenz?? So wie ich das sehe wird immer eine Kopie gemacht und das ist hmmm.....nicht so gut.
Hier ein Code Beispiel:


X x = new X(),

Y y = new Y();

List<X> xList = new List<X>();

xList.Add(x);

y.x = x;

Wenn ich jetzt das x in y.x ändere möchte, will ich das es auch in der Liste geändert wird, aber das Objekt wird nicht in der Liste geändert. Ich wollte schon mit ref ausprobieren aber es funz nicht. Wie kann ich das vermeiden??

Grüße

robmir

25.09.2007 - 10:46 Uhr

Hallo,

ich habe eine TableLayoutPanel mit 15 Zeilen und 15 Spalten. In den Zellen habe ich checkBox'en als Button dargestellt. So kann der Benutzer visuell bestimmte Zellen auswählen, eigentlich es geht um eine grafische konfiguration.
Problematisch wird es beim Zeichnen bzw. repainten von dem Control, es dauert immer 2 sec. bis es neugezeichnet wird. Kann ich das Repainten irgendwie beschleunigen?

Das ganze ist im UserControl und da habe ich schon DoubleBuffer aktiviert.


public ConfigurationUserControl()
{
	InitializeComponent();
	SetStyle(ControlStyles.AllPaintingInWmPaint |
		ControlStyles.UserPaint |
		ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer |
		ControlStyles.ResizeRedraw,
		true);
}

Klar, aber das hat keine Auswirkung auf checkBox'en 🙁 Vielleicht gibt es einen geeigneten Control für solche Aktivitäten?(

Grüße

robmir

19.09.2007 - 13:29 Uhr

Original von svenson
ANSI bekommst du mit Encoding.Default.

Das habe ich auch schon probiert, wie gesagt ohne Erfolg d.h. Zahl größer 127 wird auf 68 gesetzt.

Grüße

Robmir

18.09.2007 - 21:03 Uhr

Original von svenson
Genau deswegen musst du auch ReadExisting() verwenden....
Das _Zurücksetzen _von Byte-Werten oberhalb von 127 liegt am Default-ASCII-Encoding. Einfach auf ANSI umstellen, dann funzt es (siehe SerialPort.Encoding-Property).

Hei,

auf ANSI umstellen, aber wie?? ich habe alle Encodings ausprobiert, ohne Erfolg.

Grüße

robmir

18.09.2007 - 14:20 Uhr

ok, ich will noch zu meiner Frage gehen.
Ich muss den Puffer via

number = serialPort.Read(dataBuffer, 0, serialPort.ReadBufferSize);

auslesen.
Grund: Mit ReadExisting werden die Bytes, die den Wert 127 überschreiten, auf 63 zurückgesetzt. Ich habe schon verschiedene Encoder probiert aber es hat nicht funktioniert. Whatever.

Problem ist, dass während die Daten ausgelesen werden, können Neue Bytes in Buffer eintreffen und da werde ich nicht benachrichtigt. Erst dann, wenn neue Nachricht kommt stelle ich fest, dass im Puffer noch bytes liegen. Acha, und die Frames, die ankommen sind immer variabel von der Länge (zwischen 4 bytes und 255 bytes).

Ist das normal?? wie kann ich sowas vermeiden?

hier noch code:


public event DataReceivedEventHandler DataReceivedEvent;
private List<byte> byteList = new List<byte>();
private Queue<byte[]> queue = new Queue<byte[]>();

void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
	lock (serialPortAdapter)
	{
		int number = 0;

		byte[] dataBuffer = new byte[serialPort.ReadBufferSize];

		// Reads the serialPort buffer
		number = serialPort.Read(dataBuffer, 0, serialPort.ReadBufferSize);

		if (number > 0)
		{
			BytesReceived(dataBuffer, number);
		}
	}
}

private int BytesReceived(byte[] dataBuffer, int number)
{
	int result = 0;

	AddsDataBufferBytesToList(dataBuffer, number);

	// Gets the frame length
	if (length == 0)
	{
		length = CheckLength(dataBuffer);
	}

	// If the whole fram is in buffer then adds the string to a queue.
	if (length == byteList.Count)
	{
		queue.Enqueue(byteList.ToArray());
		isAllDataReaded = false;
		byteList.Clear();
		length = 0;
		//serialPort.ReceivedBytesThreshold = 1;
		result = 1;
	}
	// In the buffer are more than one frame. The buffer must be fragmented and removed whole frames from
	// buffer and added to the queue.
	else if (length < byteList.Count)
	{
		//queue.Enqueue(CreateByteArray(byteList, length));
		//byteList.RemoveRange(0, length);
		//length = CheckLength(byteList.ToArray());

		while(byteList.Count >= length)
		{
			queue.Enqueue(CreateByteArray(byteList, length));
			byteList.RemoveRange(0, length);
			if (byteList.Count > 1)
				length = CheckLength(byteList.ToArray());
		}

		length = 0;
	}
	else if (length > byteList.Count)
	{
		//serialPort.ReceivedBytesThreshold = length;
	}

	// Invokes observers.
	if (queue.Count > 0)
	{
		for (int i = 0; i < queue.Count; i++)
		{
			if (DataReceivedEvent != null)
			{
				DataReceivedEvent(this, queue.Dequeue());
			}
		}
	}

	return result;
}

private byte[] CreateByteArray(List<byte> byteList, int length)
{
	byte[] frame = new byte[length];

	for (int i = 0; i < length; i++)
	{
		frame[i] = byteList[i];
	}

	return frame;
}


private void AddsDataBufferBytesToList(byte[] dataBuffer, int number)
{
	for (int i = 0; i < number; i++)
	{
		byteList.Add(dataBuffer[i]);
	}
}


private int CheckLength(byte[] bytes)
{
	int i = 0;

	if (!isAllDataReaded)
	{
		i = KWP2000.GetFrameLength(bytes);
	}

	return i;
}

16.09.2007 - 13:59 Uhr

😁 ma lernt immer was neues, ehrlich gesagt ich habe von MVP noch nie gehört 8o aber danke für die neue Information 🙂

16.09.2007 - 11:07 Uhr

Erstmals vielen Dank für die Antwort 🙂

Original von svenson
Praktisch jedes Fahrzeug hat mindestens ein Steuergerät, welches auf die 3-4 Standard Diagnose- und Info-Dienste fehlerhaft antwortet.

Ich habe das Glück, dass es sich nur um einen Mikrocontroller handelt, der auch bei uns entwickelt wird. D.h. über Rs232 und KWP2000 soll der Mikrocontroller konfiguriert werden.
Die Standard Core für Mikrocontroller bekomme ich von Kundenseite, da weiß ich nocht nicht wie der Kunde das KWP-Protokoll implementiert hat.
Ich möchte auch das ganze etwas unabhängig von der Implementierung halten, so dass ich die PC-Applikation wiederverwenden kann 🙂 tja, schaut so aus, dass ich doch im SerialPortAdapter die Erkennung durchführen muss, das wird mich aber nicht zufrieden stellen 😉

Wie meinst Du das mit Fehlertoleranz? eigentlich bin ich neu im Embedded-Bereich

Grüße

robmir

15.09.2007 - 20:23 Uhr

Original von svenson
Seit wann gibts denn Steuergeräte mit rs232? KWP läuft doch üblicherweise auf CAN.

Fragmentierung ist völlig normal. Damit musst du umgehen. Immer schön mit ReadExisting() lesen.

Alles erstmal in einen Puffer lesen, Längenbyte checken (1 Byte?). Prüfen ob Puffer schon komplett, wenn nicht, Puffer stehen lassen und nix tun. Wenn der Puffer voll ist, an die KWP-Schicht senden und Puffer leeren.

ich dachte, dass keiner mehr antworten wird 😉
Ja, das wunder mich auch mit dem rs232 aber so will der Kunde haben.
Das Problem ist, dass ich das Längenbyte im SerialPortAdapter checken muss, und das gehört in die KWP-Schicht wegen Teilung (KWP-Schicht weiss doch wie Header aufgebaut ist) 🙁 und die Analyse von Header soll KWP-Schicht übernehmen. Was meinst Du, soll ich das (Header Analyse) doch im SerialPortAdapter machen?

Zweitens mit serialPort.Read() bekomme ich gleich byte[] und von ReadExisting() string. Ok, string kann ich zu byte[] konvertieren.

Grüße

robmir

15.09.2007 - 09:42 Uhr

ja hast Du recht, habe ich vergessen zu sagen, dass es nur an MVC angelehnt ist. Bei MVC wird View und Controller meistes zusammengefügt.
Um Alleskönner zu vermeiden benutze ich meistens mehrere Controller wie: ApplicationController, ContextController....

15.09.2007 - 09:04 Uhr

Hallo zusammen,

ich kenne nur diese Vorgehensmodelle: Wasserfallmodell, V-Modell und Spiralmodell. Die Agile Software-Entwicklung verwede ich falls ich etwas daheim machen muss 😉

Mein ansatz ist:

  1. Requirements Engineering
    Fragen wie: warum, was, wie, wofür. Hier werden die Anforderungen eine Rolle spielen wie: Funktionale und nichtfunktionale, GUI, Interface Anforderungen.
    Am besten für jede Anforderung ein Testfall erstellen. Was auch wichtig wäre, sind Use cases (Szenarios erstellen).

  2. Software Design/Architektur
    Architektur:
    Architektur mache ich meistens als dreischichtige oder mehrschichtige Architektur. Wichtig sind die saubere definierte Schnittstellen. Z.B. Client Layer (GUI) - Logical Layer (Public Services) - Data Abstracion Layer (private Services und Persistence Framework) - Data storage Layer (DB, File System).
    Ich benutze oft MVC:
    Das Data Model versuche ich generisch zu halten soweit es geht. So kann ich verschiedene Formate im Data Model speichern. Die Zugriffe auf das Data Model laufen über eine Facade, so ist für den Benuter egal wie das Data Model aufgebaut ist und die Zugriffe werden vereinheitlicht. Das Data Model füllen mache ich über Converter (die IConvert implementieren) damit habe ich so eine Art von Sternkonverter erreicht. Beispielhaft Ich kann in das Data Model mit Daten im Format X füllen und im XML-Format rausholen. Somit bin ich Formatunabhängig.
    In Forms empfange ich die Nachrichten und leite weiter an controller, der Controller bearbeitet dann die Anfragen und das Ergebnis leitet weiter an GUI. Damit kann ich leichter GUI austauschen (weil ganze Logik im Controller drin ist), habe ich schon öfters gemacht und gehts super schnell. Tja, und so können auch die NUnits Tests (für Logik) leichter durchgeführt werden (da brauche ich GUI nicht bedienen).

Design:
na ja, hier müssen die Objekte, Attribute, Methoden usw. erkannt werden. Z.B.
Substantiv --> Klasse, Adjektiv --> Attribut, Verb (Verhalten) --> Methode
Hiwe wird man auch mit Design Patterns arbeiten müssen.

  1. Implementierung
    Da weiss jeder wie es gehen soll 😉 Kommentare nicht vergessen.

  2. NUnit
    Ich mache meistens so Grey-Box-Test.

Diese Werkzeuge sind bei der Entwicklung sehr nützlich:

  • NUnit
  • CruiseControl.NET-CCTray
  • log4net
  • Enterprise Architect
  • CVS, ClearCase oä.
  • doxygen, Robohelp oä.

Grüße

Robmir

14.09.2007 - 22:39 Uhr

Hallo zusammen,

ich programmiere einen Tester, der über den SerialPort mit einem Steuergerät kommunizieren soll. Da ich zur Zeit kein Steuergerät habe, benutze ich zwei Rechner (Desktop und altes Laptop) mit dem gleichen Programm. Die Einstellungen im Geräte-Manager von COM1 sind identisch. Und der Code schaut so aus:


public event DataReceivedEventHandler DataReceivedEvent;
private SerialPort serialPort = null;

public SerialPortAdapter()
{
	try
	{
		serialPort = new SerialPort();

		serialPort.DtrEnable = true;
		serialPort.ReadTimeout = 500;
		serialPort.RtsEnable = true;
		serialPort.WriteTimeout = 500;
		serialPort.Encoding = Encoding.ASCII;
		serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
		serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(serialPort_ErrorReceived);
		serialPort.BaudRate = 115200;
		serialPort.DataBits = 8;
		serialPort.PortName = "COM1";
		serialPort.DiscardNull = true;
		
		serialPort.Open();
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}
		
void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
	byte[] dataBuffer = new byte[serialPort.ReadBufferSize];

	int countOfBytes = serialPort.Read(dataBuffer, 0, serialPort.ReadBufferSize);
	
	// hier wird dataBuffer an höhere Schicht per event weiter gegeben und dort wird das Protokoll z.b. kwp2000 
	// weiter verarbeitet. 
	if (DataReceivedEvent != null)
	{
		DataReceivedEvent(this, dataBuffer);
		
	}
}

public void Send(byte[] frame)
{
	try
	{
		serialPort.Write(frame, 0, frame.Length);
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

Wenn ich von Desktop-Rechner an Laptop eine Nachricht sende, kommt sie als ein Frame an. Aber wenn ich von Laptop an Desktop-Rechner die gleiche Nachricht sende (z.B "0123456789") kommt sie fragmentiert an (d.h. in 2 Paketen). Und hier habe ich Probleme, ich versuche in der höherer Schicht (kwp2000-Protokoll) die länge der Nachricht von Header auslesen und so lange zu puffern bis die ganze Nachricht angekommen ist. Nur da komme ich irgendwie durcheinander. Jetzt ist die Frage, was ich da falsch mache?
Ich vermute, es hat etwas mit threads zu tun 🙁

Grüße

robmir

05.09.2007 - 08:58 Uhr

[EDIT]Abgeteilt von [Tutorial] Das neue Konfigurationsmodell im .NET Framework 2.0[/EDIT]

Hallo,

ich möchte zur Laufzeit die Properties und dazugehörige Werte anlegen, also:


private void XXX_FormClosing(object sender,  FormClosingEventArgs e)
{
  if (Properties.Settings.Default.Properties[this.Text] != null)
  {
      ((Properties.Settings.Default.Properties[this.Text]) as SettingsProperty).DefaultValue = new Point(Location.X, Location.Y);
  }
  else
  {
      SettingsProperty sp = new SettingsProperty(this.Text);
      sp.PropertyType = Type.GetType("System.Drawing.Point");
      sp.DefaultValue = new Point(Location.X, Location.Y);
      Properties.Settings.Default.Properties.Add(sp);
  }
  Properties.Settings.Default.Save();
}

private void ReadSettings()
{
   foreach (SettingsProperty settingsProperty in Properties.Settings.Default.Properties)
   {
		if (settingsProperty.Name.CompareTo(this.Text) == 0)
		{
			Point point = (Point)settingsProperty.DefaultValue;
			if (point != null)
			{
				this.Location = point;
			}
			break;
		}
	}
}

So kann ich für jedes Fenster (was auch dynamisch angelegt werden kann) die letzte Position abspeichern.

Das Problem ist, dass die Werte bei Neustarten von Application verloren gehen. Hat vielleicht jemand eine Idee warum?

06.08.2007 - 23:43 Uhr

Hej,

ich bin auf der suche nach Infos, wie ich in einem Fremdprogramm die sysTreeView32-Control fernsteuern kann. Ich haben das Handle von dem sysTreeView32-Control. Ich möchte die Nachrichten (Callback) über selektierten Knoten empfangen (d.h. wenn ein Knoten selektiert wird).
Das einzige was mir einfällt, ist sendMessage...na ja aber das ist "nur" senden.

Grüße

robmir

26.07.2007 - 10:43 Uhr

Hallo,

kan man programmatisch einen aktiven Bildschirminhalt kopieren, so wie mit "Strg+Alt+Druck" unter windows?

Grüße

robmir

25.07.2007 - 11:08 Uhr

Hei,

ich habe ein add-in für Enterprise Architect geschrieben. Ich möchte von EA ein Diagramm per "Drag and Drop" auf meine Applikation ziehen können. Das Problem ist, dass in der Schnittstelle von EA keine "Mouse events" zur Verfügung stehen. Kann ich das umgehen und feststellen, ob etwas und was in fremder Applikation gedrück worden ist?

Grüße

robmir

13.06.2007 - 09:07 Uhr

Hei,

ok ich habe das Problem behoben. Das Problem war, dass in C-Code bei der Funktionsdeklaration von CallBack-Funktion muss ein "__stdcall " voreingestellt werden.
Etwa so:


typedef void (__stdcall *CallBackFunc1)(char * str1, char * str2);
CallBackFunc1 myCallBack;

void WINAPI __declspec(dllexport) Register(CallBackFunc callBackFunc,CallBackFunc1 myCallB)
{
	myCallBack=myCallB;
}

void WINAPI __declspec(dllexport) vDISTask( void )
{
	char* PU8AUTBuffer1;
        char* PU8AUTBuffer2;

        while(1)
	{
		sleep(10);

		myCallBack(PU8AUTBuffer1, PU8AUTBuffer2);

        }
}

Hier die Erläuterungen:

* __stdcall - übergibt Parameter in umgekehrter Reihenfolge über den Stack; die aufgerufene Funktion muss den Stack aufräumen. Wird z.B. von der Win32-API verwendet.
* __cdecl - übergibt Parameter in umgekehrter Reihenfolge über den Stack; der Aufrufer muss den Stack aufräumen. Standardkonvention für C.
* __fastcall - übergibt Parameter in umgekehrter Reihenfolge über den Stack und die Register; die aufgerufene Funktion muss den Stack aufräumen.
* __pascal - übergibt Parameter über den Stack; die aufgerufene Funktion muss den Stack aufräumen. Standardkonvention für Pascal.

Grüße

Robmir

05.06.2007 - 11:57 Uhr

habe ich nur noch herausgefunden, dass ich ohne Parameter das zum laufen bringe. Nur das Problem ist, wenn ich das Fenster mit einem anderen Fenster überdecke, bleibt das Thread stehen ?( hmmm....na ja aber wieso mit Übergabeparametern funz es nicht oder nach 20 sec bricht die Anwendung ab.

05.06.2007 - 08:41 Uhr

nein, in C schaut das ganze so aus:


typedef signed char * PS8;

typedef void (*CallBackFunc)(PS8, PS8);
CallBackFunc call;

void WINAPI __declspec(dllexport) Register(CallBackFunc callBackFunc)
{
	call = callBackFunc;
}

void WINAPI __declspec(dllexport) vDISTask( void )
{
	while(1)
	{
	        /*Read Keys*/
		sleep(55);
		ps = "test1";
		ps1 = "test2";
		call(ps, ps1);
	} 
}


und in C# so:


private delegate void CallbackDef(string str0, string str1);
private delegate void ReadKeys();

[DllImport(@"D:\MyThings\my.dll")]
static extern void Register(CallbackDef callback);
[DllImport(@"D:\MyThings\my.dll")]
static extern void vDISTask(); 

public Form1()
{
      CallbackDef callback = new CallbackDef(WriteDisplay);
      Register(callback);
      vDISTask();
}

public void WriteDisplay(string str0, string str1)
{
     System.Console.WriteLine(str0 + "  " + str1);
}


Nach ca. 20 sec kommt in VS2005 so eine Meldung: Unbehandelte Win32-Ausnahme in xxx.vshost.exe [3892]

Grüße

robmir

04.06.2007 - 21:02 Uhr

Hej 😉

der will damit sagen, wenn eine Funktion aus C (das ist dll) in c# zyklisch aufgerufen wird, bricht C# nach ein paar sec die Anwendung ab.

04.06.2007 - 20:44 Uhr

Hej,

ich habe ein Modul (das ist eine dll) in ANSI C geschrieben und habe in C# GUI, um das Modul zu testen gebastelt. Das ist so, das von c# ein delegate an C übergeben wird, um später über CallBack eine Funktion in C# aufrufen. Dh. C ruft eine Funktion in C# und die Funktion wird zyklisch, sagen wir 10 ms auferufen. Es funktionier bis gewisse Zeit wunderbar. Nach ca. 30 sec wird das Programm beendet dh. in Ausgabefenster steht,dass die Datei xxx.vshost.exe hat das Programm beendet. Obwohl in C die Funktion wird mit while(1) zyklisch ausgeführt. Dann habe ich gedach, dass die Zeitauflösung zu fein ist und habe die Zykluszeit auf 55 ms eingestellt, nach ca. 1-2 min passiert das gleiche.

Ich hoffe, das jemand dafür eine Lösung kennt.

Grüße

robmir

15.05.2007 - 11:03 Uhr

Hei,

besteht die Möglichkeit programmatisch TreeView und DataGridView beim scrollen von DataGridView zu synchronisieren? Dh. ich möchte vertical (bei Bedarf) DataGridView zu scrollen und gleichzeitig das TreeView.

Ich brauche das, weil ich ein UserControl mit Treeview und DataGridView gebaut habe. Zu jedem Knoten im TreeView existiert eine Zeile mit Beschreibung im DataGridView. Beim scrollen von DataGRidView muss auch treeView mit gescrollt werden.

Ich habe schon mit GetScrollInfo, SetScrollInfo... in TreeView (weil in TreeVIew kein scroll event existiert) probiert aber programmatisch kann ich es nicht zum laufen bringen. Wenn jemand eine Lösung hätte, würde ich sehr Dankbar.

Grüße

Robmir

18.04.2007 - 07:50 Uhr

Hej,

inzwischen weiss ich das, das Problem ist jetzt, dass ich das Dokument zur Laufzeit erzeugen muss, dann speichern und erst dann hin navigieren. D.h. ich kann nicht zur Laufzeit Dokument erzeugen bzw. auslesen (Stream) und gleich in webBrowser darstellen. Das mit dem Speichern und dann öffnen und zum schluß löschen ist eine unsaubere Lösung.

Das Problem mit navigieren habe ich auch in einem anderen Beitrag geschrieben.
Und noch etwas, ich kann kein freies Tool benutzen (Container), weil das Programm kein open source ist 🙁

Grüße

robmir

16.04.2007 - 08:23 Uhr

Hallo,

ich erzeuge zur Laufzeit eine Word Datei und möchte sie gleich in webBorowser anzeigen. Problem ist, dass ich zuserst diese Word Datei auf die Festplatte speichern muss und erst dann mit webBrowser.Navigate(path, bool) kann ich sie in dem webBrowser öffnen. Kann ich die datei auch ohne zu speichern müssen zur Laufzeit öffnen??
Ich öffne die Datei via stream von DB (bzw. tue neu erzeugen) möchte sie bearbeiten und dann wieder als Blob in DB speichern.

Ach, was noch passiert mit webBrowser.Navigate ist , dass der User zuerst gefragt wird, ob er die datei öffnen bzw. speichern will und zweitens es werden zwei Word Dateien immer geöffnet einmal im webBrowser und das 2 mal ganz normal (also nicht eingebettet).

Grüße

robmir

13.04.2007 - 13:16 Uhr

Hallo,

habe ich gesucht aber nicht gefunden und wollte wissen wie kann ich word dokument neu erzeugen und in das GroupBox einbinden (einbetten)?

Grüße

robmir