Laden...
B
Borg myCSharp.de - Member
Berlin, Germany Dabei seit 23.08.2006 1.529 Beiträge
Benutzerbeschreibung

Forenbeiträge von Borg Ingesamt 1.529 Beiträge

01.05.2007 - 16:15 Uhr

Kurz gefragt: Schafft man es nur mit GDI+ eine Grafik wie die im Erstpost zu erzeugen?

01.05.2007 - 16:08 Uhr

Wir können ja zur Unterscheidung die Bezeichnung Hardware-Treiber (Hardware Abstraction Layer, HAL) und Anwendungs-Treiber einführen.

Der HAL ist derjenige Treiber, der direkt mit der Hardware kommuniziert (Ports, Interrupts, DMA etc.). Nur dieser läuft (notwendigerweise) im Kernel Mode. Beispiele dafür sind der IDE-, USB- oder NIC-Treiber.

Anwendungstreiber sind jetzt die Bestandteile, die höhere Funktionen zur Verfügung stellen und zur Kommunikation auf dem HAL aufsetzen, selbst aber nicht direkt mit der Hardware kommunizieren und daher im User Mode laufen können (und dann auch sollten).
Um bei obigen Beispielen zu bleiben wären das dann der Dateisystemtreiber, der USB-Massenspeichertreiber oder auch der TCP/IP-Protokollstack.

Dem Benutzer sind die Unterschiede relativ egal, daher wird auch nur ein gemeinsamer Begriff verwendet. Nur für den Programmierer sind das zwei komplett andere Dinge.

Einen HAL kann man nicht mit .NET programmieren. Einen User Mode Anwendungstreiber schon.

01.05.2007 - 15:59 Uhr

Kurze Antwort: Nein.

Lange Antwort: steht schon oben.

01.05.2007 - 15:55 Uhr

Das wird wohl nur über ein Firefox Add-On zu bewerkstelligen sein. Also solltest du dich in deren Programmierung einarbeiten.

30.04.2007 - 22:36 Uhr

Bekommt man mit GDI+ auch den schrägen Verlauf vom Bild ins Schwarz hin?

30.04.2007 - 22:09 Uhr

Hast du dir die Fehlermeldung mal durchgelesen?
Es ist nur für class-Deklarationen gültig.

EDIT: Argh!!!!!!!!! Einfach die Frage weg editieren. So was...

29.04.2007 - 20:29 Uhr
  1. Schließe die Festplatte nicht an Windows an, um es nicht noch schlimmer zu machen.
  2. Benutze Knoppix o.a. um mittels dd-Kommando eine Image-Datei der lesbaren Bereiche der Festplatte zu erstellen. Arbeite nur auf dem Image.
  3. Wenn die Daten das Geld wert sind, gib die Festplatte in ein Datenrettungslabor.
  4. Verleihe nie Sachen, auf denen sich wichtige Daten befinden. Noch dazu, wenn du kein Backup hast.
  5. Such mal nach "File Recovery". Tools gibt es sowohl für Windows als auch Linux genug. Bei Knoppix könnten sogar schon welche dabei sein.
29.04.2007 - 18:25 Uhr

Als statisches Bild: Raytracing beispielsweise povray
Als "echtes" Spiegelbild: DirectX

29.04.2007 - 16:36 Uhr

Du musst dir einen impliziten Konverter schreiben.

Um Beispielsweise int zuweisen zu können, schreibst du:

public struct MyStruct
{
   int intern;
   public MyStruct( int val )
   {
      intern = val;
   }
   public static implicit operator MyStruct( int val )
   {
      return new MyStruct(val);
   }
}
29.04.2007 - 16:32 Uhr
uint val = 3260705592;
DateTime date = (new DateTime(1904, 1, 1)).AddSeconds(val );
29.04.2007 - 16:26 Uhr

Du weist dem Element einfach einen eindeutigen Schlüssel zu.
Beide Controls testen im Enter-Handler mittels ContextMenuStrip.Items.IndexOfKey(), ob der Eintrag vorhanden ist. Wenn nicht, fügt ihn das eine hinzu, falls ja löscht ihn das andere.

29.04.2007 - 15:56 Uhr

1: 3259759275 --> 18.4.07 16:41 Uhr
2: 3260623431 --> 28.4.07 16:43 Uhr
3: 3260705592 --> 29.4.07 15:33 Uhr

int-Differenzen:
3-2: 82161
3-1: 946317
2-1: 864156

Zeit-Differenzen:
3-2: 22h 50min => 82200 s
3-1: 10d 22h 52min => 946320 s
2-1: 10d 2min => 864120

