Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Lynix
Thema: Quellcode dokumentieren [API- und Quellcodedokumentation]
Am im Forum: Rund um die Programmierung

Hallo zusammen,

für mich gehört in einem perfekten Sourcecode jede Code-Zeile, die nicht trivial ist, d.h. in der nicht bloß eine Variableninitialisierung oder eine Wertzuweisung o.Ä. stattfindet, dokumentiert. In diesem Sinne kann man eigentlich garnicht genug Kommentare schreiben, und das Argument, zu viele Kommentare würden einen Sourcecode unübersichtlich machen, sehe ich nicht ein. Das mag vielleicht so sein, wenn man mit notepad.exe programmiert, aber wer tut das heutzutage noch ?

Thema: Quellcode dokumentieren [API- und Quellcodedokumentation]
Am im Forum: Rund um die Programmierung

Hallo herbivore,

ich kann Deinen Punkten nicht oder nur begrenzt zustimmen.

Zitat
•Es fängt damit an, dass es (Arbeits-)Zeit kostet, Kommentare zu erstellen.

Einen unkommentierten Fremdcode nachvollziehen zu müssen ist ab einer gewissen Mindestkomplexität sicherlich Zeit- und damit auch Kostenintensiver.
Zitat
•Dann müssen Kommentare an Codeänderungen angepasst werden, die müssen also aktuell gehalten werden.

Das stimmt natürlich, ist aber kein "Nachteil eines Kommentars". Die Alternative, keine Kommentare zu nutzen ist sicherlich nicht besser als der unbestrittene Fakt, dass Kommentare auch gepflegt werden müssen.
Zitat
•Das kann vergessen werden und zu Inkonsistenzen führen.

Stimmt, aber von vorneherein keine Kommentare zu machen kann dagegen dazu führen, dass ein Entwickler tage- oder wochenlang versucht einen Code nachzuvollziehen, der mit einem Kommentar sofort klar wäre.
Zitat
•Wenn die Änderungen nicht vergessen werden, kosten sie erneut Zeit.
•Je mehr und je längere Kommentare existieren, desto mehr Zeit kosten die Aktualisierungen und desto eher übersieht der Änderer notwendige Aktualisierungen.

siehe Punkt 1 - dass es Zeit kostet und gepflegt werden muss ist klar, aber mit dieser Argumentation könnte man auch sagen "Programmieren ist ein Nachteil" oder "Zähne putzen ist ein Nachteil".
Zitat
•Selbst wenn Kommentare keine überflüssigen Informationen enthalten, können sie den Code auseinander ziehen/reißen und dadurch die Übersichtlichkeit verringern.

Ich bleibe dabei, dass ordentlich formatierte Kommentare einen Code nicht unübersichtlicher machen. Das passiert nur wenn man es gezielt darauf anlegt wie
Winsharp93 es oben in einem Extrembeispiel gezeigt hat.
Zitat
•Selbst mit guter Absicht und Sorgfalt erstellte Kommentare können inhaltlich falsch oder missverständlich formuliert sein und dadurch schaden.

Diesen Punkt lasse ich bedingt gelten, wobei es auch hier nicht um einen Nachteil des Kommentierens geht, sondern um die Kommunikationsfähigkeit des Mitarbeiters. Dieses Problem besteht bei allen Arbeitsabläufen, bei denen zwei oder mehr Personen miteinander kommunizieren müssen.
Zitat
•Selbst in mit guter Absicht und Sorgfalt erstellten Kommentare können gerade die Informationen fehlen, die ein späterer Leser mit einem anderen Erfahrungshintergrund benötigt.

Worin liegt dann der Nachteil im Vergleich dazu gleich garkeinen Kommentar zu hinterlegen ?

Thema: TCP - Anwendung beendet sich nach "Socket.Close();" ohne Exception.
Am im Forum: Netzwerktechnologien

