Laden...
S
Benutzerbeschreibung

Forenbeiträge von SkySurfer Ingesamt 298 Beiträge

04.03.2008 - 17:12 Uhr

Hi,

ich hab ein Countdown Control geschreiben. Und eine interessante Beobachtung gemacht: Wärend es auf meinem Entwicklungsrechner mit Win2k in Sekundenschritten wie vorgesehen herunterzählt, legt der Countdown auf Rechnern mit XP manchmal den eilgang ein und zählt in 2 Sekunden schritten jede Sekunde runter -> er läuft also nur halb so lang.

Verwende als Zeitquelle eine System.Windows.Forms.Timer der eigentlich richtig zählen sollte.

Hat diese Phänomen schon mal jemand beobachtet? Gibt es hier einen Fix?

Gruß SkySurfer

02.03.2008 - 16:33 Uhr

hab die beide auch noch überschrieben und ein breakpoint in alle 3 methoden gesetzt.
aber die werden nie erreicht.

02.03.2008 - 16:21 Uhr

Hab zum testen die GetEditStyle Methode überschrieben und den Rückgabewert mal auf Modal und auch auf None gesetzt ohne das sich was ändern würde.

02.03.2008 - 16:01 Uhr

Hab mir überlegt ein eingen Editor dafür zu erstellen..

hab dazu eine class AttributeEditor : UITypeEditor gemacht.

und der AttributeCollection diese als Editor zugeordnet


[Editor(typeof(AttributeEditor),typeof(AttributeEditor))]
class AttributeCollection : INotifyPropertyChanged
{... }

bekomme aber trotzdem den Standardeditor angezeigt.
Woran kann das liegen?

Gruß SkySurfer

01.03.2008 - 20:03 Uhr

Ok habs jetzt hinbekommen wird nicht mehr hinzugefügt.

Gibt es eine Möglichkeit eine Ausgabe an den Benutzer zu machen ?

01.03.2008 - 18:45 Uhr

Ah ok so überprüft er es zwar, aber meine Exception wird abgefangen und er fügt das Attribute trotzdem ein. Wie kann ich hier eine Meldung bringen, dass der Name nicht bereits existieren darf?

01.03.2008 - 17:51 Uhr

Die Add Methode ist in der class AttributeCollection : System.Collections.CollectionBase , INotifyPropertyChanged

01.03.2008 - 17:36 Uhr

Hab ne eigene Collection mit INotifyPropertyChanged gemacht und das funktioniert soweit ganz gut..

Habe jetzt nur noch das Problem. dass ich in der Collection keine Einträge mit selben Namen haben möchte.

Hab die Add Methode wie folgt modifiziert :


 public void Add(Attribute attribute)
        {
            if (GetIndexByName(attribute.Name) == -1)
            {
                List.Add(attribute);
            }
            else
            {
                throw new Exception("Attribute already in list");
            }

        }

        private int GetIndexByName(string name)
        {
            for(int i = 0; i < List.Count; i++)
            {
                if (((Attribute)List[i]).Name == name)
                    return i;
            }
            return -1;
        }

es scheint jedoch, als ob sie beim hinzufügen des neuen Attributes garnicht verwendet wird. Gibt es noch andere Wege das sicher zu stellen?

Gruß SkySurfer

28.02.2008 - 16:21 Uhr

Also alten Thread ingnorieren und einen neuen erzeugen ?

28.02.2008 - 16:03 Uhr

Habe die ganze Interaction jetzt in einen eigenen Thread ausgelagert.
Funktioniert soweit ganz gut. Lasse mir auch eine Exception werfen wenn der COM Thread nicht mehr reagiert.

Doch wenn der COM-Thread durch den hängenden COM-Server blockiert ist kann ich den Thread auch nicht mehr mit t.abort() abgebrochen werden.

Habe versucht den COM-Server mit kill zu beenden, scheint er auch zu machen doch danach hängt dann die ganze Anwendung. Vermutlich weil es noch ein Lock zwischen COM-Thread und COM-Server gibt ?

Gibt es eine andere Möglichkeit den COM-Thread abzubrechen ?

MfG
SkySurfer

25.02.2008 - 12:00 Uhr

Nur um Unklarheiten zu beseitigen :
Der COM(Component Object Model)-Server ist ein Programm eines anderen Herstellers das auf dem selben Rechner läuft wie meine Anwendung.

