Laden...

Forenbeiträge von MastaOfDisasta Ingesamt 20 Beiträge

23.03.2005 - 11:14 Uhr

Hahahaha

Man bin ich dämlich, dass ich da nicht selber drauf gekommen bin, danke 🙂

Da ich keine sonderliche Lust hab das ganze wieder umzubauen werd ich wohl die Lösung nutzen. Trotzdem würde mich interessieren, wie man bei sowas sinnvollerweise vorgeht, denn ich glaube nicht, dass das wirklich ideal ist, was ich da treibe.
Also änder ich meine Frage mal in eine allgemeine Frage: Wie würdet ihr vorgehen um so eine Datei zu parsen?

Greetz
MoD

23.03.2005 - 10:58 Uhr

Moin Moin,

ich hab hier eine Datei, die ich parsen muss. Die Datei ist eine .adm Datei von Windows, die eine festgelegte Syntax hat.

Ein Beispiel:


CATEGORY !!NetMeeting

    	CATEGORY !!AppSharing
	        POLICY !!DisableAppSharing
		KEYNAME "Software\Policies\Microsoft\Conferencing"
		EXPLAIN !!DisableAppSharing_Help
		 VALUENAME "NoAppSharing"
	        END POLICY
	END CATEGORY

END CATEGORY	

Zur Syntax:
Alle Wörter in Großbuchstaben sind Schlüsselwörter. Müssen nicht unbedingt groß geschrieben werden, ich erwähne das nur, damit man besser sieht, was erreicht werden soll.
Bisher bin ich so vorgegangen, dass ich davon ausgegangen bin, dass genau ein Schlüsselwort pro Zeile existiert und ich die Datei daher zeilenweise eingelesen habe und je nachdem, welches Schlüsselwort am Anfang der Zeile steht eine bestimmte Aktion ausgelöst habe.
Jetzt hab ich das parsen auf einem anderen System getestet und bin natürlich direkt gegen die Wand gelaufen 🙄
Solange jeweils nur ein Schlüsselwort in einer Zeile steht funktioniert das ganze wunderbar, aber auf dem anderen System durfte ich zu meinem Erschrecken feststellen, dass die Datei nicht zwingend zeilenweise aufgebaut sein muss. Es sind auch Konstrukte wie untenstehend möglich:


CATEGORY !!NetMeeting CATEGORY !!AppSharing POLICY !!DisableAppSharing
		KEYNAME "Software\Policies\Microsoft\Conferencing"
		EXPLAIN !!DisableAppSharing_Help
		 VALUENAME "NoAppSharing"
	        END POLICY END CATEGORY 
END CATEGORY	

Wie man sieht können auch mehrere Schlüsselwörter in einer Zeile stehen. Ein Zeilenumbruch ist nicht zwingend erforderlich.
Jetzt darf ich das Parsen also komplett umbauen.
Wie geht man mit sowas am besten um?

Greetz
MoD

03.03.2005 - 15:47 Uhr

Hu herbivore,

mh ja klar so hab ichs jetzt. Schön finde ich das aber trotzdem nicht.

Schöner wäre ein EventHandler auf die Gruppe und dann nur noch ein gruppe.getChecked();

Naja wenns nit anders geht musset halt so gehn.

Greetz
MoD

03.03.2005 - 13:51 Uhr

Moin Moin,

ich hab eine RadioButton Gruppe mit 3 Elementen.
Jetzt muss ich ja irgendwie abfangen, wenn der Benutzer einen anderen RadioButton aktiv setzt.
Mein erster Ansatz ist das CheckedChange Event abzufangen und damit eine Methode aufzurufen, die je nachdem, welches Elemtn gewählt ist die gewünschten Aktionen durchführt.
Leider kann man das Event nicht von der gesamten Gruppe abfangen sondern nur von den einzelnen Elementen(wenn ich nichts übersehen hab). D.h.: Ich müsste für jedes einzelne Element das CheckedChange Event abfangen. Das würde aber heissen, dass meine Methode 2 mal aufgerufen wird, wenn der Benutzer ein anderes Element auswählt. Garnicht schön.
Wie kann ich besser abfangen, dass sich etwas geändert hat?

Greetz
MoD

02.03.2005 - 17:59 Uhr

Den Inhalt hast Du doch dadurch, dass Du die Länge hast.
Vergleiche aus Deinen strings genau das Stück, welches die Zahl ist (von Position i bis position i+count1).
Dafür kannst Du dann sogar die wunderbar die String.Compare() Methode verwenden.