Also throw new Exception ist Murks, wie ja bereits ausreichend in diesem Thread gesagt wurde. Wenn Du unbedingt ein AutoresetEvent nutzen willst, dann nimm die WaitOne() Überladung, die einen Timeout-Parameter akzeptiert um die Blockade nach einer geeigneten Zeit X abzubrechen. Das in Verbindung mit dem Vorschlag von xxMUROxx sollte schonmal dazu führen, dass Du die Schleife gezielt sauber beenden kannst.

Thema: Wie mit C# auf Datenbank zugreifen und FrontEnd einsetzen
Am im Forum: Datentechnologien

Ist ja klar, dass Du nur Bahnhof verstehst, der Klassenname sagt ja auch nicht aus, wie man damit arbeiten musst. Hast Du denn mal nach den genannten Stichworten gesucht ? Oder willst Du jetzt eine fertige Lösung haben ?

Thema: Quellcode dokumentieren [API- und Quellcodedokumentation]
Am im Forum: Rund um die Programmierung

Naja, Du kannst Deine Methode ja auch mit Brainfuck.NET programmieren, dann kann den ach so simplen Code auch niemand mehr entziffern. Will sagen, Dein Beispiel ist albern... wenn jemand anfängt zu kommentieren, was ein Semikolon bedeutet, gehört er eher ans Fließband als vor einen PC. Und bei einem Kommentar für jedes Wort eine eigene Zeile zu benutzen oder alle Kommentare in den Code rein zu packen ohne Zeilenumbruch hat eher mit Sabotage als mit konstruktiver Arbeit zu tun.

Genausogut könntest Du den Code selbst, der ohne Kommentare auskommt, so beschissen formatieren und mit sinnlosen Operationen auffüllen, dass Du Deine Argumentation umkehren kannst.

Thema: Grafikarten-Temperatur auslesen: Failed to read temperature
Am im Forum: Rund um die Programmierung

Zitat von chilic
Vielleicht liegt es dran dass der BOOL in C eine andere Größe hat als in C#? [...] Versuch mal einen int zurückzugeben [...]

Wenn es C ist nutzt ein Int nichts, dann müsste man stattdessen schon MarshalAs(UnmanagedType.I2) verwenden.

Thema: Wie kann ich (zusätzlichen) Text auf ein (bestehendes) Bild bringen?
Am im Forum: Grafik und Sound

Was ist daran Gefrickel ? Das ist ein 3-Zeiler bei der der Aufruf einer Methode der Form-Klasse demonstriert wird. M$ frickelt ja oft und gerne, aber das hier finde ich noch ganz simpel realisiert.

Thema: Wie mit C# auf Datenbank zugreifen und FrontEnd einsetzen
Am im Forum: Datentechnologien

Wenn Du schon Access benutzt, lad Dir Deine Datensätze in ein Dataset und Weise das Dataset einem Datagrid Control zu. Schon bekommst Du die Datensätze angezeigt.

Zum Zugriff auf eine Access-Datenbank solltest Du mal nach ADO.NET googeln, da gibt es massig Tutorials. Im Übrigen wird der DB-Zugriff über ADO standardisiert, so dass Du je nachdem ob Du Access, SQL oder was auch immer verwendest, meist nur noch den ConnectionString entsprechend anpassen musst.

Thema: Quellcode dokumentieren [API- und Quellcodedokumentation]
Am im Forum: Rund um die Programmierung

Es gibt meiner Meinung nach keinen einzigen Grund, der dafür spricht, Kommentare einzusparen. Je mehr Kommentare, desto besser. Selbst wenn es nur Stating-The-Obvious ist, für den einen mögen Sachverhalte offensichtlich sein, für einen anderen, der einen Fremdcode vorgesetzt bekommt, vielleicht nicht. Hingegen sehe ich keine Nachteile in mehr Kommentaren, im schlechtesten Fall bringt ein Kommentar keinen Mehrgewinn, dann schadet er aber auch nicht.

