Ich sitz grade hier, und warte dass was vom Livestream kommt ^^
Gibt' s da nen Link für?
Zum verwirrten Physiker aus Tübingen:
Prof. Dr. Otto Rössler, Biochemiker, Chaosforscher und Endophysiker (keine Ahnung was das ist)
http://www.zeit-fragen.ch/ausgaben/2008/nr31-vom-2872008/warum-ich-vor-dem-lhc-experiment-warne/
In dem Text hat er wohl wissenschaftlich begründet, warum der LHC gefährlich ist und die Erde durch ein kleines schwarzes Loch verschlungen wird. Er geht davon aus, dass die allgemeine Relativitätstheorie auch anders interpretiert werden kann. Aber es scheint mir so, dass er wohl eine Aussenseiterrolle einnimmt, da ihn ansonsten ja mal jemand ernst genommen hätte von den Wissenschaftlerkollegen.
Läuft bei dir die Kommunikation über dllimport ab? Dann kannst du in C# die Struktur erstellen. Die gibst du dann als Parameter für die Übergabe an.
Vielleicht hilft dir folgender Artikel: Structur Arrays Marshaling
Wäre dann eine dauerhafte Nutzung des Pointers (pinnen) nicht auch unter Verwendung von stackalloc gewährleistet? Also in folgender Form:
void* voiPtr;
uint* intPtr = stackalloc uint[5];
intPtr[0] = 1;
intPtr[1] = 2;
intPtr[2] = 3;
intPtr[3] = 4;
intPtr[4] = 5;
voiPtr = intPtr;
Bei mir sinds wohl um die 40 bis 50 Stunden. Je nachdem was gerade so anliegt.
Mein Musikgeschmack hat sich in letzter Zeit ziemlich gewandelt. Weiß nicht, ob das viell. am Alter liegt 🙂 Habe erst sehr gern Techno gehört, aber das wurde mir irgendwann zuviel und war doch alles immer ziemlich ähnlich. Seitdem höre ich mehr Rock, aber auch immer lieber Jazz und sogar mal was Klassisches.
Grüße
Wie Femaref schreibt, ist TryParse() die richtige Wahl. Da kannst du über den Rückgabewert herausfinden, ob die Umwandlung geklappt hat. Der Zahlenwert steht dann in dem zweiten Parameter, der über out übergeben wurde. Hier mal ein Beispiel:
double dZahl;
bool bParseErfolgreich = double.TryParse (txtBox1.Text, out dZahl);
if (bParseErfolgreich)
{
Console.WriteLine(dZahl.ToString());
}
Konnte man nicht bei der Checkbox auch den Stil Button einstellen?
Also der einfachste Weg wäre sicherlich, die gesamte CurveList zu löschen, bevor du eine neue Kurve einfügst.
zedGraph.GraphPane.CurveList.Clear();
zedGraph.Refresh();
Du kannst auch nur die erste Kurve unsichtbar machen:
zedGraph.GraphPane.CurveList[0].IsVisible=false;
Oder du löscht ganz gezielt deine alte Kurve mit remove:
zedGraph.GraphPane.CurveList.Remove(zedGraph.GraphPane.CurveList[iCurveNr]);
Grüße
Denn "Null" wird der Pfad nicht sein. Aber die Datei existiert trotzdem nicht mehr...
Genau, wenn du mit File.Exists abfragst, dann kannst du ganz sicher sein, dass die Datei auch wirklich noch vorhanden ist.
wenn die Überlastungsmeldung fälschlich stehen bleibt, solltest du deinen Browser-Cache leeren oder die Seite unter Umgehung des Caches neu laden. Das geht bei IE und FF mit Ctrl-Shift-R.
OK, danke für den Tipp. Daran hatte ich nicht gedacht. Hab zwar sehr oft mit F5 neu geladen, aber es scheint als ob dadurch immer nur die Fehlermeldung aus dem Cache gezaubert wurde.
[EDIT=herbivore]Zusammengefügt[/EDIT]
Hallo Leute,
ist Euch auch schon aufgefallen, dass bei Aufruf von http://www.mycsharp.de folgende Fehlermeldung kommt:
myCSharp.de ist wegen Überlastung vorübergehend offline.
Bitte probiere es in ca. 15 Minuten noch einmal.
Für die Unannehmlichkeiten möchten wir uns entschuldigen.
Ich habe jetzt schon seit Tagen geflucht, dass der Server überlastet ist, bis ich durch Zufall herausgefunden habe, dass er gar nicht überlastet ist 🙂 Weil wenn ich die URL http://www.mycsharp.de/wbb2/index.php eingebe, geht' s.
Führt zu ganz schöner Verwirrung.
Grüße
Hallo Lina,
[DLLImport("ImportMe.DLL")] public static extern int CountClients(char *pszClientName);
das Prinzip ist schon richtig. Allerdings musst du bei den Datentypen aufpassen. Kann sein, dass du einige Datentypen über die Marshal-Klasse von unmanaged in managed Code umwandeln musst. Bei den Grunddatentypen ist das aber kein Problem. In deinem Fall würde die Import-Anweisung so lauten:
[DLLImport("ImportMe.DLL")]
public static extern int CountClients(string szClientName);
const char* kannst du mit string oder StringBuilder marshallen.
Ok, wenn das Event vom Browser selber geworfen wird, hast du da wenig Chancen mit der von mir vorgeschlagenen Variante. Aber wie ist das denn mit der Funktionsdeklaration. Dort wird doch ein Parameter URL angegeben. Lässt der sich nicht auswerten?
void axBrowser_NavigateError(object pDisp, ref object URL, ref object Frame, ref object StatusCode, ref bool Cancel)
{
//z.b. folgende Variante
Uri url = URL as Uri;
Console.WriteLine(url.AbsolutePath);
}
Am besten du deklarierst eine eigene NavigateErrorEventArgs Klasse, die von EventArgs erbt und in der du alle benötigten Informationen hinterlegst.
siehe http://mrleeh.de/mrleeh/archives/58-Eventhandling-und-Erzeugen-von-Events.html unter "Auslösen eines Events"
Ich verwende auch string.Empty, da ich aus C++ gewohnt bin, nur Zeigern (also in C# Referenztypen) null zuzuweisen. Da string ein Werttyp ist, sollte es auch mit einem Wert initialisiert werden.
@0815Coder: Danke für den Tipp mit der string.IsNullOrEmpty() Funktion, die erspart zumindest für die Auswertung des Strings Crashs, falls doch einmal einer mit null initialisiert wird.
Da muss ich herbivore Recht geben. Ein bißchen Grundverständnis sollte schon da sein. Schau am Besten mal im C# Openbook nach:
http://www.galileocomputing.de/openbook/visual_csharp/
Speziell den Abschnitt über Klassendesign kann ich dir da empfehlen:
http://www.galileocomputing.de/openbook/visual_csharp/visual_csharp_03_001.htm#mj114817fbe1ad59cce40fb36ca47be019
@Sr_John: Soll die Liste nur Methoden der eigenen Klasse zur Verfügung stehen oder auch Methoden aus anderen Klassen? Dann muss die nämlich public sein, bzw. wäre das schlechter Stil, also als Property implementieren.
Was möchtest du konkret machen?
Fehler entdeckt:
//Pfad in der die Anwendung ausgeführt wird abfragen string sExePath = System.Windows.Forms.Application.ExecutablePath;
sollte eigentlich so lauten:
//Pfad in der die Anwendung ausgeführt wird abfragen
string sExePath = System.Windows.Forms.Application.StartupPath;
ansonsten ist der Dateinamen der Exedatei noch mit drinnen.
So wie ich das sehe, verändert dein Filedialog dein Standardverzeichnis, deshalb wird die Log-Datei dann auch unter dem vorher ausgewählten Pfad abgelegt. Gib lieber den Pfad für die Log-Datei absolut an. Das geht z.B. mit folgender Anweisung
//Pfad in der die Anwendung ausgeführt wird abfragen
string sExePath = System.Windows.Forms.Application.ExecutablePath;
//Ein relatives Verzeichnis zu einem absoluten verbinden
string sTestPath = Path.GetFullPath(Path.Combine(sExePath, "Test");
if (!Directory.Exists(sTestPath)
{
Directory.CreateDirectory("test");
}
FileStream fs = new FileStream(@Path.Combine(sTestPath, "foo.txt"), FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("Hallo Welt!");
sw.Close();
fs.Close();
Alles Gute auch von mir 👍 Super Forum Weiter so
CancelButton gibt übrigens den Button an, der bei Drücken der Esc-Taste "geklickt" wird.
Das müsstest du eigentlich mit Hittest rauskriegen. Für ein Treeview habe ich das schon mal umgesetzt, allerdings nicht für Drag&Drop, sondern für PointToScreen. Aber das Prinzip ist dasselbe: http://mrleeh.de/mrleeh/archives/14-Kontextmenue-mit-PointToScreen-Methode-positionieren.html#extended
Angewendet auf das Listview und DragDrop kannst du damit bestimmt was anfagen:
private void listView1_DragDrop(object sender, DragEventArgs e)
{
ListViewHitTestInfo htInfo= listView1.HitTest(e.X, e.Y);
if (htInfo != null)
{
ListViewItem myItem = htInfo.Item;
}
}
Oh, da hat sich jemand eine Arbeit gemacht. Das werden dir alle .NET2.0 Entwickler danken 👍
Stichwort Events:
Du löst in Form2 bei Textbox_Changed ein Event aus, welches du z.B. Form_Textbox_Changed nennst. Dieses Event fängst du in der Klasse Form1 ab und reagierst dann entsprechend darauf, z.B. indem du die Text-Eigenschaft änderst.
Hier mal ein Beispiel: http://mrleeh.de/mrleeh/archives/58-Eventhandling-und-Erzeugen-von-Events.html
Naja, das ist wohl eine etwas kompliziertere Angelegenheit. Ich habe mich da auch mal umgetan, in dem Thread Dateien zum Löschen freigeben.
Vielleicht findest du da ja was nützliches 🙂
Ja, da gibt es ein Tool. Das nennt sich Unlocker und zeigt dir alle auf eine Datei zugreifenden Prozesse an und lässt dich diese dann auch freigeben.
Webseite: http://ccollomb.free.fr/unlocker/
Best Grüße
string s = "Ich schreibe jetzt das alte Wort in die Console";
Console.WriteLine(s);
string newstring= s.Replace("alte Wort", "neue Wort");
Console.WriteLine(newstring);
Ausgabe: Ich schreibe jetzt das neue Wort in die Console
DirectX oder eher dessen Nachfolger XNA wäre da das Beste.
Schau mal hier nach: http://www.riemers.net/eng/tutorials.php
OK, danke Norman-Timo
bin jetzt im Bilde 👍
Also wie jetzt:
ich sehe meiner Meinung nach keine Möglichkeit die Informationen im angehängten Bild mittels der AssemblyInfo.cs zu setzen. Eventuell verwendest Du andere Attribute?
Es gibt keine Lösung für das Problem? Oder waren es die falschen Attribute?
danke @ all, die Version wird gefuellt und alles ist toll
Würde gern wissen, wie das Problem gelöst werden kann, da bei mir auch keine Infos angezeigt werden. 🙂
Grüße
Geht nicht. Jedenfalls wirds den Usern keine Freude machen.
Dem muss ich widersprechen. Diese Suchfunktion hat z.B. der TotalCommander und ich finde sie sehr praktisch. Es muss allerdings gewährleistet sein, dass man nach einer oder zwei Sekunden Wartezeit den Filterbuffer automatisch leert, damit der Benutzer bei Fehleingabe schnell wieder von vorn anfangen kann.
@Masterblume: Ich würde das jeweils eingegebene Zeichen zu einem Bufferstring hinzufügen und dann den Substring für den Vergleich aus der Länge des Buffers bestimmen. Dann brauchst du aber noch einen Timer, der die automatisch den Bufferstring nach einer Sekunde ohne Eingabe löscht.
sBuffer+=e.KeyChar.ToString();
if (strValue.Substring(0, sBuffer.Length).ToUpper() == sBuffer.ToUpper())
{
dgvFondsstammdaten.Rows[i].Cells[intColumnIndex].Selected = true;
return;
}
Ich habe die Erfahrung gemacht, dass über PInvoke nur Grunddatentypen verwendet werden sollten. Also char*, int, double, ... Es gibt natürlich auch die Möglichkeit, komplexere Datentypen wie eine Struktur oder Arrays zu übergeben.
Schau mal hier: IntPtr mit Daten füllen
Aber versuch das zu umgehen, wenn es möglich ist.
@markus.bodlos,
sorry waren noch ein paar Unsauberheiten im Code, da ich ihn etwas umschreiben musste, um ihn für die Veröffentlichung zu verallgemeinern. Habe die zwei genannten Punkte korrigiert:
public MyCppWrapperClass (string sMyParameter)
{
int iObjectId = _CreateObject(sMyParameter);
if (iObjectId > -1)
{
iId = iObjectId;
}
}
public string StringProperty
{
get{return _GetStringProperty(iId);}
set{_SetStringProperty(iId, value);}
}
Hallo Sharpie,
schau dir mal mein Beispiel an: http://mrleeh.de/mrleeh/archives/146-Klassen-aus-C++-DLLs-simulieren.html
Das sagt bestimmt mehr als tausend Worte.
Wenn du die Möglichkeit hast, die C-Dll zu bearbeiten und du mit Objekten arbeiten willst, dann ist es eine gute Variante, die Objekte in der CDLL zu belassen und von C# über eine CreateObject Funktion, welche einen Objektindex zurückgibt, die Objekt in der DLL zu erzeugen. Du kannst dann über die einzelnen Funktionen, denen du als Parameter unter anderem den Objektindex übergibst, die Objekte direkt ansprechen. Wenn du dann noch eine der C++Klasse äquivalente C# Klasse erzeugst, die die Funktionen nach außen nachbildet, hast du deine Objekte in C#.
Hab ich auch schon gemacht und halte ich durchaus für einen gangbaren Weg.
Grüße
@Lucy: Vielleicht hilft dir ja das weiter:
Unterschied von Rectangular und Jagged Arrays
Wie wär' s damit:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == iColumnWithButton)
{
MessageBox.Show("Zeile " + e.RowIndex.ToString() + ", Spalte " + e.ColumnIndex.ToString());
}
}
Was es nicht alles gibt 🙂 Aber ist Nein, keine nicht das gleiche wie Abbrechen 🤔
Ich möchte gern mehrere Dateien schreiben. Ich frage vorher mit File.Exists() ab, ob jede Datei vorher bereits existiert. Wenn ja, dann soll der Standarddialog aufpoppen, der den Benutzer fragt, ob er die Datei überschreiben will, alle Dateien überschreiben will oder abbrechen will. Gibt es dafür schon einen fertigen Dialog?
Vielen Dank
Offen ist nur noch die Markierung des Ursprungs (Fadenkreuz oder so).
Wie wäre die Variante, eine neue Datenreihe mit Kreuzen einzufügen?
Danke für den coolen Tipp. Das hätte ich selber nie rausgekriegt.
Ich wundere mich nur, wie ich trotzdem vor 20 Jahren mein Mathematikstudium geschafft habe. Augenzwinkern
Sorry, wollte dir nicht zu nahe treten, aber ich war etwas verwirrt über die Aussage mit dem Ursprung, damit konnte ich nichts anfangen. Jetzt weiß ich, dass du den ersten Punkt meinst 😉
Aber wie ist das, wenn ich die DLL in das Verzeichnis legen will, wo die Anwendung liegt. Das kann sich ja verändern. Und leider darf ich für DLLImport(string Datei) keine veränderliche Zeichenfolge einsetzen. Gibts' s da ein Statement wie DLLImport(".\MeineDll.dll")?
Wozu brauchst du denn da einen Ursprung?
deltax = x2-x1
deltay = y2-y1
Da sehe ich keine Notwendigkeit für einen Ursprung. Mich interessiert aber auf jeden Fall, wie du die beiden Punkte gleichzeitig markierst. Irgendwie musst du die ja auswählen? Hast du da mal einen Snippet für?
Habe mal ein paar Beispiele für Google Chart API zusammengestellt:
http://mrleeh.de/mrleeh/archives/124-Google-Chart-API.html
@herbivore: Danke für den Link, war sehr aufschlussreich. Du meinst als Alternative zu geklonten Objekten sind structs die beste Lösung, da die ohnehin immer bei der Übergabe kopiert werden und nicht das Problem der Dreieinigkeit haben, d.h. keine Identitätsverletzung stattfindet?
Sehr guter Artikel. Der bringt endlich mal Licht ins Dunkel der ByValue und ByReference Geschichte. Da denkt man, man hat schon lange alles verstanden und auf einmal war es doch ganz anders. Vielen Dank für die Mühe.
return (Foo)this.MemberwiseClone();
MemberwiseClone sollte auch mit Vorsicht genossen werden, da bei Referenztypen auch wieder nur die Referenzen kopiert werden, die aber trotzdem noch auf das Ursprungsobjekt zeigen.
Beispiel:
class Class1: Object
{
public Class2 property;
public Class1 Clone()
{
return (Class1)this.MemberwiseClone();
}
}
void CloneExample()
{
Class1 oOriginal = new Class1();
Class2 c2 = new Class2();
oOriginal .property = c2;
Class1 oClone = o.Clone();
}
Hier wird zwar geklont, aber property von oClone ist nur wieder eine Referenz auf c2.
Der Vollständigkeit habler kannst du dann auch das ICloneable-Interface implementieren. Das sieht dann mit dem Beispiel von KleinesEichhörnchen so aus:
public class Foo: ICloneable
{
public Foo Clone()
{
return (Foo)this.MemberwiseClone();
}
}
Warum ist das Klonen von Objekten eigentlich so schlimm? Wird nicht bei jeder Funktion auch automatisch ein Klon erzeugt, wenn man nicht ref oder out benutzt?
Deutschland, ein bißchen Patriotismus muss schon sein. Und wenn sie so spielen, wie gestern, dann haben sie wirklich gute Chancen. Ich drücke die Daumen 👍