25.02.2008 - 11:47 Uhr

Hi,

ich verwende ein Propertygrid in dem unter anderem einige Attribute als eine Auflistung dargestellt sind. Wenn ich Eigenschaften direkt im Propertygrid ändere bekomme ich ein PropertyChanged Event. Wenn ich jedoch die Attribute in einer Auflistung ändere bekomme ich kein PropertyChanged. Wie kann ich mitbekommen, wann die Attribute einer Auflistung geändert worden sind? Gibt es hier noch andere EventHandler für oder muss ich das über ein Event in meiner Datenklasse machen, das ausgelöst wird wenn sich deren Daten ändern.

Gruß SkySurfer

25.02.2008 - 11:41 Uhr

Hi,

ich habe folgendes Problem:

mein Programm soll sich mit einem COM-Server via Interop agieren. Das Problem ist jedoch, dass der COM-Server nicht so stabil läuft und wenn der Server mal keine Rückmeldung mehr gibt (sich aufgehangen hat), blockiert es auch mein Programm.

Nun suche ich eine Lösung wie meine Anwendung erkennen kann ob der COM-Server noch reagiert und falls er es nicht mehr tut ihn dann zu killen und neu zu starten.

Bis jetzt bin ich auf 2 Ideen gekommen:

Für jede Interaktion mit dem COM-Server eine neue Verbindung herstellen die Aktion ausführen und danach wieder die Verbindung schließen. Klappt der Verbindungsaufbau nicht, ist der Server tot. Sollte er erst während der Aktion hängen bleiben müsste man die Funktion noch mit einem Timeout versehen..

Nachteil jedesmal die Verbindung aufbauen kostet Zeit.

Zweite Idee einen Thread als eine Art Interface dazwischen zu schalten. So das der Thread die Verbindung zum COM-Server herstellt und die Aktionen ausführt. Die von der Hauptanwendung dann nur angestoßen werden und nach Abarbeitung das Ergebnis abholt. Bekommt man vom Thread keine Antwort mehr diesen killen und einen neuen erzeugen der wieder den Server startet und erneut eine Verbindung herstellt.

Nachteil hier wäre der hohe Aufwand für die Kommunikation zwischen den Threads.

Hat noch jemand eine bessere Idee ?

Gruß SkySurfer

15.02.2008 - 15:40 Uhr

=) thx das wars

naja manchmal sieht man den wald vor lauter bäumen nicht ... wird einfach zeit fürn feierabend.

15.02.2008 - 15:05 Uhr

Hi,

ich hab ein UserControl geschrieben und möchte sein Wert über ApplicationSettings persistent machen. Hab die Property also zu meinen ApplicationSettings hinzugefügt und sie werden auch geladen. Jedoch wenn ich den Wert ändere wird er nicht in die ApplicationSettings übernommen.

Die Property ist [Bindable(true)] muss noch mehr gemacht werden?

Gruß
SkySurfer

07.12.2007 - 14:02 Uhr

Hi,

ich habe ein paar Methoden die eine Datei zeilenweise verarbeiten diese bekommen einen ref von einem Streamreader übergeben.
Die Methoden sollen nun die nächste Zeile auf dem Stream mit ReadLine() lesen, prüfen ob die Zeile für sie bestimmt ist und wenn dies nicht der Fall ist Position im Stream wieder zurücksetzen.


public bool read(ref StreamReader sr)
        {
            long pos = sr.BaseStream.Position;
            string line = sr.ReadLine();

            // check if its my node
            if (!line.Contains("Background {"))
            {
                sr.BaseStream.Position = pos;
                return false;
            }
        }

Jedoch ist sr.BaseStream.Position immer 1024 egal bei welchem Durchlauf.

Hat jemand eine Idee woran es liegen könnte ?

Gruß SkySurfer

12.11.2007 - 17:16 Uhr

Hi,

ich habe eine Basis Klasse mit einer leeren Virtual Methode und 2 abgeleitete Klassen die diese Virtual Methode überschreiben. Objekte der einen abgeleiteten Klassen rufen die überschriebene Methode der abgeleiteten Klasse auf. Bei der anderen lande ich immer in der Funktion der Basisklasse. Woran kann das liegen?