Leider suchen viele immer nach Argumenten, warum Kommentare schlecht sind oder warum Kommentierung überflüssig ist, das liegt dann aber in 100% der Fälle an der Faulheit der Leute, die aber dann gern am Firmenstammtisch über den Code von jemand anderem herziehen "Voll scheiße, alles endlos verzweigt, nix kommentiert... wie soll man da denn durchblicken..."

Thema: Wie kann ich (zusätzlichen) Text auf ein (bestehendes) Bild bringen?
Am im Forum: Grafik und Sound

Mal doch einfach das ganze Form in ein Bitmap und druck dieses aus.
Hier ein Beispiel, welches ich gerade auf die Schnelle bei google gefunden habe
Einen Screenshot mit C# machen

Thema: TCP - Anwendung beendet sich nach "Socket.Close();" ohne Exception.
Am im Forum: Netzwerktechnologien

Hallo schismatic,

dein "Dauerspam" tritt dann auf, wenn ein BeginReceive sofort zurück kommt ohne etwas lesen zu können (bytesread > 0 == false). Dabei handelt es sich nicht um einen Spam des Clients sondern Deine Debug-Ausgabe "Read event occurred..." wird einfach schon ausgegeben bevor überhaupt erfolgreich gelesen wurde. Wenn der Socket tot ist, ist es allerdings schwierig erfolgreich zu lesen.

Kommen diese "Spam"-Ausgaben schnell hintereinander oder mit einiger Wartezeit dazwischen ? Es wäre interessant zu wissen, ob der Socket den Receive-Versuch einfach sofort abbricht und sofort zurück kommt oder ob er jedesmal in einen Timeout läuft.

Thema: Private Properties vs. Private Fields
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo herbivore,

vielleicht hast Du mich da missverstanden. Ein Property ist eine Eigenschaft, die einen Eigenschaftswert zurück liefert. Properties sollten aber nicht dazu missbraucht werden, zusätzlich zum Zurückliefern oder Setzen ihres Feldes noch weitere Zustände zu manipulieren. Schlimm wird es z.B. wenn ein Property Day neben dem Zurückliefern des (wie auch immer berechneten) Wertes noch die CultureInfo der Applikation oder das aktuelle Working Directory umsetzt.
Auch mit einer kleinen Multiplikation kann man Schindluder betreiben:


public int Value
{
  get { return mValue; }
  set { mValue = value * 5; }
}

myClass.Value = 7;
//...
//...
MessageBox.Show(myClass.Value); -> 35 -> häää?

Sowas ist einfach nicht intuitiv und kein Mensch kann das nach ein paar Wochen noch nachvollziehen.

Dass man alles missbrauchen kann ist klar, aber vielleicht ist es dem OP nicht klar, dass eine wie oben beschriebene Realisierung genau solch einen Missbrauch darstellt, deswegen denke ich der Hinweis sollte an dieser Stelle gestattet sein.
Ob es dabei um ein private oder public Property geht ist m.M. nach nebensächlich, denn selbst in dem Szenario, dass nur ein Entwickler an einem Projekt arbeitet (was bei dem OP ja nicht der Fall ist), weiß dieser Entwickler in 4 Wochen auch nicht mehr was sein Property intern tut.

Ein Beispiel welches aus dem Leben gegriffen ist, ist ein Property VoxelCoordinates, welches bei jeder Abfrage intern ein FixFPU aufrief. An anderer Stelle flogen dann sporadisch irgendwelche OverflowExceptions durch die Gegend und es dauerte mehrere Monate bis ich die Ursache des Fehlers durch Zufall gefunden hatte.

Thema: TCP - Anwendung beendet sich nach "Socket.Close();" ohne Exception.
Am im Forum: Netzwerktechnologien

Hallo schismatic,