Des weiteren würde ich das Vergleichen erst machen, nachdem ich die Längen ermittelt und verglichen hab. Der Grund dafür ist, dass man für das Länge ermitteln eigentlich keine Schleife benutzen möchte.
Man stelle sich vor, man hat einen String der Form "ab"+1MillionZiffern"+"ab"
Dann durchläuft man 2 Millionen mal eine Schleife nur um die Anzahl der Ziffern rauszufinden. Könnte ein bisschen langsam werden das Ganze.

Daher das Vergleichen der beiden Zahlen erst nach dem ermitteln der Längen machen und später das ermitteln der Längen umbauen.
Spontan würde ich auf einen RegEx tippen, der die Zahl ausschneidet und dann nur noch die Length Eigenschaft abgefragt werden muss. Vermutlich immernoch nicht die eleganteste Lösung 😉

Greetz
MoD

02.03.2005 - 14:39 Uhr

Ja das ist fast eine Möglichkeit. Nicht unbedingt die performanteste aber es funktioniert. Allerdings solltest Du Dir nicht den String merken sondern mitzählen, wie viele Ziffern Du in Folge findest und wenn das aktuelle Zeichen keine Ziffer mehr ist aus der Schleife springen.

Also:


oa = 0;
int count1 = 0;
    for (oa=i; oa<s1.Length; oa++)
    {
      if (Char.IsDigit(s1[oa])) {
        count1++;
      }
      else {
        break;
      }
    }

Wenn man das für beide strings macht weiss man, wie lang die Zahlen sind.
Bestimmt nicht die eleganteste und schnellste Lösung, aber es funktioniert 😉

Greetz
MoD

Ps: Schön wäre vermutlich, wenn man einen RegEx verwendet.

02.03.2005 - 14:19 Uhr

Nein zählen tust du nicht. Du durchläufst den string einfach weiter und führst schon Operationen aus. Das führt zu Problemen. Ich schreibe mal umgangssprachlich auf, was zu tun ist:

if (Char.IsDigit(s1_) && Char.IsDigit(s1_))
{
ermittle, wie lang die zahl in s1 ist und merke sie dir
ermittle, wie lang die zahl in s2 ist und merke sie dir
vergleiche die länge von der zahlen in s1 und s2
ist die zahl in s1 länger, dann ist s1 der grössere string
ist die zahl in s2 länger, dann ist s2 der grössere string

sind die zahlen gleich lang, dann müssen wir überprüfen, welche zahl grösser ist
}

Den Fall, dass die Zahlen gleich lang sind machen wir später. Erstmal interessiert uns nur der Fall, dass die Zahlen unterschiedliche Länge haben.

Beispiele:
s1 = "a10a" && s2 = "a9a"
s1 = "a9a3" && s2 = "a10a2"

Ich hoffe jetzt ist klarer geworden, was zu tun ist.

Greetz
MoD

02.03.2005 - 14:02 Uhr

Wie gesagt: Eins nach dem anderen 😉

Zuerst rausfinden, wie lang die Zahl ist. Haben wir das Problem gelöst ergibt sich die Lösung für Dein Problem mit der Schleife fast von alleine, indem Du die Abbruchbedingung änderst 👍

Greetz
MoD

02.03.2005 - 13:47 Uhr

Original von -acid-
weißt du das problem ist, dass die schleife aufhört zu laufen, wenn

if (s1_ > s2_) return 1;

kommt. das heißt: aa2.jpg und ab3.jpg hört bei dem dritten zeichen auf, weil 2 ja > 3...

Es ist richtig, dass die äussere for Schleife beim zweiten Durchlauf aussteigt, da
if (s1_ < s2_) return -1;
"a" < "b"
true ist.
Dein Posting versteh ich aber grad nicht 🙂

Der nächste Schritt sollte auf jeden Fall erstmal sein, dass Du Dir in dem "if (Char.IsDigit(s1_) && Char.IsDigit(s1_))
" etwas ausdenkst um die Länge der in dem String vorkommenden Zahlen zu vergleichen.
Testfälle:

1 = MyClass.NatCompare ("a10a", "a9a1")
-1 = MyClass.NatCompare ("a9a1", "a10a")

Die Schleifen würde ich erstmal auskommentieren.

Greetz
MoD

02.03.2005 - 12:55 Uhr

Hi,

ich kommentier mal ein wenig in deinen Quelltext herein 😉

Original von -acid-
so guckst du:

string s1basket = "";  
string s2basket = "";  
int oa;  
int ob;  
   		  