Offensichtlich speichert das Feld die Anzahl der Sekunden. Aber seit wann?
3259759275 => 37728d 16h 41min 15s => ~103 Jahre => Start im Jahr 1904

Daher vermute ich, dass es sich dabei um das (alte) Excel-Zeitformat handelt, d.h. die Anzahl der Sekunden seit 01.01.1904 00:00.

Teste das mal.

EDIT: Habe ich wohl für die Rechnungen zu lange gebraucht. Zwei Posts in der Zeit...

29.04.2007 - 15:21 Uhr

Gibt mal ein zweites Beispiel.

29.04.2007 - 14:01 Uhr

Ein byte[4] ist ja auch kein double, sondern ein single...

29.04.2007 - 11:11 Uhr

Natürlich, gibt es die Möglichkeit eine Kopie zu erstellen. Du kopierst die ArrayList.

private ArrayList DeepCopy( ArrayList original )
{
   if (original == null)
   {
      return null;
   }
   ArrayList intern = new ArrayList( original.Capacity );
   for (int i = 0; i < original.Count; i++)
   {
      if (original[i] is IClonable)
      {
         intern.Add( ((IClonable)intern[i]).Clone() );
      }
      else
      {
         intern.Add( intern[i] );
      }
   }
   return intern;
}

Im Framework 2.0 solltest du allerdings List<T> anstelle von ArrayList verwenden.

EDIT: Wenn deine ArrayList nur Werttypen enthält, kannst du auch direkt ArrayList.Clone() verwenden.

EDIT2: Wenn die Referenztyp-Objekte in der ArrayList selber wieder Referenztypen enthalten, musst du diese auch noch klonen. Dafür gibt es aber leider kein Interface im Framework (IDeepCopy), so dass du das in obiger Methode noch einbauen musst.

29.04.2007 - 10:47 Uhr

Das sind alles Sachen, die Windows von sich aus kann.
Die DLL macht nichts anderes als dir Geld für das Setzen einiger Registry-Werte aus der Nase zu ziehen. Lad dir TweakUI runter und such ein bisschen im Netz, dann bekommst du das alles für null Komma nichts.

28.04.2007 - 21:43 Uhr

Ist es vielleicht so gedacht, dass man Assemblies bereitstellt, die zum Beispiel für Oberflächenanwendungen die gleichen Texte in jeweils unterschiedlichen Sprachen bereitstellen und dass man dann im Sinne unterschiedlicher Versionen, je nach Wunsch des Endanwenders, letztendlich eine dieser Assemblies verwendet?

Ja.
Bzw. es wird immer diejenige Assembly (einer bestimmten Version) benutzt, die die gleiche Kultur wie die referenzierende Assembly hat. Wenn es eine solche nicht gibt halt die kulturneutrale.

28.04.2007 - 21:34 Uhr

Damit hast du dich für den folgenden Link qualifiziert: http://www.galileocomputing.de/openbook/visual_csharp/

28.04.2007 - 16:19 Uhr

if (HauptForm.Visible)

28.04.2007 - 16:16 Uhr

Hast du schon mal die Erweiterung FoxGame für den FireFox ausprobiert? Die kann das und noch mehr.

27.04.2007 - 18:18 Uhr

OMG = Oh Mein Gott.

Da siehst du mal, was das Entfernen einer Endlosschleife alles für Auswirkungen haben kann...

27.04.2007 - 14:47 Uhr
DateTime dtNow = DateTime.Now;  
  
while (dtNow.Date != dtDeadline.Date)  
{  
        dtNow = dtNow.AddDays(1);  
        counter++;  
}  

OMG. Was ist das denn? Willst du die Anzahl der Tage bis zum Auslaufen einer Frist ermitteln?

Wie wäre es denn mit:

int days = (dtDeadline.Date - DateTime.Now.Date).Days;
27.04.2007 - 14:42 Uhr

Relative Pfade bedeutet:

Du setzt den aktuellen Pfad mittels Directory.SetCurrentDirectory() auf "c:/Dokumente und Einstellungen/%USername%/Lokale Einstellungen/Anwendungsdaten" und arbeitest dann mit Pfaden der Form "Ordner1/Ordner2/Datei".
Solange ein Pfad nicht mit "&quot; beginnt, ist es immer ein relativer Pfad, d.h. er beginnt beim aktuellen Verzeichnis.

27.04.2007 - 12:04 Uhr

Nun, dann musst du ja nur wissen, welche Zeichen erlaubt sind und welche nicht.

Ich würde dann in einem Bool-Array speichern, was erlaubte Zeichen sind und was nicht und das ganze so gestalten:

// für jedes Zeichen ein Element, true wenn erlaubt, false wenn verboten
bool[] AllowedBytes = new bool[256] { /* ... */ };

private bool IsValidData( byte[] Data, bool[] AllowedBytes )
{
   if ((AllowedBytes.Length != 256) || (Data == null))
      throw new ArgumentException();
   int i = 0;
   while ((i < Data.Length) && AllowedBytes[ Data[i] ])
     i++;
   return i == Data.Length;
}
27.04.2007 - 11:57 Uhr

Dann ist doch ein verschlüsseltes Archiv der einfachste und sinnvollste Weg, so etwas systemübergreifend zu bewerkstelligen.
Ein verschlüsseltes ZIP-Archiv kann jedes (mir bekannte) System von Haus aus öffnen.
Mit einem RAR kannst du sogar die Dateinamen verschlüsseln.

27.04.2007 - 11:53 Uhr

Ich habe es immer noch nicht richtig verstanden. Wieso schickt dir der Scanner plötzlich zwischendurch einfach mal so sinnlose Daten? Was ist dem voraus gegangen? Musst du den Scanner vielleicht neu initialisieren? Du hast doch geschrieben, dass die sinnlosen Daten kommen, wenn der Scanner falsch konfiguriert ist. Wieso konfiguriert ihn dein Programm nicht entsprechend?

Und was meinst du mit:

da diese "Nummer" in dem Datenträger, welcher vom Scanner gelesen wird,

Reden wir hier von einem optischen Scanner? Was für ein Datenträger wird dort gescannt?

27.04.2007 - 11:39 Uhr

Encoding.ASCII.GetString(byte[]) bringt mir z.B. "0123"

Richtig. Encoding betrachtet die einzelnen Bytes als einzelne Zeichen und erzeugt einen String, der genau aus diesen Zeichen besteht. Wenn du so willst, wandelt er dir jedes Byte einfach in ein Char.

und BitConverter.ToString() bringt dann 30-31-32-33...

Das war ja Sinn der Sache. Dein Problem war doch, dass die MessageBox Teile des Textes nicht darstellt, weil in dem String irgendwelche Steuerzeichen drin sind. Dieses Problem hast du damit gelöst, da jetzt die Werte der einzelnen Bytes hexadezimal ausgegeben werden.

Wie kann ich das dann widerrum umwandeln?

Wozu? Es ging doch nur darum, das erhaltene Byte-Array zur Ausgabe zu formatieren. Und da du offenbar prüfen willst, welche sinnlosen Daten dir der Scanner schickt, ist dir nicht geholfen, wenn die Hälfte der Bytes nicht angezeigt wird, bloß weil sie Steuerzeichen sind.

Das wichtigste: der Scanner wird dir doch kaum eine Zeichenkette schicken, sondern nur binäre Daten. Warum willst du die überhaupt in eine solche umwandeln? Da kann nur Blödsinn bei raus kommen.

27.04.2007 - 11:31 Uhr

@feadur:

ob das allerdings schneller ist bezweifle ich.

Schneller ist es mit Sicherheit. Ob das allerdings in einem spürbaren Rahmen liegt, möchte ich bezweifeln.

@Daneu:

  1. Dein Programm erstellt die Datei doch. Dann sollte es doch wohl auch in der Lage sein, sich den Dateinamen zu merken.

  2. Wieso erzeugst du temporäre Dateien unterhalb des Installationsordners?
    Das funktioniert schon unter XP nur als Admin, unter Vista nicht mal dann.
    Merke: niemals in das Anwendungsverzeichnis schreiben.
    Um den korrekten Pfad für Anwendungsdaten zu erhalten nutze Environment.GetSpecialFolder().

27.04.2007 - 11:21 Uhr

Die Frage ist zwar simpel, allerdings ist es die Antwort nicht.

Den prinzipiellen Weg habe ich ja oben schon beschrieben.
Allerdings ist der C#-Teil das geringste Problem daran. Du müsstest dich in die Videobearbeitung per DirectShow einarbeiten.
Und das ist nichts, was man einfach mal eben so in ein paar Stunden erledigt.
Erst wenn du DirectShow verstanden hast und damit umgehen kannst, bist du an einem Punkt, an dem du dein Projekt beginnen kannst.
Insofern stellen deine noch geringen C#-Kenntnisse kaum ein Hinderungsgrund dar.

Natürlich nur angenommen, dass du den Aufwand zu leisten bereit bist. Ich würde eher die verlinkte Software nutzen, als das selbst zu machen.

27.04.2007 - 11:12 Uhr