Ich würde dir auch erstmal empfehlen, den Socket-Thread jeweils geordnet zu beenden. Wahrscheinlich hast Du Deine Thread-Methode blockierend gebaut, weswegen Du den Thread nur noch über Abort() abschießen kannst. Hierfür gibt es bessere Lösungswege, die nicht blockieren. Wenn Du Deine Socket-Thread Methode mal postest, kann man Dir da sicher helfen.

Woher der Dauerspam kommen könnte sieht man in Deinem Codeausschnitt nicht. Das liegt aber sicher an Dir und nicht an der Socket-Klasse :-)

Thema: Zustandsautomaten, Statemachine
Am im Forum: Rund um die Programmierung

Ich verstehe generell nicht, wie man hier bei der ursprünglichen Beschreibung - 64 Eingänge auf deren Wert-Änderung man reagieren muss - überhaupt auf State-Machines kommt. Letztere machen meines Erachtens nach nur bei komplexen und stark verteilten Einzelzuständen Sinn. Hier würde ich einfach in regelmäßigen Abständen den aktuellen Zustand mit dem vorhergegangenen Zustand vergleichen und entsprechend auf Änderungen reagieren.

Thema: Private Properties vs. Private Fields
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von DaMoe80
Da hast Du mehr reininterpretiert, als was ich gemeint habe. Um das zu praezisieren: Mit Funktionalitaet meine ich grundlegende Dinge, wie bspw. eine einfache Multiplikation etc, die auch voellig legitim ist, diese in einem Property unterzubringen.

Hallo DaMoe,

ich denke ich verstehe Dich schon, aber selbst eine einfache Multiplikation kann zu Verwirrung führen, wenn jemand das Property aufruft und nicht weiß (und es anhand des Property-Namens auch nicht erkennen kann), dass dort mit dem Feld-Wert noch etwas getan wird. Wenn ich private Properties in einem Code fände, in denen noch Felder manipuliert werden, würde ich das für einen sehr schlechten Programmierstil halten. Selbst bei öffentlichen Properties sollte man vorsichtig sein und keine Aktionen im Getter oder Setter vollziehen, die der Aufrufer nicht erahnen kann. Die einzigen Szenarien in denen ich befürworten würde, dass in einem Property mehr als nur eine Rückgabe bzw. eine Zuweisung geschieht sind

a) Der Property-Name drückt das, was als Ergebnis geliefert wird bzw. was mit der Eingabe geschieht aus.
Z.B.


public int MultiplicationResult
{
   get { return input1 * input2; }
}

In diesem Fall liefert das Property nur einen errechneten Wert abhängig von zuvor getätigten Eingaben, dient also als Abkürzung für eine voll ausprogrammierte Methode, während es aber gleichzeitig den Eigenschaften-Charakter behält.

b) Bei Standard-Implementierungen, die allgemein verbreitet und bekannt sind wie z.B. das Abfeuern eines NotifyPropertyChanged Ereignisses bei einem Binding-Property.

Thema: Private Properties vs. Private Fields
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat
Sobald ich mehr "Funktionalitaet" benoetige, wie z.B. Lazy Loader, Kalkulationen etc. verwende ich private Properties.

Ich würde Private Properties nicht mal hier verwenden. Was passiert wenn Du mehr als eine "Funktionalität" auf einem Feld durchführen musst ? Dann läufst Du Gefahr, eine Funktionalität in einem Property "versteckt" zu haben und eine andere in einer privaten Methode.

Ich sehe keinen Sinn in der Verwendung von privaten Properties. Interne Funktionalität zur Manipulation von Feldern sollte in entsprechenden privaten Methoden mit sprechenden Namen realisiert werden, damit man beim Arbeiten an der Klasse schon am Methodennamen erkennen kann, welche Funktionalität sie realisiert. Ein privates Property MeinObjekt sagt dagegen nichts darüber aus, welche Funktionalität darin versteckt ist.