Hier meine Klassen :


    class TestObject
    {
        #region Properties
        ...
        #endregion

        public SortedDictionary<int, TestObject> ChildList = new SortedDictionary<int,TestObject>();
        public virtual void SetProperties(XmlNode xn)
        {
        }
    }

 class TestItem : TestObject
    {
        #region Properties
        ...   
        #endregion

        public TestItem()
        { }

        public override void SetProperties(XmlNode xn)
        {
           // Fill Object from XML 
           ...
        }    
    }

    class TestMessage : TestObject
    {
    
        #region Properties
	...
        #endregion
	
        public TestMessage()
        { }

        public override void SetProperties(XmlNode xn)
        {
            // Fill Object from XML   
            ...
        }
    }

15.10.2007 - 13:33 Uhr

Problem hat sich gelöst: Es lag am COM Server der nicht schnell genug reagiert hat.

15.10.2007 - 10:52 Uhr

Das anstoßen der Funktion funktioniert, da man die Reaktionen der anderen Anwendung sieht 😉

Ich hab nur eine Instanz des COM Objects erzeugt. Deshalb dürfe es auch nur eine geben, oder wird die von einem Delegaten gecloned ?

15.10.2007 - 10:37 Uhr

Hi,

ich habe ein Programm geschrieben, das ein anderes Programm über dessen COM Server steuert.
Da einige Aufrufe länger brauchen rufe ich sie über ein Delegaten und mit BeginInvoke auf um ein einfrieren der GUI zu verhindern.
Die aufgerufene Funktion des COM Objects liefert auch keine Rückgabe, so habe ich auf das EndInvoke verzichte.
Der Status des des angestoßenen Vorgangs lässt sich über die IsRunning Eigenschaft des COM Objects abrufen.
Das Problem ist nun, wenn ich den Vorgang asynchron starte hat das COM Object im Hauptthread den IsRunning Status false obwohl der Vorgang läuft.
Woran kann das liegen ? Wie lässt sich das beheben?

Gruß SkySurfer

27.09.2007 - 16:05 Uhr

Hab mit das DateTimePicker in nem UserControl jetzt umgestrickt ...

Hab ihm eine Property vom Typ DateTime gegeben die ich im Usercontrol initialisiere.
Allerdings meint der Desiger von Visual Studio er müsse dem Teil auch unbedingt einen Wert zuweisen, den vom Zeitpunkt der letzten Formänderung.
Kann ich das irgendwie unterbinden ?

Gruß SkySurfer

27.09.2007 - 10:51 Uhr

Hi,

ich bin auf der suche nach einen freien TimeUpDown Control.
Kennt zufällig jemand eins das er empfehlen kann ?

Gruß SkySurfer

25.09.2007 - 15:50 Uhr

Hi,

ich hab ein UserControl erstellt, das vielfach in einem Formular verwendet wird.
Diese sollen gesperrt werden können. Um nun nicht alle nach einander ansprechen zu müssen hatte ich die Idee eine static Property zu erzeugen die alle UserControls aktiviert / deaktivert.

Gibt es eine Möglichkeit aus der static Property auf die nicht static Steuerelemente des Controls zuzugreifen?

Gruß SkySurfer

24.09.2007 - 15:25 Uhr

War ein Fehler im DataTable...

Jetzt hab ich noch folgendes Problem:

Ich möchte einen Event haben der ausgelöst wird, wenn eine Checkbox an oder abgewählt wird.

Nehme dafür das CellValueChanged Event vom DataGridView und prüfe ob die geänderte Eingabe aus der Checkboxspalte kommt. Funktioniert auch wenn man die Eingaben per Tastatur sprich Leertaste und Enter macht.
Wenn man die Checkbox jedoch mit der Maus setzt wird das Event erst ausgelößt wenn man eine andere Checkbox anklickt.

Wie kann ich das umgehen ?

Gruß SkySurfer

24.09.2007 - 11:02 Uhr

Hi,

ich hab ein DataGridView mit 2 Spalten colCheck und colVersion. Dazu habe ich ein passendes DataSet dsVersion erstellt mit dem DataTable dtVersion der die 2 DataColumns dcCheck(bool) und dcVersion(string) hat.

Nun habe ich das DataGridView als DataSource mein dsVersion zugeordnet und dann colCheck.DataPropertyName dcCheck zugewiesen. Das gleich bei colVersion und dcVersion.