Ein vom Benutzer steuerbarer Service besteht aus zwei Teilen.
Der erste ist der eigentliche Service, welchen unter dem SYSTEM-Account läuft. Dieser hat dann auch das Recht, beliebige Prozesse zu beenden und das Sicherheits-Log zu lesen.
Zusätzlich bietet er eine Kommunikationsschnittstelle an. Dies könnte IPC, Named Pipes oder auch TCP/IP sein, je nach Bedarf.

Vom Benutzer wird jetzt ein Steuerprogramm gestartet (evtl. per Autostart), welches sich über die Kommunikationsschnittstelle (Authentifizierung und Verschlüsselung nicht vergessen) mit dem Service verbindet und darüber die Übergabe von Befehlen u.ä. ermöglicht.

Ein Service kann nicht mit dem Desktop interagieren, also auch keine Fenster darstellen. Es ist zwar möglich (durch setzen des UserInteractive-Flags), nur sollte man das nicht tun, da der Benutzer sonst ein Fenster mit erhöhten Rechten hat. Damit kann der Benutzer sehr leicht die gesamte Rechteverwaltung aushebeln (ein simpler Dateidialog reicht schon).

Der richtige Weg läuft über die Trennung in Dienstlogik (SYSTEM-Rechte) und Steuerlogik (Benutzer-Rechte).

27.04.2007 - 11:02 Uhr

Lass doch mal die Zeile search.PropertiesToLoad.Add("member"); weg, dann überträgt er alle Properties. Dann kannst du mit dem Debugger schauen, wie das gesuchte heißt und dieses im Anschluss auslesen.

27.04.2007 - 10:55 Uhr

Läuft der dann mit dem geänderten Code weiter oder noch mit dem alten, wenn ich wieder resume?

Er läuft mit dem neuen Code weiter. Wenn das aus irgendwelchen Gründen nicht möglich sein sollte, teilt dir VS das mit.

27.04.2007 - 00:15 Uhr

Ich wollte damit nur ausdrücken, dass man die Rekursion in der interpretierten Sprache nicht als Rekursion in der interpretierenden Sprache ausführen muss.

26.04.2007 - 23:46 Uhr

@Bionic:

Oder greift es hier nicht?

Es greift nicht. Das @-Zeichen deaktiviert die Auswertung von Sonderzeichen in String-Literalen, d.h. direkt angegebenen String-Konstanten. Sind Sonderzeichen im String drin, sind sie drin und werden auch ausgewertet, es sei denn man entfernt sie. Einfach "ungültig" machen geht nicht.

@maik:
Ich vermute mal, dass dein String mit einem Nullzeichen ("\000") beginnt.
Ich vermute weiterhin, dass du die Daten als Byte-Array bekommst (bzw. bekommen solltest!?). Dann wandle sie vor der Ausgabe mittels BitConverter.ToString( byte[] ) in einen hexadezimalen String um.

26.04.2007 - 23:44 Uhr

Convert.ToString(Byte, Int32)

26.04.2007 - 23:30 Uhr
  1. Wieso übergibst du den Dateinamen nicht als Parameter an getData()? Die Übergabe über eine Instanzvariable ist ... unschön.

  2. Zum Zerlegen des Dateinamens bitte die Klasse System.IO.Path benutzen.

  3. Wozu entfernst du erst die Extension, nur um sie dann wieder hinzuzufügen? Wenn schon nicht die Path-Klasse, dann wenigstens Test mittels String.EndsWith().

  4. Wenn du MultiSelect benutzt, kann der Benutzer beliebig viele Dateien auslesen. Da ist es wenig intuitiv, wenn nur zwei geöffnet werden, vor allem da nicht bestimmt ist, in welcher Reihenfolge sie in FileNames auftauchen.

26.04.2007 - 23:06 Uhr

Wenn es dein eigener Interpreter ist, kannst du doch die Rekursion beim interpretieren in eine Iteration überführen.
Dazu kannst du in einem Stack<T> den Aufrufstack des interpretierten Programms speichern. Damit ist die Rekursionstiefe des interpretierten Codes nur durch den Arbeitsspeicher begrenzt.

26.04.2007 - 23:02 Uhr

Das ist kein C#-spezifisches Problem, sondern eher eins von DirectShow.
Letzendlich läuft es darauf hinaus, das Video zu dekodieren, den Text in jedes einzelne Frame zu schreiben und das Video neu zu kodieren.