EDIT: Durch die Verwendung von privaten Properties statt privaten Feldern schützt man die Entwickler keinesfalls vor sich selbst, im Gegenteil, man verleitet sie dazu Properties auf die genannte Art und Weise als verkappte Methoden zu missbrauchen.

Thema: Prüfen, ob ein String eine Url (für eine Webseite) ist
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von herbivore
es gibt signifikante Unterschiede in der Länge des erforderlichen Quellcodes. Gerade wenn man alle möglichen Varianten mit normalen String-Operationen ausprogrammiert, wird es sehr länglich. In Regex erfordert das dagegen oft nur ein zusätzliches Zeichen, z.B. ? oder * oder |. Insofern ist Regex die deutlich bessere Wahl gegenüber StartsWith & Co.

Ein längerer Code ist nicht automatisch ein schlechterer Code, gerade im Hinblick auf die Lesbarkeit. Wenn ich irgendwo RegExp sehe kommt mir das Grausen, das erinnert mich immer an die kryptischen Perl-Scripts aus längst vergangenen Zeiten. Lambda Expressions sind genauso ein Murks, der nicht zur Lesbarkeit beigetragen hat. Ist aber nur meine Meinung...

Thema: Dictionary Serialisieren Problem evtl. Convertieren die Lösung :?
Am im Forum: Datentechnologien

Hiermit kannst jedes Dictionary easy serialisieren / deserialisieren:

ObjectSerializer

Thema: Große Datenmengen über 32 Bit ODBC
Am im Forum: Datentechnologien

Ihr wollt aber nicht ernsthaft vorschlagen "mehrere Gigabyte"

1. zu serialisieren
2. noch über das Netzwerk zu jagen und dann
3. dafür auch noch .NET Remoting zu verwenden und
4. wieder zu deserialisieren


?

Wieviele Stunden soll denn der Benutzer bereit sein, auf die Daten zu warten ?
Da ist es meiner Meinung nach schneller, die Tabellen lieber 10 mal direkt neu zu laden...

Thema: WebBrowser-Control: UnauthorizedAccessException beim Zugriff auf Frame anderer Domain
Am im Forum: GUI: Windows-Forms

Ich arbeite zwar nicht mit dem .NET Webbrowser Control, aber mit MSHTML und SHDocVW, wobei ich glaube, das .NET Webbrowser Control nutzt intern auch MSHTML bzw. SHDocVW.

Ich bin auf dasselbe Problem gestoßen wie Du - wenn eine Seite Frames mit src aus verschiedenen Domains beinhaltet, ist der Zugriff auf die Frames normalerweise nicht gestattet.

Ich habe aber einen Weg gefunden, das Ganz zu umgehen und zwar so:


public static class CrossDomainHelper
  {
    /// <summary>
    /// Returns the HTMLDocument object hostet by a specified frame element.
    /// If the passed IHTMLWindow2 instance is not a frame or a browser object, an invalid cast exception will be thrown.
    /// </summary>
    /// <param name="frame">IHTMLWindow2 instance wrapping up a HTMLFrameElement or a IHTMLWebBrowser2 instance.</param>
    /// <returns>The document hosted by the specified frame or browser object.</returns>
    public static IHTMLDocument2 GetCrossDomainDocumentFromFrame(IHTMLWindow2 frame)
    {
      int E_ACCESSDENIED = unchecked((int)0x80070005L);
      Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
      Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E");

      if (frame == null)
        return null;

      //Try if a cross domain conversion is necessary or if security setting don't restrict us from obtaining the frame document via the standard way...
      try
      {
        IHTMLDocument2 doc = frame.document;
        return doc;
      }
      catch (COMException comEx)
      {
        //In case a COMException is fired, check if it was a masked UnauthorizedAccess Exception
        if (comEx.ErrorCode != E_ACCESSDENIED)
        {
          //If it wasn't, some unexpected error occured -> return null in this case.
          return null;
        }
      }
      catch (System.UnauthorizedAccessException)
      {
        //Ignore UnathorizedAccessException, it only signals we have a cross domain access security restriction which we will deal with later.
      }
      catch
      {
        //any other unexpected error -> return null in this case
        return null;
      }

      //Let's deal with the cross domain restriction and retrieve the frame document using a COM service provider...
      try
      {
        // Convert IHTMLWindow2 to IWebBrowser2 using IServiceProvider and return the frame document if the COM extraction worked well.
        IServiceProvider sp = (IServiceProvider)frame;
        Object brws = null;
        sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out brws);
        SHDocVw.IWebBrowser2 browser = (SHDocVw.IWebBrowser2)(brws);

        return (IHTMLDocument2)browser.Document;
      }
      catch
      {
        //If for whatever reason the COM extraction doesn't work, return null...
        return null;
      }

      return null;
    }
  }
  
  /// <summary>
  /// COM service provider marshalling...
  /// </summary>
  [ComImport(), ComVisible(true), Guid("6D5140C1-7436-11CE-8034-00AA006009FA"),
  InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
  public interface IServiceProvider
  {
    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject);
  }

