[VB.Net] Highlighting, Sortieralgorithmus

L

luckerking

Hallo zusammen,
ich arbeite im Moment immernoch an meinen eigen Editor.
Aus Performence gründen hab ich meinen damaligen Code komplett umgeschrieben und versucht zu Optimieren.
Ich hab jetzt mal ein paar Tests durchgeführt und festgestellt, das ein großer Performence-Fresser das einfache farbige makieren ist.
Bisher mache ist das mit dieser Methode
Code:
 Private Sub HighlightText(ByVal StartPos As Long, ByVal PosEnd As Long)
        codebox.SelectionStart = StartPos
        codebox.SelectionLength = PosEnd - StartPos
        codebox(selCodeBox).SelectionColor = Color.Blue
    End Sub
Gibt es dazu Alternativen, den diese Methode braucht ca. 30 % der ganzen Zeit und die Prozentzahl wächst stetig, wenn mehr zum Makieren dazu kommt.

Bis jetzt habe ich als Suchalgorithmus Regexe verwendet( weil das so schön automatisch sortiert ist), doch jetzt denke ich, dass dies auch wieder verschenkte Performence ist.
Ich denke der Suchalgorithmus stellt für mich kein Problem da.
Da ich aber die gefundenen Stellen in einer Klasse speicher möchte, habe ich etwas Probleme mit dem Sortieren.
Ich kenne zwar gedanklich die QuickSort Methode, nur wäre es für mich ziemlich einfacher, wenn ich ein Beispiel (natürlich in VB 05) dafür hätte.


Ich hoffe ich habe mein Problem ausreichend erklärt.

Gruß MroccoT


Edit: Achja es wäre auch schön, wenn man nicht nur die Farbe angeben kann, sondern auch die Schriftart, dies ist aber nicht so wichtig.
 
Zuletzt bearbeitet von einem Moderator:
Noch ein paar Fragen:

Ich möchte einem Konstruktor eine Struktur übergeben.
Nur sagt er leider dann, das er die Struktur nicht außerhalb des Projektes über die Classe verfügbar machen kann (Keine Ahnung, was das bedeuten soll ...).
Eigentlich wollte ich nur ein paar Variablen zusammenfassen und dann übergeben, gibt es dafür eine bessere Methode?

Wie kann ich STRG + V(Einfüg) Methode abfangen?

Wenn die Methode HighlightText fertig ist, setzt ich den TextCursor wieder an den Punkt, wo er vorher war.
Nur verschiebt sich auch der Sichtbereich der RichTextBox.
D.h wenn man vorher oben am Rand mit dem TextCursor war ist man danach irgendwo anders.
Zwar immer noch an der richtigen Textstelle, aber es nervt, wenn sich immer die Sichtbox verschiebt.


Außeredm wollt ich fragen, ob ihr ein paar Tool kennt, die den Code optimieren?
Am Besten wäre Kostenlose Tools.
Ich benutzte Visual Studio 2005 (nicht Express)

Mal wieder Danke.
 
Ich möchte einem Konstruktor eine Struktur übergeben.
Nur sagt er leider dann, das er die Struktur nicht außerhalb des Projektes über die Classe verfügbar machen kann (Keine Ahnung, was das bedeuten soll ...).
Eigentlich wollte ich nur ein paar Variablen zusammenfassen und dann übergeben, gibt es dafür eine bessere Methode?

Klingt mir fast so als wenn deine Sktruktur internal deklariert ist und die Klasse welches das Strukt. erwartet Public ist, entweder den Konstruktor der Klasse internal setzen oder die komplette Klasse, dann sollte es funktionieren.

Wie kann ich STRG + V(Einfüg) Methode abfangen?

Im KeyDown Ereignis des Controls, oder beim Formular KEyPreview auf true setzen und dann dort KeyDown Ereignis auswerten.
 
Erstmal Danke für die Antwort,

ich bin gerade dabei, meine eigene QucikSort Methode zu schreiben,
nur leider hänge ich an der Tausch Methode fest.

Ich versuche mein Problem mal mit Bildlicher Hilfe darzustellen.
Vorweg ich hab zwei Listen, wo jeweils die Indizien der Elemente drin stehen, die über das PivotElement getausch werden oder unter.


das ist mein Array wo die Elemente getausch werden müssen (erstmal nur die Indizien)
[0][1][2][3][4][5][6][7][8]
das ist sind die Indizien, die über das Pivot-Element([4]) sollen.
[0] [3]


Bei 0 klappt es ja noch, und würde so aussehen
(dient nur zur veranschaulichung )
[1][2][3][4][0][5][6][7][8]
[0][1][2][3][4][5][6][7][8]

nur wie man jetzt sieht hat das damals [3] Element jetzt den Index [2]
Zwar kann ich nach jedem Tausch die Liste aktualiesren (z.B. einfach -1 rechnen)
nur wollte ich fragen ob es nicht eine elegantere Methode gibt?

Gruß MRoccoT


Edit:

Ich glaube ich gehe die Sache irgendwie Falsch an.
Nach dem Tauschen hat sich nämlich auch der Index des PivotElementes geändert.
Nur leider gebe ich schon die Liste zurück, aber wie kann mehrere Sachen zurück geben.
(Ich vermeide globale Variablen)
 
Zuletzt bearbeitet von einem Moderator:
QuickSort habe ich nun gelöst.
Nächstes Problem:
In einer Schleife rufe ich immer wieder eine Methode auf, die ein Objekt erwartet.

ungefähr so:
Code:
For i = 0 to 10
Parameters.i = i
Methode(Parameters)
Next

Innerhalb der Methode übergebe ich das Objekt, dann an eine Liste weiter.

Mein Problem ist jetzt aber, das die ganzen Werte am Ende verfälscht sind.
Also i ist bei jedem Objekt 10.
Ich denke mal, dass ich irgendwie nur ein Verweis übergebe.
Aber wie umgeht man dies?


Gruß Michele

PS: Wenn jemand an meiner Lösung interresiert ist, einfach fragen :D

2. PS : Ich hab das gefühl, das ich hier ein Monolog führe ...
 
Vielleicht sind wie blos davon überzeugt das du in der Lage bist eigene Lösungswege zu finden :D

Kanns sein das Parameters eine Klasse ist?
Klassen werden immer By Reference übergeben.

Wo kommt Parameters überhaupt her, wird es in der Schleife neu instanziiert?
 
Hatte vergessen zu erwähnen, das Parameters eine Klasse ist
Dim Parameters As New MatchParameters

Zitat aus einem anderem Forum:
Code:
Dein Objekt muss das ICloneable Interface implementieren

Code:

Class Objekt
  Implements ICloneable

  Public i As Integer

  Public Sub New(ByVal i As Integer)
    Me.i = i
  End Sub


  Public Function Clone() As Object Implements System.ICloneable.Clone
    Return New Objekt(Me.i)
  End Function
End Class


danach musst du deiner Liste das übergeben was Clone zurückliefert.

Noch eine Anmwerkung: Dein Code wird irgendwann recht schwer lesbar. Du solltest immer in das konkrete Interface/Objekt casten und auch prüfen was du da vor dir hast:

Code:

   Dim obj As Objekt

    If TypeOf tmp Is Objekt Then
      obj = CType(tmp, Objekt)
      obj.i = i
      Methode(obj.clone)
    End If


Gruß

Schorsch

Den ersten Teil versteh ich ja, aber was soll der zweite Teil bewirken?


Edit: Dim Objekt1 as _new_ Objekt geht nicht mehr?
Habe jetzt zwei Konstruktoren, einen ohne Parameter und einen mit.
Da ich ja bei der Clone-Methode alle Variablen mit geben möchte.
 
Zuletzt bearbeitet von einem Moderator:
Den ersten Teil versteh ich ja, aber was soll der zweite Teil bewirken?

Meinst du das?
Code:
   Dim obj As Objekt

    If TypeOf tmp Is Objekt Then
      obj = CType(tmp, Objekt)
      obj.i = i
      Methode(obj.clone)
    End If

Im Prinzip wird geprüft ob tmp vom Typ Objekt ist.
Anmerkung: Bitte beachten Objekt mit k. Nicht Object aus .Net
Der Schreiber hat eine Klasse mit dem Namen Objekt angelegt und prüft ob der Typ von tmp Objekt ist. Wenn ja, wird tmp nach Objekt gecastet.
So eine Überprüfung ist sinnvoll wenn du als Parameter nur ein Interface erwartest oder direkt ein Object.

P.S.: Hab versucht c und k hervorzuheben um es besser zu beschreiben :rolleyes:

------Zum Klonen------

Da jedes Objekt von Object abstammt kannst du auch direkt die Methode MemberwiseClose() aurufen, was dir automatisch eine Kopie deiner Klasse zurück gibt.
Zu beachten ist hier nur das dies nur bei Eigenschaften funktioniert die als Datentyp ein Struct haben. Eigenschaften die als Datentyp eine Klasse haben werden normal weiter als Referenz übergeben.

Hoffe konnte mich verständlich genug ausdrücken :D

Edit: Musste paar mal editieren wegen Rechtschreibfehler, wer jetzt noch was findet, behaltets :D
 
Zuletzt bearbeitet:
Ah, danke.
Der freundliche Helfer aus dem anderen Forum hätte nämlich gedacht, dass ich ein Object übergebe, und darum meinete er, ich soll vorher überprüfen, welchen Typ, das Object den hat.

Wie ich im andern Forum schon erwähnt habe sind das nur Beispiel Codes, die bei mir nie so im code auftauchen. (Ich nenne keine Klasse "objekt" oder eine Variable "i" (wenns keine Schleifenvariable ist :D)

Bis jetzt habe ich erstmal keine Problem, aber bestimmt bald wieder...
Also bis demnächst :suspekt:
 
Zurück