for (int i=0; i<s1.Length; i++)  
{  
  if (i >= s2.Length) return 1;  
  // Die zweite Überprüfung soll vermutlich auf s2 überprüfen, nicht nochmal auf s1. Ich schätze ist nur nen Tippfehler :)  
  // Ansonsten schonmal der richtige Ansatz  
  if (Char.IsDigit(s1[i]) && Char.IsDigit(s1[i]))  
  {  
    // Der Teil der jetzt kommt passt noch nicht wirklich  
    // Als erstes solltest Du, wie herbi oben schon geschrieben hat, die Länge der Zahl überprüfen, die in Deinem String vorkommt  
    // Sind die Zahlen unterschiedlich lang, brauchst Du die einzelnen Ziffern nicht mehr in der Schleife vergleichen, denn die längere Zahl ist auch die grössere  
    // Es gilt:   "a10a" > "a9a"  
  
  
      
    // Warum benutzt Du hier nicht einfach wieder Deine for Schleife, die die Zeichen einzeln vergleicht, wie Du es auch bei Buchstaben machen würdest?  
    // Asserdem würdest Du hier auf Probleme laufen, wenn deine strings aus mehreren Kombinationen von Buchstaben und Zahlen bestehen, da Du ungeachtet der Zahlenlänge den string bis zu Schluss durchläufst  
    // Es gilt: "a2a" > "a1a9"  
    // Bei Dir würd herauskommen: "a2a" < "a1a9"  
    oa = 0;  
    for (oa=i; oa<s1.Length; oa++)  
    {  
      if (Char.IsDigit(s1[oa])) s1basket += s1[oa].ToString();  
    }  
  
    ob = 0;  
    for (ob=i; ob<s2.Length; ob++)  
    {  
      if (Char.IsDigit(s2[ob])) s2basket += s2[ob].ToString();  
    }  
    
    if (oa > 0 && ob > 0)  
    {  
      if (Convert.ToInt64(s1basket) > Convert.ToInt64(s2basket)) return 1;  
      return -1;  
    }  
  }  
  if (s1[i] > s2[i]) return 1;	 			  
  if (s1[i] < s2[i]) return -1;	  
}  
if (s1.Length == s2.Length) return 0;  
return -1;  

also es funktioniert ganz gut. hier und da gibts bestimmt noch fehler. kannst ja mal drüber gucken.

Ich hoffe ich hab mich nirgendwo schwer vertan g

Greetz
MoD

Ps: Sorry fürs einmischen 😁

02.03.2005 - 08:54 Uhr

Hi morcheba

Hab ich das jetzt richtig verstanden, dass Du den Benutzernamen des Benutzers willst, der auf dem Client angemeldet ist?

Dann bin ich mir ziemlich sicher, dass das nicht möglich ist.

Ich würde einen Weg über Cookies wählen.
D.h.: Beim ersten aufrufen der Seite wird dem Benutzer das komplette Login Formulat gezeigt. Er gibt Benutzername und Passwort an. Ist das erfolgreich verlaufen kannst Du den Benutzernamen in ein Cookie schreiben. Ruft er die Seite nochmal auf liesst Du das Cookie aus und setzt im Login Formular den Benutzernamen.

Greetz
MoD

02.03.2005 - 08:27 Uhr

Original von morcheba
lblUser.Text = SystemInformation.UserName-Eigenschaft;

Kann es evtl sein, dass dort ein grundsätzlicher Fehler ist, der schon nen Compiler Fehler verursacht? 😉

Richtig wäre es so:
lblUser.Text = SystemInformation.UserName;

Ob das allerdings das gewünschte Ergebnis bringt bezweifle ich stark.

Greetz
MoD

Ps: Darf man fragen, wofür Du den Benutzernamen bei einer Webanwendung überhaupt benötigst?

01.03.2005 - 17:04 Uhr

Hi,
wenn es sich um eine NTFS Platte handelt, auf der Deine Dateien liegen helfen Dir eventuell "ADS-Streams" weiter.
Dort werden scheinbar die Informationen gespeichert, die Du suchst.
Guck Dich einfach mal hier um:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/ntfs5.asp
http://support.microsoft.com/default.aspx?scid=kb;EN-US;186898

Greetz
MoD

01.03.2005 - 15:34 Uhr

Moin Moin zusammen,

mein Problem ist folgendes:
Ich lese eine Datei mit


myStream = new System.IO.FileStream("C:\\meineDatei.txt",System.IO.FileMode.Open); 
System.IO.StreamReader reader = new System.IO.StreamReader(myStream);
while ((inputString = reader.ReadLine()) != null) {
inputString = inputString.Trim();
}

