Laden...
M
MrLeeh myCSharp.de - Member
Dipl.- Ing. (FH) Deutschland Dabei seit 19.02.2008 194 Beiträge
Benutzerbeschreibung

Forenbeiträge von MrLeeh Ingesamt 194 Beiträge

18.06.2008 - 17:51 Uhr

5 Jahre VB
2 Jahre C#
1 Jahr C++

17.06.2008 - 20:42 Uhr

Lass dir mal über


Console.WriteLine(pro.ProjektBezeichnung.ToString());

alle Projektbezeichnungen ausgeben. Wenn die identisch sind, dann liegt das Problem in der Projektklasse.

17.06.2008 - 20:31 Uhr
  
for(int i = 0; i < mypro.Count; i++)  
{  
   Projekt pro = new Projekt();  
   pro = mypro.Items[i]; //Einzelne Projekt aus Projektliste holen  
   treeView1.Nodes[o].Nodes.Add(pro.ProjektBezeichnung.ToString());  
   treeView1.Nodes[0].Tag = pro.ProjektId.ToString();  
   treeView1.ExpandAll();  
}  
  

Ist klar warums nicht funktioniert: Du änderst immer den Tag von Nodes[0], obwohl Nodes[0] als dein Vaterknoten fungiert. Du musst aber das Tag von deinen neu erzeugten Knoten ändern. Versuchs mal so:


TreeNode nodNew = treeView1.Nodes[0].Nodes.Add(pro.ProjektBezeichnung.ToString());
nodNew.Tag = pro.ProjektId.ToString();

17.06.2008 - 20:17 Uhr

@herbivore: gemein ... wollte ich auch gerade schreiben 😜 🙂

@Baesler: kannst du mal den ganzen code schicken, weil so wie es jetzt da steht beschreibst du ja nur den Node[0] da kann nichts anderes bei rauskommen, als wie du es beschreibst. So wie das klingt, übergibst du an dein Tag immer die Referenz auf das gleiche Objekt.

17.06.2008 - 20:11 Uhr

Ja, ich habe auch die Erfahrung gemacht, dass Reden das allerbeste ist. Das zeigt dem anderen, dass es einem wichtig ist und man versucht, eine Lösung zu finden. Habe auch die Erfahrung gemacht, dass jegliche Art von "Taktik" schlecht funktioniert, vor allem wenn es einen schon selbst sehr beschäftigt. Das beste ist, ehrlich zu sein. Dann brauchst du dir nie Vorwürfe machen, weil du immer gesagt hast, was du denkst und sie weiß immer woran sie ist.

Ach, ist Liebe schön 🙂

14.06.2008 - 19:27 Uhr

sobald du in dieser methode:

public int CompareTo(object obj)  
        {  
            Land land = (Land)obj;  

irgendetwas anderes übergeben bekommst, gibt es eine invalidcastexception.

Genau. besser ist über


Land land = obj as Land;
if (land!=null)
{
}

zu casten. Wenn der Cast nämlich fehlschlägt bekommst du für land null zurück und kannst entsprechend drauf reagieren.
Mal ne andere Frage, du nutzt CompareTo() um die beiden Objekte auf Wertgleichheit zu überprüfen. Sollte CompareTo() nicht eher genutzt werden, um Referenzgleichheit zu ermitteln?

14.06.2008 - 17:32 Uhr

Versuchs mal mit der HitTest()-Funktion im MouseDown() Event

13.06.2008 - 01:39 Uhr

Jedes Element besitzt eine ID, die wird automatisch vergeben, wenn es als HTMLElement-Object im HtmlDocument Container dargestellt wird.

Du kannst aber das entsprechende Element auch über Bedingungen und Filter identifizieren. Zunächst handelt es sich ja um einen Link, also kannst du schon mal auf die Link-Collection zurückgreifen, einen entsprechenden Filter kann ich mir wie folgt vorstellen:


            foreach (HtmlElement el in htmlDoc.Links)
            {
                if (el.GetAttribute("Class") == "RP-view" && el.GetAttribute("onmouseover") != "" && el.NextSibling.TagName != "A")
                    break;
            }

Dann ist el genau das Element was du suchst und du kannst damit machen, was du magst.

12.06.2008 - 16:56 Uhr

über das Webbrowser-Control kannst du die einzelnen Elemente auf der Webseite direkt ansprechen.

z.B.


webBrowser.document.all[iIdOfElement].Click();
webBrowser.document.all[iIdOfElement].InnerText = "NewText";

Auf die Art und Weise kann man recht gut die Webseite automatisiert ansprechen. Habe ich gemacht, um mir automatisch Informationen von Websites zu ziehen. Der Trick ist nur, mit dem Lokalfenster, oder auch DOM-Inspector von Firefox die ID des Elements zu bekommen, das du ansprechen möchtest.

12.06.2008 - 03:02 Uhr

Soweit schon ganz richtig geparst, aber es fehlt noch das Convert.ToString():


this.brutto.Text = Convert.ToString(Double.Parse(this.stueck.Text) * Double.Parse(this.preis.Text)) + ((Double.Parse(this.stueck.Text) * Double.Parse(this.preis.Text)) * 0.19);

Sauberer wäre übrigens die Verwendung von TryParse(string s, out double result);


double dStueck = 0.0;
double dPreis = 0.0;
bool bParseSucc = Double.TryParse(this.stueck.Text, out dStueck);
bParseSucc &= Double.TryParse(this.preis.Text, out dPreis);
if (bParseSucc)
{
   this.brutto.Text = Convert.ToString(1.19 * dStueck * dPreis );
}
else
{
   MessageBox.Show("Fehler");
}

12.06.2008 - 02:54 Uhr

ZED Graph sollte genau das sein, was du brauchst. Das ist ein Open-Source-Diagramm-Steuerelement mit allen Schnörkeleien. Verschiedene Diagrammtypen, Zoom, Formatierung.

Homepage des Herstellers

Beispiel auf Codeproject

12.06.2008 - 01:50 Uhr

WebBrowser Element ist das Mittel der Wahl.
Hier kommst du bestimmt weiter.

04.06.2008 - 19:04 Uhr

Willst du einen neuen Datensatz erzeugen oder einen bestehenden verändern? Das ist ein grundlegender Unterschied. Wenn du einen neuen Datensatz erzeugen willst verwendest du INSERT, ansonsten UPDATE.
Ein ziemlich gut durchdachtes Beispiel für das Verändern von Datensätzen mit Filter nach einem Primärschlüssel (ID) findest du auf codezentrale.6x.to

Grüße

30.05.2008 - 10:32 Uhr

Problem gelöst.
Verwendet niemals AnsiString als Funktionsparameter einer DLL:


extern "C" __declspec(dllexport) int  OpenFile(AnsiString sFilename)
{
   return pDLLAccess->OpenSDAFile(sFilename);
}

Ich habe nun AnsiString durch const char* ersetzt und alles funktioniert prächtig:

extern "C" __declspec(dllexport) int  OpenSDAFile(const char *sFilename)
{
   return pDLLAccess->OpenSDAFile(sFilename);
}

Merke: Basisdatentypen für DLL-Funktionen benutzen, sonst geht' s schief.
Übrigens der Funktionsaufruf aus der C# Klasse bleibt gleich, denn string wird automatisch in const char* gemarshalt:

        [DllImport("File.dll", EntryPoint="_OpenFile",ExactSpelling=false, CallingConvention=CallingConvention.Cdecl)]
        private static extern int _OpenFile(string sFilename);
30.05.2008 - 09:11 Uhr

OK, war anscheinend auch nur sporadisch, dass das mit Application.DoEvents funktioniert hat. Jetzt kommt der Fehler auch mit der Anweisung. Da hilft auch nicht die GetError-Anweisung, die ich jetzt in der Onlinehilfe gefunden habe.
Kann es sein, dass ich die DLL erst mal laden muss, bevor ich eine Funktion ausführen kann? Hat jemand schonmal Marshal.Prelink benutzt?

29.05.2008 - 15:25 Uhr

Die Ressource ist eine C++ DLL (Borland). Ich brauche diese DLL, weil sie das Arbeiten mit einem bestimmten Dateiformat ermöglicht.

Steht die Ressource nicht zur Verfügung ?

Doch, sie steht zur Verfügung und wenn ich debugge funktioniert auch alles wunderbar.

Wenn Du -1 zurück bekommst, was bekommst Du dann von GetLastError zurück ?

Die GetLastError()-Methode funktioniert doch nur für Web-Anwendungen oder? Wie dem auch sei, dann kriege ich keinen Fehler zurück. Die -1 zeigt mir an, dass beim Öffnen etwas schief gegangen ist. Jedoch weiß ich nicht was, weil es beim debuggen nie auftritt.

Ich vermute auch mal sowas wie Bernd geschrieben hat. Anscheinend steht die DLL noch nicht zur Verfügung, aber ich kann mir nicht erklären wieso. Würde ich aber gern, weil die Ursache ja wichtig ist, um sie 100% ausschließen zu können.

29.05.2008 - 14:27 Uhr

Hallo Leute,
ich habe hier einen Fall, den ich mir nicht erklären kann. Vielleicht hat ja von euch einer schon Erfahrungen dazu.
Ich importiere mir per PInvoke eine Methode aus einer C++-Dll:


 [DllImport("MeineDLL.dll")]
 private static extern int _OpenFile([MarshalAs(UnmanagedType.AnsiBStr)]string sFilename);

Diese Methode öffnet, wie es der Name schon sagt, eine Datei und erzeugt intern ein Objekt für den Dateizugriff (Schreiben, Lesen, Schließen).

Wenn ich die importierte Funktion in C# aufrufe:

int iFileId = _OpenFile(sFilename);

kommt manchmal eine Exception: "interner Fehler in DLL aufgetreten" oder die iFileId ist -1, was einem Fehler beim Öffnen der Datei entspricht.
Jetzt kommt' s, wenn ich vor meinen Funktionsaufruf

System.Windows.Forms.Application.DoEvents();

setzte oder einen Haltepunkt setze, dann funktioniert' s.
Gibt' s dafür eine logische Erklärung? Kann ja eigentlich nur sein, dass Windows etwas zu langsam für meine ungestümen Aufrufe ist 🙂

Danke euch

28.05.2008 - 08:35 Uhr

Die Lösung würde mich auch interessieren. Kannst du das mal posten, wenn du s rausgekriegt hast?
Danke

27.05.2008 - 23:41 Uhr

Versuch mal:

    // Flush and close the output stream.
    Debug.Flush();
    Debug.Close();
27.05.2008 - 22:59 Uhr

Also, die Debug-Ausgaben werden ja bekanntlich über


Console.WriteLine("...");

gemacht.

Demzufolge erfolgt die Löschung der console über


Console.Clear();

Ganz einfach 😉

27.05.2008 - 11:24 Uhr

OK, danke für die Antwort. Musste ja mal geklärt werden 🙂
Also die Klassen in C++ handeln und über statische Funktionen und eine Id der Hostanwendung erlauben, darauf zuzugreifen.

27.05.2008 - 09:32 Uhr

Hallo Leute,
für meine Anwendung ist es nötig, dass ich eine vorhandene Borland C++ Klasse aus einer DLL in C# importiere. Ich habe im Forum noch nichts dazu gefunden und würde gern wissen, ob jemand schon Erfahrungen mit dem Thema hat.

Die C++ Klasse wurde mit folgender Anweisung über die DLL verfügbar gemacht:


#ifdef __DLL__
# define DLL_EXP __declspec(dllexport)
#else
# define DLL_EXP __declspec(dllimport)
#endif

class DLL_EXP TClass1
{
   public:
   int function1 (int iId, AnsiString sName);
   //...
}

Wie kann ich die jetzt in C# einbinden? Vermutung wäre:


[DllImport("Beispiel.dll")]
private extern class Class1;

Bin über jegliche Anregungen dankbar.
Beste Grüße

22.05.2008 - 13:43 Uhr

Ein Formular ist ein Steuerelement auf das andere Controls angeordnet werden können.

21.05.2008 - 16:53 Uhr

Du kannst auf Formularen eine bestimmte Farbe transparent darstellen lassen. Stichwort: TransparencyKey

17.05.2008 - 18:58 Uhr

Website im Hintergrund aufrufen geht über das Webbrowser Control mit Visible=false.

WebBrowser browser = new WebBrowser;
browser.visible = false;
browser.Navigate ("http://beispiel.de");

Wo zu das gut sein soll ist eine andere Frage 🙂

17.05.2008 - 11:24 Uhr

Schließe mich Herbivore an.

Wichtigstes Ereignis:

Click 

: Wird ausgelöst, sobald ein Nutzer auf diesen Button klickt.

Wichtigste Eigenschaft:

Text 

: Gibt den Text an, der auf dem Button dargestellt wird.

Funktionen, die man aufrufen kann hat das Button- Objekt keine nennenswerten.

16.05.2008 - 14:40 Uhr

auf http://www.axcis.com.au/blog/?p=8. gibt es ein Beispiel zu dem Thema
als Programm empfehle ich dir Unlocker

14.05.2008 - 21:15 Uhr

Folgende Funktion mit /unsafe compilieren


        private unsafe void Testfct(ref string sTest, ref double dTest)
        {
            char[] aTest = sTest.ToCharArray();
            fixed (double * paDblTest = &dTest){}
        }

13.05.2008 - 14:05 Uhr

wo kann ich den genau einstellen?

  • Über Projekteigenschaften kann man nun sehr bequem das Assembly mit einem StrongName versehen (vorher musste man sn.exe nehmen)

Ich wollte eher darauf hinaus, wo genau man den Strongname unter Projekteigenschaften einstellen kann. Ein Feld "Strongname" oder "starker Name" gibt' s da nämlich nicht.

13.05.2008 - 10:49 Uhr

Es geht. Habe keine Registrierung im GAC vorgenommen, sondern die DLL in das gleiche Verzeichnis wie den Client gelegt.

Der Knackpunkt war ein Update für Visual Studio:
http://support.microsoft.com/kb/908002/en-us

13.05.2008 - 10:35 Uhr

Was ist der Strongname, wo kann ich den genau einstellen?

13.05.2008 - 10:34 Uhr

Ich hatte genau das gleich Problem. Da gibt es noch einen lustigen versteckten Schalter:
Projekteigenschaften / Anwendung / Assemblyinformationen, da "Assembly COM-sichtbar machen" anklicken, dann geht' s

13.05.2008 - 10:28 Uhr

Habe versucht, die DLL mit

gacutil.exe -i Comtest.dll

zu registrieren. Da bekomme ich eine Fehlermeldung: "Fehler beim Hinzufügen der Assembly in den Cache: Es wurde versucht, eine Assembly ohne starken Namen zu installieren."

Wo kriege ich den starken Namen her?

13.05.2008 - 09:52 Uhr

Also ich habe mich jetzt mal eine bißchen mit dem Thema auseinandergesetzt und meine erste Klasse in C# geschrieben, die in COM exportiert wird.

Für das Exportieren in COM müssen noch folgende Einstellungen in den Projekteigenschaften vorgenommenwerden:

Zu beachten ist, dass auf jeden Fall der Schalter "Assembly COM-sichtbar" machen gesetzt sein muss (siehe Anhang), sonst kann man Kopfstände machen und sieht trotzdem keine Funktion in COM.

Zusätzlich muss noch "Für COM-Interop registrieren" im Reiter "Erstellen" aktiviert sein.

Meine Testklasse sieht jetzt wie folgt aus:


using System;
using System.Runtime.InteropServices;

namespace ComTest
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class Class1
    {
        public int Add(int i1, int i2)
        {
            return i1 + i2;
        }
        public int Sub(int i1, int i2)
        {
            return i1 - i2;
        }

        public string AddString(string sZeichenfolge)
        {
            return sZeichenfolge + " " + sZeichenfolge;
        }


    }
}