Wie Du das jetzt genau auf das .NET Webbrowser Control übertragen kannst, weiß ich nicht - dazu hab ich es mir nicht lange genug angeschaut. Für meinen Zweck reicht die Funktionalität des .NET Controls nicht aus, weswegen ich dann bei den SHDocVW / MSHTML COM-Komponenten gelandet bin.

Thema: Navigation Pane selbst erstellen: Die Breite soll schon im Entwurfsmodus automatisch gesetzt werden
Am im Forum: GUI: Windows-Forms

Muss es WinForms sein ? Mit WPF kannst Du die Breite der Buttons komfortabel an die Breite des Containers binden...

Thema: String als eindeutigen Integer codieren
Am im Forum: Rund um die Programmierung

Hallo herbivore,

das hab ich schon fast befürchtet, ist ja irgendwie auch logisch. Gibt es denn außer der URL etwas Anderes, Kürzeres, über dass sich eine Webseite eindeutig identifizieren lässt ? Ich denke mal, wenn ich nur noch 4 Zeichen der URL berücksichtige, ist eine Überlappung zweier Websites zu wahrscheinlich.

Zur Erklärung des Hintergrunds: Ich muss HTML-Elemente (Buttons, Textboxen, Links usw.) wieder erkennen können, und das über mehrere verschiedene HTML-Dokumente in ggf. mehreren verschiedenen InternetExplorer Instanzen hinweg. Daher wollte ich mir eine ID zu jedem gefundenen Element erstellen, die abhängig ist von der Webseite, in der das Element vorkommt (daher die URL) und von anderen unveränderlichen Eigenschaften des Objektes.

Die Einschränkung ist, dass ich ein "Handle" vom Typ integer brauche, das liegt an einer Schnittstelle, die ich nicht beeinflussen kann.

Als unveränderliche Eigenschaften stehen mir drei Zahlen zur Verfügung, zwei davon innrhalb eines Wertebereiches von -2000 bis + 2000 und eine innerhalb eines Wertebereiches von 0 bis 10000. Mit diesen drei Zahlen ist das HTML Element eindeutig INNERHALB EINES HTML-Dokumentes beschrieben. D.h. ich muss zusätzlich noch eine Information mitkodieren, durch die sich dann die erzeugten IDs aus Webseite 1 von denen aus Webseite 2 unterscheiden.

Vielleicht hat ja jemand eine Idee dazu...

@m.knigge

Danke, werde ich mir mal anschauen...

Thema: String als eindeutigen Integer codieren
Am im Forum: Rund um die Programmierung

Hallo gfoidl,

ich hab im Vorfeld bereits danach gesucht, aber nur Algorithmen gefunden, die mir ein byte[] zurück liefern, damit kann ich aber nichts anfangen, da ich den codierten Wert unbedingt als Integer brauche.