Wenn ich jedoch ein dtVersion.Rows.Add(false, "Version 1"); mache werden im DataGridView keine Daten angezeigt.

Woran kann das liegen? Muss man das DataGridView noch zu einem Update oder ähnlichem bewegen?

Gruß SkySurfer

20.09.2007 - 15:03 Uhr

Hi,

ja so hab ich es mittlerweile auch gemacht.

Hab jedoch noch ein Problem:

Um zu verhindern, dass eine Funktion des COM Servers aufgerufen wird wenn keine Verbindung zum Server besteht habe ich um jede Wrapperfunktion eine


if (isConnected())
{
   // wrapped COM Function 
}

isConnected() sieht so aus :


private bool isConnected()
{
     try
     {
        if (TestCompleteObject != null)
        {
            return true;
        }
        else
        {
            return false;
         }
     }
     catch
     {
           return false;
     }
}

Funktioniert auch gut im normalen Betrieb.

Wenn jedoch der COM Server zuerst beendet wird oder absützt bekomme ich bei der Funktion isConnected() eine Exception :

System.Runtime.InteropServices.COMException (0x800706BA): Der RPC-Server ist nicht verfügbar. (Ausnahme von HRESULT: 0x800706BA)

Wieso wird die Exception nicht vom try / catch gefangen ? Gibt es noch andere Möglichkeiten zu prüfen ob der COM Server noch läuft und nicht hängt oder abgestürzt / beendet ist ?

Gruß SkySurfer

05.09.2007 - 09:34 Uhr

Hi,

ich hab bis jetzt noch nicht so viel mit COM Interop gearbeitet deshalb vielleicht ne blöde Frage:

Ich sollte mich mit dem OLE Server eines anderen Programms verbinden um dieses zu steuern. Der Hersteller hat auch folgenden Code mitgeliefert :


// Add the following lines to your unit
using System.Runtime.InteropServices;
using TestComplete;
 
...
 
public class Form1 : System.Windows.Forms.Form
{
  
  // Defines functions needed to obtain a reference to TestComplete
  [DllImport("Ole32.dll", PreserveSig = false, EntryPoint = "CoCreateInstance")]
  [return: MarshalAs(UnmanagedType.IUnknown)]
  private static extern object CoCreateInstance([In] ref Guid clsid, [MarshalAs(UnmanagedType.IUnknown)] Object punkOuter, int context, [In] ref Guid iid);
  
  [DllImport("ole32.dll", PreserveSig = false)]
  private static extern void CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] string progId, out Guid clsid);
  
  [DllImport("oleaut32.dll", PreserveSig = false, EntryPoint = "GetActiveObject")]
  [return: MarshalAs(UnmanagedType.IUnknown)]
  private static extern object GetActiveObject([In] ref Guid clsid, int reserved);
  
  // Defines helper constants
  private const int INPROC_SERVER = 1;
  private const int LOCAL_SERVER = 4;
  
  private void TestFunc()
  {
    Guid IID_TestComplete = new Guid("148F5A09-EB10-48f9-8229-44D9B6D62007"); 
    object TestCompleteObject = null;
  
    // Obtains TestComplete's guid
    System.Guid TCGuid;
    CLSIDFromProgID("TestComplete.TestCompleteApplication.5", out TCGuid);
  
    // Obtains access to TestComplete
    try
    {
      TestCompleteObject = GetActiveObject(ref TCGuid, 0);
    }
    catch
    {
      try
      {
        TestCompleteObject = CoCreateInstance(ref TCGuid, null, INPROC_SERVER | LOCAL_SERVER, ref IID_TestComplete);
      }
      catch
      {
      }
    }
  
    if (TestCompleteObject == null) return;
    
    // Obtains ITestCompleteCOMManager
    TestComplete.ITestCompleteCOMManager TestCompleteManager = (TestComplete.ITestCompleteCOMManager) TestCompleteObject;
    // Obtains Integration object
    TestComplete.ItcIntegration IntegrationObject = TestCompleteManager.Integration;
  
    // We have a reference to the integration object.
    // Now we can use its methods and properties to automate TestComplete.
  
    // Loads the project suite
    IntegrationObject.OpenProjectSuite("C:\\Program Files\\Automated QA\\TestComplete 5\\Samples\\Scripts\\Test Log\\TestLog.pjs");
  
    if (! IntegrationObject.IsProjectSuiteOpened())
    {
      System.Windows.Forms.MessageBox.Show("The project suite was not opened.");
      return;
    }
  
    try
    {
      // Runs the test
      IntegrationObject.RunProject("TestLog_VBScript");
  
      // Waits until testing is over
      while (IntegrationObject.IsRunning())
        Application.DoEvents();
  
      // Check the results
      switch(IntegrationObject.GetLastResultDescription().Status)
      {
        case TestComplete.TC_LOG_STATUS.lsOk : 
            System.Windows.Forms.MessageBox.Show("The test run finished successfully."); 
            break;
        case TestComplete.TC_LOG_STATUS.lsWarning : 
            System.Windows.Forms.MessageBox.Show("Warning messages were posted to the test log."); 
            break;
        case TestComplete.TC_LOG_STATUS.lsError :
            System.Windows.Forms.MessageBox.Show("Error messages were posted to the test log."); 
            break;
      }
    }
    catch(System.Runtime.InteropServices.COMException ex)
    {
      System.Windows.Forms.MessageBox.Show("An exception occurred: " + ex.Message); 
    }
    finally
    {
      // Closes TestComplete
      TestCompleteManager.Quit();
      // Releases COM objects 
      Marshal.ReleaseComObject(IntegrationObject);
      Marshal.ReleaseComObject(TestCompleteManager);
      Marshal.ReleaseComObject(TestCompleteObject); 
    }
}