Ich habe nun das ganze testweise in VB6 über Verweise eingebunden. Ich sehe auch die Klasse und deren Methoden. Nur leider kommt bei der Initialisierung der Klasse ein Laufzeitfehler: 80131700 (Automatisierungsfehler). Habe ich noch irgendwas vergessen?

Grüße

08.05.2008 - 14:03 Uhr

Versuchs mal mit der CopyFile-Methode. Die nutzt die CopyFile-Funktion der Kernel32.dll ist aber ohne PInvoke verwendbar.

Eine Übersicht über die Funktion gibts hier

08.05.2008 - 13:59 Uhr

PInvoke ist eine Methode, mit der unverwalteter Code (z.B. Winapi Befehle) in verwalteten Code eingebunden werden kann. Er meint damit bestimmt, dass du einen API Befehl nutzen sollst.

Schau mal unter http://www.pinvoke.net/

08.05.2008 - 13:23 Uhr

Gibts da auch nen Code dazu? Idee:

08.05.2008 - 13:21 Uhr

Wie wäre es mit folgender Vorgehensweise? Das Navigating event wird direkt vor start der Navigation aufgerufen.

private void ieBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
   string sURL = ieBrowser.Document.ActiveElement.GetAttribute("url");
   ieBrowser.Navigate(sURL);
}