Wenn Du einen speziellen Hash-Algorithmus kennst, der mir das liefern kann, wäre ich dankbar für eine detailliertere Antwort.

Thema: String als eindeutigen Integer codieren
Am im Forum: Rund um die Programmierung

Hallo zusammen,

kennt jemand einen (Standard-)Algorithmus der mir einen String von fester Länge (z.B. 8 Zeichen) auf einen eindeutigen Integer-Wert abbildet ?

Es ist dabei nicht nötig, später den String wieder reproduzieren zu können, lediglich die generierte ID vom Typ integer muss eindeutig sein. Es wäre auch wünschenswert, dass die erzeugte Integer-Zahl eine fixe Anzahl von Dezimalstellen hat, wobei ggf. mit Nullen aufgefüllt werden kann aber eine bestimmte Obergrenze nicht überschritten werden darf.

Beispiel :

String-Eingabe : www.mycsharp.de
Erzeugte ID (≤ 10 Dezimalstellen) : 1234567890

Mit einem long-Wert müsste es denke ich z.B. so gehen:


private static long UrlToLong(string url)
    {
      int initialLength = url.Length;
      long value = 0;

      int lastXCharacters = 8;
      if (lastXCharacters > url.Length)
        lastXCharacters = url.Length; //if the url has less than 8 characters, ignore the lower decimal positions (keep them at zero)

      //start with the last character in the url
      for (int i = 1; i ≤ lastXCharacters; i++)
      {
        double ascii = (double)((int)url[url.Length - i]);
        double exp = Math.Pow(256, 8 - i);
        value += ((long)ascii * (long)exp);
      }

      return value;      
    }

Ein Integer hat allerdings einen zu kleinen Wertebereich für die obige Methode, weshalb ich mich gefragt habe, ob es dafür einen fertigen Encoding-Algorithmus gibt.

Thema: 1:n Beziehung, Ereignisweiterleitung? Timer + Queue
Am im Forum: Rund um die Programmierung

Da gibt es sicher nicht "die" Patentlösung. Ich denke die Realisierung ist letztendlich Geschmackssache. Aus Sicht der OO würde ich aber nicht im Manager-Objekt die Events der Timer abonnieren, sondern vom Workerobjekt heraus ein eigenes Event definieren. Damit sind die Timer dann in der Worker-Klasse gekapselt und wenn Du irgendwann entscheidest, dass statt einem Timer etwas anderes verwendet werden soll, kannst Du das in der Workerklasse intern austuaschen, ohne dein Managerobjekt zusätzlich ändern zu müssen.

Zur Frage der Weiterleitung über die Eventargs, warum willst Du den Timer als Eventargs weitergeben ? Gib doch gleich die Queue als Eventargs mit, auf die sich der Timer bezieht, dann kannst Du gleich im Managerobjekt mit der Queue arbeiten und brauchst nicht noch einen weiteren Zugriff auf das Workerobjekt.

Thema: SHDocVW / MSHTML : Scrollbar-Position und Borderwidth abfragen ?
Am im Forum: Rund um die Programmierung

Die scrollbar-Problematik konnte ich gerade lösen.

Wen es interessiert: Wenn browser die SHDocVW.InternetExplorer Instanz ist, kriegt man die Scrollbar-Werte so:


HTMLDocument doc = (HTMLDocument)browser.Document;
HTMLHtmlElement html = (HTMLHtmlElement)doc.DocumentElement;
int scrollX = html.scrollLeft;
int scrollY = html.scrollTop;

Die Scrollbarwerte kommen dabei in falscher (negativer) Richtung zurück, d.h. man muss die Scrollbarwerte von der Koordinate abziehen anstatt sie zu addieren.

Für den Border hab ich immer noch nichts gefunden...

Thema: Ordner mit wechselndem Namen erkennen und öffnen! [Firefox Profilverzeichnis]
Am im Forum: GUI: Windows-Forms

