Laden...

Forenbeiträge von Der Zaehe Ingesamt 35 Beiträge

15.03.2009 - 23:30 Uhr

Um so besser, dass du so aktiv an diesem Vorhaben mitwirkst, Glückwunsch!

schau mal hier :
ein komplettes ebook dazu

>

Danke!

15.03.2009 - 21:20 Uhr

Hi!
Ich hab jetzt mal ne Weile selbst gesucht, was ich so zum Thema EF auftreiben kann, aber habe bis jetzt eigentlich wenig bis keine Dokumentation oder Tutorials gefunden. Hat hier vielleicht jemand ein paar gute Quellen für mich, mit denen ich mich ein bisschen einarbeiten kann?

13.03.2009 - 21:05 Uhr

So, der Datenprovider ist installiert und funktioniert bis jetzt auch wie erwartet. Jetzt sollte ich mich also ins Entity Framework einarbeiten (ich vermute mal, dass das mit EF gemeint war).
Danke für die Hilfe! Ich meld mich dann später wieder.

13.03.2009 - 19:06 Uhr

Hiho!
Ich hab das mal mit den GUI Tools von mysql.com durchgecheckt und auch gleich Zugriff erhalten. Tada! Alles in Butter. Bleibt nur noch offen, wie ich die Datenanbindung in Visual Studio bewerkstellige. Hilft mir da der Link, den ich vorher gepostet habe? Was für eine Datenrepräsentationsmodell soll ich wählen oder wie bekomme ich meine Daten am besten in ein Objektmodell? Viele Fragen ...

13.03.2009 - 18:04 Uhr

Hi,
und danke für die Antwort. Externen Zugriff sollte ich eigentlich haben, dass hab ich mit meinem Provider schon geklärt:

Angeblich besteht seit dem Umzug meines Kundenkontos auf einen anderen Server die Möglichkeit, extern auf meine DBs zuzugreifen.

Aber wie ist das mit MySQL und MSSQL? Bin ich hier richtig: http://dev.mysql.com/downloads/connector/net/5.2.html ? Leider hab ich echt keinen Plan von solche Sachen, da ich mich bisher nicht mit Datenbanksystemen beschäftigt habe und den Zugriff nur für ein sehr kleines Projekt brauche. Kann ich danach überhaupt noch mit LINQ auf die Daten zugreifen? Oder gibt es unter Verwendung von ADO.NET bessere Alternativen?

13.03.2009 - 16:07 Uhr

Hiho!
Zunächst möchte ich eines sagen: Ich kenne mich leider mit Datenbanksystemen nicht wirklich gut aus, übt daher bitte Nachsicht, wenn es um mein diesbezügliches Fachwissen geht.
Aber nun zu meinem Problem.
Sicherlich kennen etliche hier die in MS Visual Studio integrierten Funktionen, um zu Datenquellen zu verbinden. Damit kommt ich auch hervorragend zurecht, solange es nur darum geht, meinen lokalen SQL-Server anzusteuern. Für mein aktuelles Projekt brauche ich jedoch Zugriff auf eine DB, die bei meinem Webhostingprovider liegt. Logindaten, Servername und DB-Name habe ich und Zugriff über Wordpress oder phpMyAdmin besteht. Will ich jedoch mit Visual Studio oder SQL Server Managment Studio verbinden, erhalte ich eine Fehlermeldung, so oder so ähnlich:

TITEL: Verbindung mit Server herstellen

Es kann keine Verbindung mit 'server29.campusspeicher.de' hergestellt werden.


ZUSÄTZLICHE INFORMATIONEN:

Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. (provider: TCP-Provider, error: 0 - Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte.) (Microsoft SQL Server, Fehler: 10061)

Hilfe erhalten Sie durch Klicken auf:
>


SCHALTFLÄCHEN:

OK