Grüße

06.05.2008 - 11:49 Uhr

OK, habe gerade noch ein bißchen im Forum gestöbert und unter anderem unter Eichhörnchens Link folgenden Webcast gefunden, der sehr aufschlussreich zu sein scheint: Webcast zum Thema Wrapper

06.05.2008 - 11:34 Uhr

Hallo Leute,

ich habe folgendes Problem: Über ein Borland C++ Programm werden DLLs geladen, die bisher ebenfalls in Borland C++ geschrieben wurden, also unmanaged Code. Diese Dlls möchte ich nun gern in C# portieren. Leider ist es mir bisher noch nicht gelungen, einen Weg zu finden, der wirklich funktioniert.

Habe die C# DLL in eine Visual C++ DLL (Wrapper) eingebunden und dann von einer Visual C++ exe (ohne CLR) aufgerufen. Das hat funktioniert. Habe ich die exe mit Borland C++ geschrieben, kommt immer folgender Fehler:

R6033- Attempt to use MSIL code from this assembly during native code initialization. It i s most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain.

Hat jemand Erfahrung damit? Mich nervt es einfach, dass es nicht möglich ist, C# DLLs für ältere Applikationen nutzbar zu machen.

Bin für jede Hilfe dankbar.
Beste Grüße

05.05.2008 - 17:11 Uhr