Ist es möglich diese COM Objekt auch ohne API Aufrufe einzubinden und Sie auch ohne try / catch / finally block "sicher" verwenden zu können.

Gruß SkySurfer

13.06.2007 - 23:00 Uhr

Danke für die Tipps doch leider noch nicht ganz das was ich suche.

Ich müsste da die Bilder per drag & drop reinziehen können und die Texte sollten frei positionierbar und editierbar sein

13.06.2007 - 16:46 Uhr

Hi,

ich soll ein Editor schreiben in dem man Texte und Bilder auf einem Hintergrundbild positionieren kann und es anschließend als jpg speichern. Was würdet ihr da als Basiselement nehmen bzw. gibt es schon eine Komponente die ich verwenden könnte?

Gruß SkySurfer

23.02.2007 - 13:47 Uhr

Ahh... naja manchmal sind es eben die einfachen Dinge die man gern übersieht.

Danke!

23.02.2007 - 13:01 Uhr

sollte eigentlich egal sein:

**ListViewItem-Konstruktor (String[]) **
Initialisiert eine neue Instanz der ListViewItem-Klasse mit einem Array von Zeichenfolgen, die Unterelemente darstellen.

aber auch so passiert das selbe:


                string[] error = getTokens(line);



                ListViewItem item = new ListViewItem();
                item.Text = error[0];
                item.SubItems.Add(error[1]);
                item.SubItems.Add(error[2]);
                item.SubItems.Add(error[3]);
                item.SubItems.Add(error[4]);
                item.SubItems.Add(error[5]);

23.02.2007 - 12:15 Uhr

Es werden keine aktiven Scrollbars eingeblendet, deshalb denke ich nicht, dass es an der größe liegt.

Hier der Code:


string[] error = getTokens(line);

ListViewItem item = new ListViewItem(error);

if (error[0].Contains("warning"))
  item.StateImageIndex = 0;
else
  item.StateImageIndex = 1;

listViewErrorList.Items.Add(item);

23.02.2007 - 11:26 Uhr

Hi,

ich hab eine ListView mit 6 vorkonfigurierten Spalten Wenn ich nun ein ListViewElement aus einem StringArray mit 6 Werten erzeuge und es der ListView hinzufüge verschwinden plötzlich die vorkonfigurierten Spalten aus der Detailansicht und es wird nur noch ein grauer eingelassener Balken angezeigt.

In den anderen Ansicht werden die Einträge aber richtig dargestellt.

Woran kann das liegen?

Gruß SkySurfer

18.02.2007 - 14:08 Uhr

Hi,

also aus meiner Sicht kann er immer nur in einen Zweig laufen entweder braucht er ein invoke und handelt es dort ab oder er braucht keins und führt es im 2. aus. Oder gibt es Fälle wo beides auftreten kann?