Du könntest auch noch bei jedem gefunden Directory (falls es doch mehrere gibt) mit Directory.GetFiles() prüfen ob deine key3.db und signons.sqlite Dateien in dem jeweiligen Verzeichnis liegen. Wenn Du mehr als ein Verzeichnis findest, in dem diese Dateien liegen, würde ich über einen Message-Dialog den Benutzer auswählen lassen, für welches der Verzeichnisse er/sie das Backup ausführen möchte.

Thema: SHDocVW / MSHTML : Scrollbar-Position und Borderwidth abfragen ?
Am im Forum: Rund um die Programmierung

Hallo zusammen,

Ich nutze SHDocVW.dll und mshtml.dll um eine InternetExplorer Anwendung zu automatisieren. Soweit klappt es ganz gut, aber ich habe zwei Probleme, die mich in den Wahnsinn treiben, weil ich keine Dokumentation dazu finde.

Zum Einen brauche ich den aktuellen Ausschlag (integer-Wert) der Scrollbars (horizontal u. vertikal) eines Internet Explorer-Tabs, wobei der Tab vom Typ SHDocVW.IWebBrowser2 bzw. SHDocVW.InternetExplorer ist. Über beide Typen finde ich keine Möglichkeit, die Scrollbars auszulesen. Gibt es vielleicht ein weiteres Interface, in das ich das Tab-Objekt casten kann, welches mir dann den Zugriff auf die Scrollbars erlaubt ? Ich finde dazu nichts in der SHDocVW Referenz...

Das zweite Problem ist, dass ich beim Berechnen der globalen Desktop-Position eines Webcontrols im automatisierten HTML-Dokument immer einen Versatz von 3 Pixeln in x- und y-Richtung habe. Ich vermute, dass es sich dabei um die Borderwidth des Tabs handelt. Auch diesen müsste ich also irgendwie auslesen können, da ich nur ungern hartcodiert immer +3 rechnen möchte.

Ich hoffe, es hat schonmal jemand mit SHDocVW und MSHTML gearbeitet und kann mir irgendwie weiter helfen.

Die .NET internen Internetexplorer Controls kann ich leider nicht nutzen, da mein Tool imstande sein muss, sich mit einer externen Internetexplorer-Instanz zu verbinden.

Danke...

Edit: Tippfehler beseitigt.

Thema: WebService Response in Dictionary "einlesen"
Am im Forum: Netzwerktechnologien

Fehler in XML-Dokument klingt so als ob der Webservice schon Mist zurück gibt. Kann man die Webservicemethode denn in irgendeiner anderen Umgebung konsumieren, bzw. ist es sicher, dass der Webservice überhaupt korrekt funktioniert ?

Kannst Du bei der Exception Fehler in XML-Dokument in der inner Exception nachschauen, ob dort ein detaillierterer Fehler angegeben ist ?

Ich sehe nicht, warum es einen Fehler geben sollte, nur weil es ein PHP-Webservice ist. Gerade um technologieunabhängig zu sein führt man ja eine Zwischenebene wie z.B. SOAP ein.

Thema: WebService Response in Dictionary "einlesen"
Am im Forum: Netzwerktechnologien

Wie bindest Du denn den Webservice in dein C# Projekt ein ? Über einen Webverweis ?

Wenn ja, dann stelle mal sicher, dass Du auch die Player-Klasse aus den Proxy-Klassen (die beim Hinzufügen des Webverweises erzeugt werden) benutzt und nicht eine andere (lokale) Player-Klasse, die nur gleich aufgebaut ist.

Du kannst Dir auch mal ein object zurückgeben lassen


object p = myWS.webservicemethode(param); 

und dann per p.GetType().ToString() prüfen, auf welchen Rückgabetyp (in welchem Namespace, in welcher Assembly) sich die Webservice-Methode bezieht.