Liegt das nun daran, dass meine Tools, die ja allesamt von MS sind, aus irgendeinem Grunde nicht kompatibel zur der Datenbankschnittstelle sind oder bedeutet das tatsächlich, dass mein Provider den Remotezugriff nicht freigegeben hat? Angeblich besteht seit dem Umzug meines Kundenkontos auf einen anderen Server die Möglichkeit, extern auf meine DBs zuzugreifen. Plz halp!

19.03.2008 - 20:47 Uhr

Ah, das Problem hat sich gelöst; GetValue und SetValue taugen doch! 🙂
Trotzdem danke für euer Bemühen, Folks!

19.03.2008 - 20:44 Uhr

Ja, doch du siehst auch gleich mein Problem:


int[,] raum2 = new int[10,10]; //erzeugt mir nur ein 2-dimensionales Array
int[,,,] raum4= new int[10,10,10,10]; //erzeugt mir nur ein 4-dimensionales Array

Ich benötige jedoch ein Array mit n Dimensionen, was durch die Art und Weise, wie Arrays deklariert werden, recht schwer gemacht wird. Ich habe das Deklarationsproblem erst einmal so gelöst:


protected object m_Values;
(...)
public FiniteGrid(byte Dimension, byte NumberOfStates, int Limit) : base(Dimension, NumberOfStates)
        {
            this.m_Limit = Limit;
            int[] limits = new int[m_Dimension];
            for (int i = 0; i < limits.Length - 1; i++)
                limits[i] = m_Limit;
            this.m_Values = Array.CreateInstance(typeof(byte), limits);
            (this.m_Values as Array).Initialize();
        }

Damit habe ich zumindest erreicht, das mein n-dimensionales Array in meinem object drinsitzt, und per Typecast komme ich auch wieder ran. Die Frage ist nur, wie ich zu einem gegeben n-Tupel von Koordinaten den Arraywert erhalte oder setzen kann.

19.03.2008 - 20:28 Uhr

Die Dokus habe ich alle längst gelesen, bevor ich hier gepostet habe, und leider keine Lösung für mein Problem gefunden, sonst wäre ich ja nun nicht hier. 😉
Das Problem besteht nicht darin, die Länge eines Arrays zu ändern, was ja kein Problem darstellt, oder mit mehrdimensionalen Arrays zu arbeiten - ebenfalls mehr als einfach, sondern eine object zu verwenden, dass zu Laufzeit auf Arrays verschiedener Dimension verweist, wobei deren Dimension erst zur Laufzeit bestimmt wird. Die Arrayklasse stellt zwar mit der Methode GetValue eine Möglichkeit zur Verfügung, aus 2- oder 3-dimensionalen Arrays nach festen Koordinaten einen Wert auszulesen, aber ich konnte keine Methode finden, die den selben Job für n-dimensionale Arrays leistet.
Wenn das zu einfach ist, um es zu erklären, bitte ich zumindest um einen Tipp, wo ich das nachlesen kann; in der MSDN-Doku und auf den verlinkten Seiten stand zumindest nichts davon.

19.03.2008 - 20:10 Uhr

Nabend!
Der Titel ist Programm: Wie rufe ich einem Wert zu bestimmten Koordinaten aus einem Array unbekannter Größe ab? Das Array ist in einem object gespeichert, so gelingt es mir zumindest, die Dimension des Arrays erst zu Laufzeit festzulegen. Wie ich dann jedoch an die Werte herankomme, weiß ich noch nicht. Irgendwelche Ideen?

Grüße,
Der Zaehe

€: Ach ja, die Koordinaten im mehrdimensionalen Array sollten idealerweise ihrerseits als eindimensionales Array, desse Länge der Dimension des mehrdimensionalem Arrays entspricht, übergeben werden. Es geht dabei um die Modellierung eines diskreten, n-dimensionalen Vektorraums, und meine Koordinaten sind ein Vektor, der an eine bestimmte Stelle zeigt, deren Wert ich gerne auslesen oder schreiben möchte.

Und bitte, bitte schreibt da was. Ich brauche das ganze ziemlich dringend, und bin für jeden Hinweis dankbar. 😉