18.02.2007 - 13:10 Uhr

Hi,

ich hab 2 Textboxen, auf die über ein Thread zugegriffen wird um diese zu füllen.
Ich hätte jetzt gern, dass die TextBox mit scrollt wenn der Text zu groß wird.
Sollte ja mit ScrollToCaret funktionieren?

Leider tut sich nichts.

Hier mein Code:


delegate void OutputUpdateDelegate(string output, TextBox box);

private void OutputUpdateCallback(string data, TextBox box)
{
     box.Text += data;
     box.ScrollToCaret();            
}


Aufgerufen wird es über :


        public void AddErrorOutput(string output)
        {
            if (textBoxErrorOutput.InvokeRequired)
            {
                textBoxErrorOutput.Invoke(new OutputUpdateDelegate(OutputUpdateCallback), new object[] { output, textBoxErrorOutput });
            }
            else
            {
                textBoxErrorOutput.Text += output;
                textBoxErrorOutput.ScrollToCaret();
            }
        }

Hat jemand ne Idee wieso es nicht geht?

Gruß SykSurfer

16.01.2007 - 12:11 Uhr

Die deutsche MSDN is das leider etwas unglücklich formuliert:

"Beginnt den asynchronen Datenempfang aus dem verbundenen Socket."

Ich werds mal versuchen.

16.01.2007 - 11:03 Uhr

Also wenn ich es als Event übertrage und im GUI Thread mit invoke behandele funktionierts.

Hab jetzt aber festgestellt, dass er nur das erste Paket empfängt und jedes weitere dann ignoriert.

Verarbeitet BeginReceive(...) nur die nächste ankommende Nachricht, sprich muss ich es in einr schleife laufen lassen?

16.01.2007 - 08:17 Uhr

Ich wollte das Byte Array als public get methode bereitstellen und ein Event auslösen wenn neue Daten verfügbar sind. Die Methode mit Invoke kenne ich funktioniert aber wie gesagt nur im GUI Thread. Bei mir handelt es sich aber um eine Bibliothek. Da bin ich leider noch nicht so richtig fündig geworden.

15.01.2007 - 19:34 Uhr

Hi,

ich versuche eine Klasse zu schreiben, die UDP-Pakete annimmt.
Mein Ansatz bis jetzt:


public void Listen()
{
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint ipEP = new IPEndPoint(IPAddress.Any, _port);
            socket.Bind(ipEP);

            StateObject state = new StateObject();
            state.workSocket = socket;

            socket.BeginReceive(state.buffer, SocketFlags.None, new AsyncCallback(ReceiveCallback), state);

}

private void ReveiveCallback(IAsyncResult ar)
        {
            StateObject state = (StateObject)ar.AsyncState;
            Socket socket = state.workSocket;
            int readBytes = socket.EndReceive(ar);

            if (bytesRead > 0)
            {
                // state.buffer threadsicher der anwendung bereitstellen
            }
}

Wie bekomme ich state.buffer threadsicher an mein Hauptprogramm übergeben? Hatte es erst per Event versucht aber bekomme eine Fehlermeldung.
Wie könnte man es noch machen?

Gruß SkySurfer

11.01.2007 - 16:04 Uhr

Hi,

ich hab eine MDI Anwendung und würde gern den Toolstrip des Child MDI in den des Parent MDI einbinden. Hab die MergeAction auf Append gesetzt und MergeIndex entsprechende werte gegeben. Bei Menüeinträgen funktionierts beim Toolstrip jedoch nicht.

Muss man hier noch etwas beachten?

Gruß SkySurfer

09.01.2007 - 12:40 Uhr

Hi,

ich hab mal ne Lösung gesehen, in für jede Sprache nur eine Resourcedatei angelegt war in der dann alle Texte, Bilder ... in der entsprechenden Sprache gespeichert waren. Das Programm hatte eine Funktion wo man die gewünschte Resource und die Sprache übergeben hat und bekamm dann den entsprechenden Inhalt aus der entsprechenden Resourcedatei.

Ich fand die Lösung nicht schlecht ich weiß nur nicht ob es arg performant ist, wenn man jeden Text usw jedesmal aus einer Resourcedatei liest.

Gruß SkySurfer

05.01.2007 - 21:55 Uhr

Bei nochmaligem darüber nachdenken macht