Stelle einmal sicher, dass du prüfst:

o.GetType() == typeof(AcpDevice)  

.

Geht auch einfacher:


Object o = AcpDevice as Object;

//Wenn Cast nicht geklappt hat, dann kommt null zurück
if (o!=null)
{
dosomething();
}

11.04.2008 - 15:04 Uhr

@svenson, danke für den Hinweis. Bin dadurch auf die richtige Fährte gekommen, denke ich. Habe mal nach NtQuerySystemInformation gegoogelt und siehe da, es gibt da eine von französischen Kollegen geschriebene CSharp Klasse, die als Wrapper dient.

Zu finden ist die auf der Seite von Axcis unter folgendem Link: http://www.axcis.com.au/blog/?p=8. Da gibt es ein Beispielprogramm um sich alle von einem bestimmten Prozess genutzten Dateien auflisten zu lassen.

Ich will es genau umgekehrt machen: alle Handles, die auf eine Datei zugreifen, auflisten und entfernen.

10.04.2008 - 08:43 Uhr

Hallo,

weiß jemand wie man Dateien trotz Zugriff durch andere Threads oder Objekte zum Löschen freigeben kann? Das Programm Unlocker verwirklicht so eine Funktion. Man kann sich anzeigen lassen, welche Programme Freigabehandles besitzen und kann diese entfernen. Habe bisher in noch keinem Forum etwas dazu gefunden.
Vielen Dank für eure Hilfe

Grüße