02.07.2007 - 21:40 Uhr

Dann mal danke für die Infos! 😉 Auf die Möglichkeit der Extension Methods kann ich leider noch nicht zurückgreifen, also werde ich das wohl über eine Wrapperklasse oder eine ähnliche Lösung angehen.

02.07.2007 - 01:58 Uhr

Hallo,
der Titel verrät schon, was ich nicht hinbekomme. Ich will eine Klasse von Assembly ableiten, in der ich Assembly um eine Methode erweitere. Beim kompilieren erhalte ich oben genannten Fehler, CS0143. Wie kann ich dieses Problem lösen?

30.03.2007 - 01:50 Uhr

N'Abend,
ich stehe im Moment vor dem Problem, dass ich das Ergebnis einer etwas umfangreicheren Berechnung in einem Koordinatensysem darstellen will. Konkret geht es um eine Visualisierung der Verhulstdynamik, bei der ich Punkt für Punkt in mein Koordinatensystem zeichnen muss - ohne weiteres mehr als 100 Millionen Punkte - und ich suche nach einer Möglichkeit, das zu beschleunigen. Mein Berechnungsalgorithmus arbeitet sehr effektiv - am meisten Zeit nimmt das GUI in Anspruch. Im Moment zeichne ich mit einem Graphics-Objekt auf eine Bitmap und brauche dazu leicht mehr als zehnmal so lange wie für die Berechnung der einzelnen Koordinaten, wenn ich mit vielen Iterationsschritten rechne. Gibt es da vielleicht ein Verfahren, das Ganze unter Ausnutzung von DirectX etwas schneller zu zeichnen? Ich kenne mich auf dem Gebiet überhaupt nicht aus, deshalb frage ich hier einfach mal, vielleicht kann mir ja jemand helfen.

Danke schon mal im Voraus,
Der Zähe

15.10.2006 - 01:10 Uhr

Bei Wikipedia und google hatte ich sogar ewig lange gesucht, aber scheinbar hatte ich nen ziemliches Brett vor dem Kopf, dass ich den Inhalt nicht verstanden habe.
Ich bin jetzt soweit, dass ich mir ein Header gebaut habe, nur die Prüfsumme fehlt mir noch, damit es fertig ist. Den ensprechenden Abschnitt in der Wikipedia habe ich beim besten Willen nicht begriffen. Wie läuft das nun? Wie kann ich das praktisch umsetzen?

03.10.2006 - 20:27 Uhr

Das mag ja nett gemeint sein, aber wenn ich fähig wäre, 78 Seiten Spezifikationen zu lesen und zu verstehen, hätte ich das schon gemacht. 😠

01.10.2006 - 20:02 Uhr

Hiho,
wie bastele ich mir einen TCP-Header per Hand? Hintergrund ist, dass ich versuche, einen TCP-NAT-Traversal-Algorithmus zu implementieren, der unter anderem auch TCP-Hole-Punching verwendet. Ebendazu benötige ich ein einziges, manuell erstelltes Synpacket, das ich mit folgendem Socket versenden will:


Socket pseudo_tcp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.IP);
byte[] tcpheader = {?}

Wie genau muss jetzt das byte[] aussehen, damit es ein gültiger TCP-Header mit gesetztem Synbit ist?

Schon mal danke im voraus und nen schönen Abend noch,
Der Zaehe

10.09.2006 - 22:16 Uhr

Ok, danke erst mal! 🙂 Ich habe mir das durchgelesen und so weit ganz gut verstanden. Mal schauen, ob ichs schaffe, das bei mir zu integrieren.

10.09.2006 - 19:42 Uhr

Hiho, folgendes Problem.

Ich habe eine Klasse UdpClientExt geschrieben, die über zwei zusätzliche Methoden Start() und Stop() verfügt:


public void Start()
{
    Terminated = false;
    RcvLoop();
}

public void Stop()
{
    Terminated = true;
}