startPosition = base.Text.LastIndexOf(" ", endPosition - 1 , endPosition - lineOffset );

mehr Sinn.

Danke für den Anstoß!

05.01.2007 - 14:45 Uhr

Hi,

ich hab irgendwie ein Problem mit String.LastIndexOf, dass nach dem letzten Leerzeichen suchen soll.

Ich möchte damit das letze Wort hinterdem Cursor im Texteditor ausfiltern.

Hier mein Code:


             string token = string.Empty; //Letzes Wort direkt hinter dem Cursor
            int startPosition = -1;
            
            int endPosition = base.ActiveTextAreaControl.TextArea.Caret.Offset; //CursorPosition 
            int line = base.ActiveTextAreaControl.TextArea.Caret.Line;
            int lineOffset = base.ActiveTextAreaControl.Document.PositionToOffset(new Point(0, line)); //Index des ersten Zeichens in der Zeile

            if (endPosition > lineOffset)
            {
                startPosition = base.Text.LastIndexOf(" ", endPosition - 1 , lineOffset );
                if (startPosition == -1)
                {
                    token = base.Text.Substring(lineOffset, endPosition- lineOffset);
                }
                else
                {
                    token = base.Text.Substring(startPosition, endPosition - startPosition);
                }
            }

Hat jemand ne Idee wieso startPosition immer -1 zurück liefert?

04.01.2007 - 13:53 Uhr

Hab mal was in nem Beispiel gesehen, da wurde das aber über die Windows API unterbunden und das ist wohl nciht ganz im Sinne von C#.

Gruß SkySurfer

04.01.2007 - 13:49 Uhr

Ich hab rausgefunden, dass mein ZoomChanged Event schneller ausgelößt wird, als der ZoomFactor durch die RTB geändert wird und somit die Zeilennummern dann noch mit alten Werten berechnet werden.

Gibt es eine Möglichkeit das Event auszulösen, wenn die RTB den Wert für ZoomFactor geändert hat?

Ein Override der Get und Set Methode von ZoomFactor wird wohl nichts bringen?

04.01.2007 - 12:11 Uhr

Hi,

ich hatte mal ein ähnliches Problem.

Ich hab den Ladevorgang der Seite dann in einen extra Thread gepackt dann war
das einfrieren weg.

Gruß SkySurfer

04.01.2007 - 10:54 Uhr

Hi,

ich hab eine RichTextBox in meinem UserControl und will sie mit Zeilennummern erweitern.

Hab also ein Label vor die RTB gemacht, dass bei irgendwelchen Änderungen in der RTB die Zeilennummern aktualisiert. Funktioniert soweit ganz gut nur beim Zoomen verzieht sich alles. Ich weise dem Label immer die selbe Schriftart wie der RTB zu.
Die Schriftgröße des Labels berechne ich mit RTB.Schriftgröße * RTB.ZommFactor.

Passt dann zwar bei manchen Zoomfaktoren jedoch nicht bei allen.

Weiß jemand nach welchem Schema die RTB den gezoomten Text darstellt?

Gruß SkySurfer

18.12.2006 - 22:37 Uhr

Hi,

ich hab ne RichTextBox erweitert und will mit dem OnKeyPress Event die Entertaste abfangen.
Wenn ich das \r abfange und e.Handeld = true; setze macht er mir trotzdem noch ein \n in die RTB. Auch der versuch ein nachfolgendes \n zu irgnorieren schlägt fehl.

Wie kann ich das sonst noch lösen?

Hier der Code:


protected override void OnKeyPress(KeyPressEventArgs e)
{
    bool ignoreNextN = false;
    if (e.KeyChar == '\r')
            {
                this.Text = this.Text.Insert(this.SelectionStart, "\n" + tabs);
                this.SelectionStart = oldPos + 1 + level;
                ignoreNextN = true;
                e.Handled = true;
            }
            else if (e.KeyChar == '\n')
            {
                if (ignoreNextN)
                {
                    ignoreNextN = false;
                    e.Handled = true;
                }
            }
            else
                base.OnKeyPress(e);
}
15.12.2006 - 14:41 Uhr

Ja bin ich,

Cursor ist in Zeile 2 line liefert 1 zurück kann man also direkt mit dem Array, dass dann Werte für 0 und 1 hat, verwenden. Und dennocht kommts zur Fehlermeldung.