ein.
Später möchte ich den Inhalt dieser Datei in einem Label anzeigen.
So weit so gut.
Allerdings kommen in der Datei \n's vor, die im Label auch als Zeilenumbrüche interpretiert werden sollen.
Also hab ich


inputString = Regex.Unescape(inputString);

ausgeführt.
Funktioniert auch ganz gut, bis ich gemerkt habe, dass in der Datei auch noch an anderen Stellen ein \ vorkommen kann und dann knallts natürlich auf Grund einer "Unrecognized escape sequence".

Jetzt meine Frage:
Wie gehe ich am besten vor, dass nur die \n's unescaped werden?
Mit einem Regulären Ausdruck nach "\n" suchen und dann diesen durch "\n" ersetzen oder seht ihr noch ne andere, evtl. ellegantere Möglichkeit?

Greetz
MoD

23.02.2005 - 15:50 Uhr

Hi Rene,

so weit so gut für Strings, die nur aus einer Zeile bestehen und das Label unendlich breit werden darf.

Ich habe aber einen Text, der aus bis zu 20000 Zeichen besteht mit zusätzlichen Zeilenumbrüchen (\n) drin.

Zur Zeit mach ich es so:


string myString = "ganz \\\\n viel \\\\n text mit zeilenumbrüchen"
//Den Umweg über das string[] gehe ich, weil es bisher die einfachste Möglichkeit ist die "\n"'s zu zählen. Eine Methode string.Count("\\\\n") hab ich leider nicht gefunden.
string[] test = myString.Split("\\\\n".ToCharArray());
label1.Text = myString;
label1.Size = new System.Drawing.Size(368,label1.PreferredWidth/368*label1.PreferredHeight*test.Length);

Funktioniert auch schon fast, bis auf den Umstand, dass das Label Zeilen umbricht, indem es nicht die volle Zeile ausnutzt, sondern nur zwischen Wörtern trennt. Dadurch wird der Text natürlich ein bisschen länger.

Greetz
MoD

23.02.2005 - 12:17 Uhr

Die AutoSize-Funktion bringt mich wohl nicht wirklich weiter. Son bisschen Einfluss auf das Design meiner App wollte ich schon noch nehmen. Eine feste Breite für das Label ist Pflicht.

Aber PrefferedWidth und Height werden mich wohl zum Ziel bringen. Daraus werde ich wohl meine benötigten Parameter errechnen können. Jetzt muss ich mir nur noch eine Logik entwickeln, wie ich daraus die richtigen Grössen berechne 🙂

Danke
Greetz
MoD

23.02.2005 - 11:51 Uhr

Moin Moin,

ich muss in einem Label einen Text anzeigen, der erst zur Laufzeit der Programms erstellt wird. Der Text kann dabei beliebige Längen haben. Jetzt steh ich vor dem Problem: Wie finde ich raus, wie gross das Label sein muss, damit der Text da auch rein passt?

Greetz
MoD

22.02.2005 - 13:37 Uhr

War das ne Frage oder ne Antwort? 😉

Nee schon gut. Danke. Genau das, was ich gesucht habe. Hätt ich auch selber drauf kommen können aber manchmal sieht man den Wald vor lauter Bäumen nicht 🙁

Greetz MoD

22.02.2005 - 13:29 Uhr

Hi herbivore,

habe mich wohl ein bisschen dumm ausgedrückt 🙂

Gemeint ist nicht der Inhalt der Box, sondern die Box selber.(Den Inhalt hab ich nur drin gelassen, damit man sieht, dass da was drin is 😉 )
Die Box liegt mit mehreren anderen Elementen in nem Tab und hat eine feste Grösse. Jetzt kann es vorkommen, dass der Inhalt der Box nicht in die Grösse passt(der Inhalt wird dynamisch generiert), also brauche ich Scrollbars. Hab zuerst an ne GroupBox gedacht, aber die kann man nicht Scrollable machen.

Zusammenfassung: Ich suche das Control für die umfassende Box, nicht den Inhalt 🙂

Greetz
MoD

22.02.2005 - 13:14 Uhr

Moin zusammen,

ich bin noch relativ neu mit c# und erstelle grade ein Windows Forms Anwendung.

Zur Zeit hänge ich aber an dem Problem fest, dass ich kein passendes Steuerelement für meine Zwecke finde.
Und zwar soll das ganze irgendwann mal so oder so ähnlich aussehen:

Hat jemand eine Idee, welches Control ich da sinnvoller Weise benutze?

Greetz
MoD