private void RcvLoop()
{
    IPEndPoint e = new IPEndPoint(IPAddress.Any, 0);
    UdpClient u = this;
    UdpReceivedEventHandler r = this.UdpReceived;
    bool t = this.Terminated;

    UdpState s = new UdpState();
    s.e = e;
    s.u = u;
    s.r = r;
    s.t = t;

    this.BeginReceive(ReceiveCallback, s);

}

public static void ReceiveCallback(IAsyncResult ar)
{
    UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
    IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;
    UdpReceivedEventHandler r = (UdpReceivedEventHandler)((UdpState)(ar.AsyncState)).r;
    Boolean t = (Boolean)((UdpState)(ar.AsyncState)).t;

    Byte[] rcvd = u.EndReceive(ar, ref e);
    if (r != null)
    {
        UdpReceivedEventArgs udp_rcvd = new UdpReceivedEventArgs(rcvd, e);
        r(udp_rcvd);
    }

    if (!t)
    {
        u.BeginReceive(ReceiveCallback, (UdpState)(ar.AsyncState));
    }
}


Wenn ich in meinem Programm einen UdpClientExt erstelle und dann einen Eventhandler übergebe, erhalte ich einen Fehler, wenn die Methode aufgerufen wird, und zwar jenen "Ungültiger threadübergreifender Vorgang", den ich im Titel schon erwähnt habe. Was mache ich da falsch? Wie kann ich den Fehler vermeiden?

Schon mal danke im voraus & MfG,
Der Zaehe

09.08.2006 - 22:04 Uhr

So, hier ist mein Problem:
Ich habe mir eine Klasse von UdpClient abegeleitet, die u.a. über zwei zusätzliche öffentliche Methoden und ein öffentliches Event verfügt. Die Methode starten und stoppen eine Empfangsschleife, das Event liefert das empfangenen byte[].


public void Start()
{
    Terminated = false;
    thread_rcv = new Thread(new ThreadStart(RcvLoop));
    thread_rcv.Start();
}

public void Stop()
{
    Terminated = true;
    thread_rcv.Abort();
}


private void RcvLoop()
{
    byte[] rcvd;
    IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
    do
    {
        rcvd = this.Receive(ref remoteEP);
        if (UDPReceived != null)
        {
            UDPReceivedEventArgs udp_rcvd = new UDPReceivedEventArgs(rcvd, remoteEP);
            UDPReceived(udp_rcvd);
        }

    } while (!Terminated);
}


So. Da UdpClient.Receive leider blockiert, wird der Thread erst dann beendet, wenn eine Datagramm empfangen wird. Bis jetzt bin ich das Problem des Beendens dadurch angegangen, dass ich ein Paket sende, das beim Empfang den Thread beenden sollte. Nicht sehr elegant, zu dem das Paket aus mir unbekannten Gründen anscheinend nie sein Ziel erreicht. Der Thread läuft weiter.
Wie soll ich also in hier meinen Thread beenden? Über Thread.Abort()?

Schon mal danke für die Hilfe,
Der Zaehe

Edit1: Ich habe es jetzt gerade mal mit Thread.Abort() versucht, allerdings wird keine ThreadAbortException ausgelöst, wie in der Hilfe versprochen. Es passiert einfach gar nichts! 🙁 Was soll ich tun?

02.06.2006 - 19:20 Uhr

Danke!
Problem gelöst, ich war mal wieder etwas zu ungeduldig. 😁

02.06.2006 - 19:08 Uhr

Hi, ich habe folgendes Problem:


FileStream f;
...
f = new FileStream(path + @"\keys\test_1024.key", FileMode.Create);

Diese Zeilen erzeugen mir immer eine DirectoryNotFoundException. Warum, zum Teufel? Ich habe doch FileMode.Create gewählt, der eigentlich eine neue Datei erstellen sollte. Ich verstehe diesen doofen Fehler echt nicht, vielleicht könnt ihr mir helfen.