26.04.2007 - 23:00 Uhr
  1. Jeder Benutzer kann seine eigenen Prozesse beenden (auch per Kill). Die Prozesse anderer Benutzer nur mit Admin-Rechten. Daher => Service

  2. Keine mir bekannte allgemeingültige Möglichkeit. Es wäre dann eh besser, bereits vor dem Starten zu prüfen und den Start gegebenenfalls abzubrechen.

  3. In Reaktion auf das Öffenen eines Programms, aber wie? steht, wie du auf das Starten eines Prozesses per Event reagieren kannst.

26.04.2007 - 22:51 Uhr

Fang _WebBrowser.Navigating_ab, cancel das Event, lade die Seite von Hand, entferne alle ungewollten IMG-Tags (oder besser: setze die Source auf eine 1x1 Pixel große Grafik und blähe mittels "width" und "height" auf die Originalgröße auf, um das Layout zu erhalten) und weise den Code an WebBrowser.DocumentText zu.

Allerdings weiß ich nicht, wie die ganzen Events auf Frames reagieren, die ja in verschiedenen Dateien vorliegen...

25.04.2007 - 11:46 Uhr

Ich "sage" also: Ein Gebäude ist auch ein Bodenfeld, daher die Ist-ein-Beziehung.

Dem kann ich mich zwar nicht anschließen, aber vielleicht fehlen mir auch nur weitere Informationen.
In meiner kleinen Denkwelt habe ich ein Objekt vom Typ Gebäude, welches auf einem Objekt vom Typ Grundstück steht. Dennoch sind Grundstück und Gebäude zwei verschiedene Paar Schuhe. Auf einem Grundstück können sogar mehrere Gebäude stehen. Keinesfalls jedoch ist ein Gebäude automatisch ein Grundstück; es hat (steht auf) ein(em) Grundstück.

24.04.2007 - 22:53 Uhr

Soweit richtig?

Ja.

Ich hätte gerne, dass die Location vorne steht, Muss ich dazu dann lediglich die Parameter umdrehen, oder muss ich auch einen neuen Konstruktor einfügen?

Einfach Reihenfolge der Parameterliste tauschen. Siehe unten.

Eigentlich macht das keinen Sinn, aber man sollte doch alle Möglichkeiten abdecken?

Nein. Wenn es keinen Sinn macht, brauchst du es auch nicht anzubieten.

Dann weiter: ...

  1. Occupant sollte einen Standard-Konstruktor anbieten, so dass du dir das String.Empty sparen kannst.
  2. Allein von den Namen der Klassen her, vermute ich, dass dein Klassendesign nicht ganz sauber ist. Bei dir ist Building ein Kind von Basement. Das würde aber bedeuten, dass jedes Gebäude automatisch ein Untergeschoss ist.
    Gemeint ist aber sicherlich, dass jedes Building ein Basement hat (Aggregation).

denn auch hier hätte ich am liebsten die Location ganz vorne.

Siehe oben und folgendes.

Entspricht letzteres eigentlich dem, was Du bzgl. der Parameterreihenfolge vorgeschlagen hattest, Borg?

Ich würde die Parameter immer nach Priorität anordnen. Und wenn du selbst schreibst, dass ein Basement zwar ohne Location aber nicht ohne Typ sinnvoll angelegt werden kann, dann ist der Typ der wichtigste Parameter und sollte meines Erachtens nach ganz vorn.
Ansonsten halte ich es für wenig intuitiv, wenn ich einen Konstruktor einen Typ übergebe und ihm später noch die Location hinzufügen will, jedoch diese plötzlich vor dem Typ angeben muss.

24.04.2007 - 22:28 Uhr

Du kannst die Inversion des Bytes durch ein Exklusiv-Oder mit 0xFF ersetzen. Dann klappt es auch mit dem Wertebereich.

24.04.2007 - 12:29 Uhr

Wieso nicht einfach Process.Start( @"D:\Development\C#\SarFernGas\SarFernGas\bin\Debug\PCUpdate.exe" );?

24.04.2007 - 11:56 Uhr

Stimmt. Ich glaube mein @ klemmt.

24.04.2007 - 11:50 Uhr

Dank Intellisense sollten Parameterlisten auch überschaubar bleiben.

Mittlerweile ist doch bekannt, das herbivore ein Hardcore mit-dem-Editor-programmier-und-ber-die-Kommandozeile-kompilier Programmierer ist. Da ist nichts mit IntelliSense.

Ich bin aber auch der Meinung, dass Eigenschaften, die für die Verwendung der Instanz wichtig sind, bereits bei deren Erzeugung festgelegt werden sollen.

Ansonsten dürfte man nicht mal eben Foo( new Point(5,10) ) schreiben, sondern immer Point p = new Point; p.X = 5; p.Y = 10; Foo(p);.