Es grüßt
Der Zaehe

€dith: Uhoh, sehr dumm. Habe den Fehler gerade eben selbst gefunden, der Unterordner, in dem die Datei liegen soll, existiert nicht. Jetzt muss ich noch einen Weg suchen, Verzeichnisse zu erzeugen.

13.03.2006 - 20:46 Uhr

Leider hilft mir dieses Dokument auch nicht weiter, ich habe es selbst schon einmal gefunden, gelesen und festgestellt, das es so kompliziert ist, dass ich gar nichts mehr verstehe. 🙁
Bin gerade dabei, es noch einmal zu lesen, viellecht werde ich ja jetzt draus schlauer.

12.03.2006 - 23:09 Uhr

danke für deine antwort!

Original von Fil
Dann kannst auch gleich TCP nehmen.

jap, das hab ich jetzt auch festgestellt. 😁
ich war der meinung, das problem über udp lösen zu müssen, weil ich dachte, hole punching wäre nur per udp möglich. nun will ich probieren, das ganze über tcp anzugehen, hab aber noch ein paar verständnissprobleme.

12.03.2006 - 13:00 Uhr

Kürzlich habe ich folgendes Rezept entdeckt, um per Tcp durch einen Router zu "tunneln":

1.Client A uses its active TCP session with S to ask S for help connecting to B. 1.S replies to A with B's public and private TCP endpoints, and at the same time sends A's public and private endpoints to B. 1.From the same local TCP ports that A and B used to register with S, A and B each asynchronously make outgoing connection attempts to the other's public and private endpoints as reported by S, while simultaneously listening for incoming connections on their respective local TCP ports. 1.A and B wait for outgoing connection attempts to succeed, and/or for incoming connections to appear. If one of the outgoing connection attempts fails due to a network error such as connection reset&#39;&#39; or host unreachable,'' the host simply re-tries that connection attempt after a short delay (e.g., one second), up to an application-defind maximum timeout period. 1.When a TCP connection is made, the hosts authenticate each other to verify that they connected to the intended host. If authentication fails, the clients close that connection and continue waiting for others to succeed. The clients use the first successfully authenticated TCP stream resulting from this process.

so. wie genau läuft das nun? wie ich das verstanden hab, darf ich keinen TcpListener oder TcpClient verwenden, sondern muss einen stinknormalen Socket nehmen, den ich folgendermaßen initialisiere:


Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

Was ich nicht ganz verstandene habe ist, wie die beiden Sockets zu ihren öfffentlichen und privaten Endpunkten verbinden sollen, und das gleichzeitig, während sie zu dem noch auf eingehende Verbindungen warten.
Vielleicht kann mir ja jemand etwas Quellcode oder Pseudocode posten, dass ich den Vorgang besser begreife.

Es grüßt
Der Zaehe

10.03.2006 - 19:39 Uhr

Ist es und wenn ja, wie ist es möglich, auf einem Computer mehrere UdpClients laufen zu lassen, die jeweils Verbindung mit einem anderen Client auf anderen Computern halten, also ähnlich Tcp?
Wenn ich mehrere TcpClients habe, die auf einem Computer laufen und Verbindung mit einem Server halten, kann der Server ja auch jeden einzelnen Client identifizieren und die einzelnen Clients unterscheiden, selbst wenn mehrere unter der selben IP zu erreichen sind. Ist das mit auch mit verbindungslosem Udp möglich? Und kann ich mit einem UDP-Client auch Streams übertragen?

Oder habe ich da etwas mit dem Konzept der Sockets missverstanden?

mfg
Der Zaehe

04.03.2006 - 12:47 Uhr

Danke, genau so etwas habe ich gesucht! =)

Da tut sich noch eine neue Frage auf:
In der Schleife ist ja eine Pause von 100 ms vorgesehen, falls nichts verarbeitet werden muss. Das bedeutet aber auch, das eingehende Daten mit einer maximalen Verzögerung von 100 ms verarbeitet werden. Wie wird dieses Problem in Spielen gelöst, wo bekanntlich ein sehr hoher Ping anzustreben ist?

04.03.2006 - 11:42 Uhr

Hallo!

Ich habe angefangen, mir mit Hilfe der MSDN die Verwendung des TcpListener beizubringen und habe nun eine ganz entscheidende Frage: Wie soll ich die Endlosschleife vermeiden, die meine ganze Anwendung blockiert? Ein Vorschlag für die Realisierung eines Multi-Thread-Servers, der mehrere Clients gleichzeitig bearbeiten kann, sieht so aus:


public class ClientHandler 
{

    private TcpClient client;
    private string ID;

    public ClientHandler(TcpClient client, string ID) 
    {

        this.client = client;
        this.ID = ID;
    }

    public void Start() 
    {

        // Den Netzwerk-Stream abrufen.
        NetworkStream stream = client.GetStream();

        // Einen BinaryWriter erstellen, um in den Stream zu schreiben.
        BinaryWriter w = new BinaryWriter(stream);

        // Einen BinaryReader erstellen, um aus dem Stream zu lesen.
        BinaryReader r = new BinaryReader(stream);

        if (r.ReadString() == ClientMessages.RequestConnect) 
        {

            w.Write(ServerMessages.AcknowledgeOK);
            Console.WriteLine(ID + ": Verbindung beendet.");
            while (r.ReadString() != ClientMessages.Disconnect) {}

            Console.WriteLine(ID + ": Verbindungstrennungsanforderung empfangen.");
            w.Write(ServerMessages.Disconnect);
        }
        else 
        {
            Console.WriteLine(ID + ": Verbindung konnte nicht beendet werden.");
        }

        // Den Verbindungs-Socket schließen.
        client.Close();
        Console.WriteLine(ID + ": Verbindung geschlossen.");

        Console.ReadLine();
    }
}

public class TcpServerTest
{
    private static void Main()
    {
        // Erstellen eines neuen Listeners (Abhörer) an Anschluss 8000.
        TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 
            8000); 
        
        Console.WriteLine("Server: Initialisiere Anschluss.");
        listener.Start();
        Console.WriteLine("Server: Warte auf eingehende Verbindungsanforderungen...");
        
        int clientNum = 0;
        while (true)
        {
            try 
            {
                // Auf eingehende Verbindungsanforderung warten 
                // und einen für die Kommunikation initalisierten TcpClient zurückgeben. 

                TcpClient client = listener.AcceptTcpClient();
                Console.WriteLine("Server: Verbindung akzeptiert.");

                // Ein neues Objekt erstellen, um diese Verbindung zu bearbeiten.
                clientNum++;
                ClientHandler handler = new ClientHandler(client, "Client " +
                    clientNum.ToString());

                // Dieses Objekt in einem anderen Thread ausführen.
                Thread handlerThread = 
                    new Thread(new ThreadStart(handler.Start));
                handlerThread.IsBackground = true;
                handlerThread.Start();

                // (Sie könnten Handler und HandlerThread auch zu einer Auflistung hinzufügen,
                // um die Client-Sitzungen zu überwachen.)
            }
            catch (Exception err) 
            {
                Console.WriteLine(err.ToString());
            }
        }
    }
}

Da ich den Code leicht verändert in einem Form ausführe, nicht in der Konsole, und das Form noch "bedienbar" sein sollte, müsste ich doch auch noch die Endlosschleife zum Annehmen der Verbindungen in einen speraten Thread tun, oder?

Ich bin von Delphi zu C# "umgesiedelt", da ich gemerkt habe, dass die Sprache einfach viel mehr Möglichkeiten bietet, aber vermisse nun auch die etwas sehr viel leichter zu bedienenden TServerSocket- und TClientSocket-Komponenten, die eine Ebene höher angelegt waren, als es TcpClient und TcpListener sind.

Schon mal Danke für eure Tips! 🙂

mfg
Der Zaehe

24.02.2006 - 23:35 Uhr

hab ich jetzt auch probiert, einzeln und auch in kombination. leider tut sich nichts.

23.02.2006 - 22:04 Uhr

So, Problem Nummer 1 habe ich gelöst, der Fehler war denkbar banal: Ich hatte Width und Height statt Width-1 und Height-1 genommen.
Aber Problem Nummer 2 besteht nach wie vor, es ist, als würde er die base-Zeichenmethode gar nicht aufrufen. Macht er aber. Am Rechteck lag es übrigens auch nicht, wenn ich Linie für Linie zeichne, habe ich den selben Fehler.

23.02.2006 - 21:39 Uhr

Das ändert ja die komplette Hintergrundfarbe, was ich bräuchte ist so eine Eigenschaft wie BackGroundImage, allerdings scheint es die bei der RTB nicht zu geben. 🙁

23.02.2006 - 21:30 Uhr

Das Aufrufen meines eigenen Codes vor base.OnPaint führ dazu, das jetzt nichts mehr zu sehen ist, nur noch weiß. Gibt es noch andere Alternativen um meine gewünschten Zeichenoperationen durchzuführen?

23.02.2006 - 21:07 Uhr

Aha, danke. Jetzt funktioniert es, dafür stehe ich vor zwei weiteren Problemen 😄:
1.Da ich SetStyle(ControlStyles.UserPaint ... im Konstruktor stehen habe, ist meiner RTB natürlich noch nicht ihre endgültige Größe zugewiesen und die Zeichenoperation wird falsch ausgeführt. Wie kann ich diesen Fehler innerhalb der Klasse beheben, ohne für jede neue Instanz noch einmal die OnPaint-Methode aufrufen zu müssen? 1.Problem Nummer 2 besteht darin, dass jetzt nur noch das gezeichnet wird, was ich selber hinzufügen wollte, der Rest wird mir einfach vorenthalten. X(

Meine Klasse sieht im Moment so aus:


public class BCRichTextBox : RichTextBox
{
    private Pen p = new Pen(Color.FromArgb(147, 147, 147));

    public BCRichTextBox() : base()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.DrawRectangle(p, 0, 0, Width, Height);
    }
}


23.02.2006 - 20:39 Uhr

Ich hab jetzt auf dein Anraten hin beides probiert, war aber leider erfolglos. Meine eigene RichTextBox sieht immer noch so aus wie eine ganz normale.
Danke übrigens für den Tip mit "direkt auf das Form ziehen". 🙂 Da ich von Delphi zu C# migriert bin, habe ich überhaupt nicht gewusst, dass so etwas überhaupt geht, ohne die Komponente mehr oder weniger per Hand in die IDE einzubinden.

23.02.2006 - 20:24 Uhr

danke für die schnelle antwort 🙂

leider hat es nicht funktioniert und auch der Debugger meint, der Code würde gar nicht erst ausgeführt werden ... .

23.02.2006 - 19:58 Uhr

Für ein im Design speziell angepasstes Form habe ich mir die RichTextBox abgeleitet, die neue Klasse sieht so aus:


using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace BoldChat
{
    public class BCRichTextBox : RichTextBox
    {
        private Pen p = new Pen(Color.FromArgb(147, 147, 147));

        public BCRichTextBox() : base()
        {
            this.Paint += new PaintEventHandler(DrawBackGround);
        }

        private void DrawBackGround(Object sender, PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(p, 0, 0, Width, Height);
        }
    }
}

Dann hab ich mir im Designer eine normale RichTextBox erstellt und die entsprechenden Deklarationen angepasst, so dass jetzt eine meiner eigenen RTB-Klasse erstellt wird. Wenn ich mein Programm ausführe, kann ich jedoch keinen Unterschied erkennen. Ein Haltepunkt in der Zeile e.Graphics.bla usw. ergab, dass der Code gar nie ausgeführt wird. Was mach ich falsch?

mfg
Der Zaehe