Laden...

Forenbeiträge von Qwald Ingesamt 214 Beiträge

20.09.2006 - 16:06 Uhr

Hallo,
ok schade. Werde dann wohl einen Adapter für die Klasse schreiben müssen.

20.09.2006 - 15:20 Uhr

Hallo,
danke Lynix, das ist genau das was ich gehofft habe.

Werde es später gleich mal ausprobieren, und hoffen das alles soweit klappt. 👍

19.09.2006 - 20:26 Uhr

Hallo,
ich such eine (leichte & schnelle) Lösung für mein Problem.

Ich benutze eine recht große (fremd)-Bibliothek, welche jede Menge Exceptions wirft, z.B. wenn die Logindaten falsch waren.
Natürlich möchte ich bei solch einem kleinem Problem, wie z.B. falsche Logindaten, nicht, dass mein Programm abbricht, sondern dem User die Möglichkeit geben, darauf zu reagieren.
Ein weiteres Problem ist, dass eigentlich jede Funktion der Bilbiothek solche Exceptions werfen kann (falsche Userdaten), z.B. wenn der Server den User automatisch ausgelogt hat (Timeout).
Diese Execptions sind vom gleichen Typ, abgeleitet von Exceptions.

Solche Ausnahmen sollen immer gleich behandelt werden, also es soll z.B. ein Dialog erscheinen, wo der User seine Login Daten wieder eingeben kann.

Jetzt möchte, sofern es möglich ist, nicht bei jedem Funktionsaufruf ein try-catch Block schreiben, der bestimmte Exceptions abfängt (z.B. falsche Userdaten), sondern dies irgendwie automatisieren, aber wie?

Bsp:
bibliothek.Funktion1();
//...
bibliothek.Funktion2();

Bei Funktion2 passiert nun ein Fehler, dort soll dann gleich (automatisch) das Error-Handling eintreten.
Sofern der Fehler bekannt ist, werden bestimmte Funktionen wie ein Dialog anzeigen aufgerufen. Ist er unbekannt, wird die Exception weitergereicht, das Programm bricht an der Stelle ab.

Allerdings wie realisiere ich das?

Die Bilbliothek möchte ich ungerne Umschreiben, auf Grund des Zeitaufwandes und der Wiederverwendtbarkeit.
Die Klassen abzuleiten, und bei jeder Methode eine Fehlerbehandlung einzubauen, wäre auch recht aufwendig.

Gibt es evt. eine relativ leichte Methode, so dass ich alle BibliothekExceptions (abgeleitet von Exceptions) an ein bestimmtes Objekt/Klasse delegieren kann, und diese dann entscheidet, ob abgebrochen wird oder ähnliches passiert?

Jede Funktion in einen try-catch Container zu setzen fände ich persönlich sehr unübersichtlicht, denn die Bibliothek ist mit das Herzstück der Anwendung (also müsste ich jeden 3. Aufruf oder so anpassen).

Vielleicht hat ja jmd. eine Idee dazu.

MFG

19.09.2006 - 15:57 Uhr

Hallo,
dann verwende doch <br> 😉

18.09.2006 - 20:59 Uhr

Hallo,
mal ne ganz blöde Frage, aber wie kann ich eine Referenz auf eine andere Variable erstellen, also so wie in C ein Pointer auf einen Pointer.

Bsp:


Test a = new Test("Hallo");
Test b;

b = a;

MessageBox.Show(b.Text); //Ausgabe: Hallo

a = new Test("Neu");

MessageBox.Show(b.Text); //Ausgabe: Hallo, soll aber 'Neu' sein

Klar weiß ich warum ich dieses Ergebiss erhalte, allerdings weiß ich nicht, wie ich das ändern könnte.
Ich möchte, dass b immer auf das gleiche zeigt wie a, also einen Zeiger von b nach a. Bei der zweiten Ausgabe soll dann 'Neu' und nicht 'Hallo' erscheinen.

Beim ref Schlüsselwort meckert er immer rum, wenn ich diesen vor b setze (evt. falsch gesetzt?).

Hat jmd. eine Idee, wie man das löst, ohne auf unsafe-Code umsteigen zu müssen. Da wird es doch bestimmt eine Lösung geben.

18.09.2006 - 17:58 Uhr

Hallo,
evt. hilft es ja:

lv.BeginUpdate();
//Update
lv.EndUpade();

Des Weiteren am besten nur die Einträge ändern, die sich auch wirklich geändert haben. Also nicht die ListView leeren, und dann alle Einträge neu hinzufügen.

16.09.2006 - 20:38 Uhr

Hallo,
so habes gelöst:


 private bool CreateData = true;
 private byte[] data;

 public override int Read(byte[] buffer, int offset, int count)
        {
           
            if(CreateData)
            {
                data = Encoding.UTF8.GetBytes("Hallo Welt");
                counter = offset;
                CreateData= false;
            }

            int oldLength = data.Length;

            oldLength -= counter;

            if(oldLength > count)
               oldLength = count;



            if(oldLength <= 0)
            {
                oldLength = 0;
                CreateData = true;
            }

          
            

            for(int i=0; i < buffer.Length && counter < data.Length; i++)
            {
                buffer[i] = data[counter++];                               
            }
                              
            

            return oldLength;
   }

16.09.2006 - 19:54 Uhr

Hallo,
das wäre eine Möglichkeit, finde ich persönlich relativ unschön.

Also ich übergebe dem XmlSerializer einen Stream, diese schreibt dann auf den Stream seine Daten, bzw. liest dann später die Daten wieder aus.

Beim schreiben muss der Stream die Daten prüfen, evt. noch konvertiert oder kodiert, und dann in der Datenquelle abspeichern.

Beim lesen muss dies alles rückgänig gemacht werden.

Deswegen wäre es schön, wenn dies alles in einer Klasse gekapselt wäre, und ich nicht jedes mal den zurückgegeben String in einen Memory Stream konvertieren muss, um ihn dann an den XmlSerializer zu übergebem.

16.09.2006 - 18:53 Uhr

Hallo,
leider kann ich die Klasse 'StringReader' nicht verwenden.

Ich verwende für mein Programm die Klasse XmlSerializer, und diese Schreibt die Daten in einen Stream, bzw. liest diese aus einem Stream.

Ich möchte XmlSerializer dann als Stream 'uclStream' übergeben.

Zu Anfang soll uclStream einfach bei 'Read' nur einen vorgegeben String zurückgeben, später wird aber dieser String speziell zusammengesetzt, überprüft, modifiziert etc.

16.09.2006 - 18:27 Uhr

Hallo,
ich möchte einen eigenen Stream erstellen, der soweit Funktioniert, bis auf die Methode 'Read'.

Irgendwie bekomm ich es nich hin, dass aus dem Stream auch gelesen werden kann.
Bei dem Stream wird es sich um einen String handeln.

Am besten ich poste mal die Bereiche:


public class uclStream : Stream
{
//.....

  public override int Read(byte[] buffer, int offset, int count)
        {
            buffer = Encoding.UTF8.GetBytes("Hallo Welt");
           return 0;            

           }
}

//Jetzt soll die Methode aufgrufen werden:
private void Methode()
{
   MessageBox.Show(new StreamReader(meinUclStream).ReadToEnd() );
}

Die Methode 'Read' wird zwar aufgerufen, allerdings erscheint in der MessageBox nicht 'Hallo Welt' sondern diese bleibt leer.

Irgendwie finde ich nichts passendes dazu im Web.
Evt. kann mir ja einer weiter helfen, wo der Fehler in der Methode liegt.

16.09.2006 - 16:17 Uhr

Hallo,
hmm schade dies habe ich schon befürchtet. Naja wird wohl nicht viel übrig bleiben und mittels DotFuscator das beste herrauszuhohlen.

16.09.2006 - 14:40 Uhr

Hallo,
für meine Anwendung (C#) brauche ich eine (sicherheitsrelevante) Funktion, welche ausschließlich von meinem Programm aufgerufen werden kann.

Des Weiteren darf diese Funktion nicht in IL Code übersetzt werden.

Ich könnte jetzt eine C-Dll erstellen, das Problem wäre aber, dass Leute von außerhalb auch die Funktionen in der C-Dll aufrufen könnten, oder kann ich es bewerkstelligen, dass fremde Personen nur mit sehr viel Aufwand auf die Funktionen in der Dll zugreifen können?

Des wegen wäre es schön, wenn ich die Native-Funktionen (die nicht in IL Code übersetzt wird) irgendwie in meine .NET exe integrieren könnte.

Kann ich z.B. irgendwie einen Teil der .NET Exe in unmanaged C++ Code schreiben, und wird dieser dann in native Code übersetzt?
Und wenn ja, kann ich dann auch gewährleisten, dass nur meine Anwendung auf die Funktion zugreifen kann?

Danke im vorraus.

PS: Mir ist bekannt, dass ich eine Funktion nicht zu 100% von außen abschatten kann. Allerdings sollte man nicht schon mit [DllImport...] auf die Funktion zugreifen können.

15.09.2006 - 21:17 Uhr

Hallo,
also ich finde Wikis ehrlich gesagt ****, mit Ausnahme von Wikipedia (&Co).

Die sind:

  1. Sehr unübersichtlich
  2. Man findet eh immer kaum Leute, die mal Artikel schreiben/flegen.
  3. Die meisten Wikis bestehen nur aus Stubs, und die Qualität der Artikel sind eh nicht so gut
  4. Kaum Leute schauen in Wikis nach
15.09.2006 - 16:58 Uhr

Hallo,
das Stichwort lautet: Semaphoren.

Und zwar legst du eine Textdatei an, die angibt, ob auf deine Info-Datei gelesen/geschrieben werden darf.
Sofern dies erlaubt ist, ändert der Prozess der schreiben möchte, den Wert in der Semaphoren-Datei auf: Info-Datei darf nichtmehr gelesen werden.

Dann liest/schreibt er in die Info-Datei. Sobald der Prozess fertig ist, setzt er den Wert in der Semaphore zurück.

Wenn der Prozess aber ganz am Anfang merkt, dass in der Semaphore steht, dass die Datei verwendet wird, wartet der Prozess solange bis sich der Zustand in der Semaphore ändert.

13.09.2006 - 15:26 Uhr

Hallo,
warum nicht selber schreiben?


class NameDerClass 
{
   ArrayList items = new ArrayList(); //In .NET 2 lieber List<OneItem> verwenden


   public void Add(OneItem item)
   {
   items.Add(item);
   }

   public void Remove(OneItem item)
   {
   items.Remove(item);
   }
   //... Alle anderen Funktionen
}

//Stellt 1 Item in deiner Liste dar
class OneItem
{
   private string name;
   private string email;
 
   public OneItem(string name, string email)
   {
   //....
   }
}
10.09.2006 - 13:52 Uhr

Hallo,
@knuffel: Die Seite zufinden war eigentlich ganz einfach, auch wenn man auf Assembly nicht gekommen ist:
C# dynamisch dll laden

09.09.2006 - 17:48 Uhr

Hallo,
nochmal was zur Lesbarkeit, hab heute selbst ein kleines Beispiel gefunden, wo == false evt. mehr Sinn macht, also !.
Und zwar wenn man viel 'casten' muss, ist so ein ! sehr unübersichtlich.

Bsp:
if(
((ClassForExampe)e.Item).SubItem.IsFolder && !((ClassForExampe)e.Item).SubItem.IsDisk
)

if(
((ClassForExampe)e.Item).SubItem.IsFolder && ((ClassForExampe)e.Item).SubItem.IsDisk == false
)

Das == false sieht man beim der 2. Anweisung sofort, das ! kann man aber bei Bsp1 recht schnell überlesen.

Des wegen sollten man == false nicht pauschal als schlechten Stile verurteilen, wobei ich aber selber meistens ! verwende.

09.09.2006 - 15:20 Uhr

Hallo,
ich habe ein UserControl, in dem sich ein paar Controls befinden.

Jetzt möchte jetzt ein paar Events verknüpfen.

Also wenn in dem Ucl sich z.B. ein Button befindet, und jmd. auf den Button klickt, dann wird ja das Event 'Click' des Buttons ausgelöst.

Da aber der Button private ist, kann ich von außen, also außerhalb des ucl, nicht auf das Event reagieren.

Jetzt würde ich es gerne so machen, dass das ucl diese Event 'weiterleitet', also dass jmd. der das ucl verwendet, diesem Event ein delegate hinzufügen kann.

Die einzige Lösung die ich bisher gefunden habe, ist relativ umständlich. Und zwar wenn wenn der Click-Event des Button ausgelöst wird, wird eine Methode in dem ucl aufgrufen, und dort wird dann ein Event des UCLs aufgerufen.

Dies ist aber leider relativ umständlich, und unübersichtlich.

Kennt evt. jmd. eine bessere Lösung?

09.09.2006 - 14:20 Uhr

Hallo,
ich kenn mich zwar mit Firebird nicht wirklich aus, aber evt. kann ich ja dennoch helfen.

  1. I.d.R. schreibt man alle SQL Befehle Groß, sieht einfach besser aus.
  2. Manche DBs erlauben bei Zahlenfelder keine Anführungszeichen bei der WHERE-Klausel.
    Falsch: WHERE reihnfolge = '2'
    Richtig: WHERE reihnfolge = 2

Evt. ist es bei Firebird ähnlich

  1. Warum schreibst du um die Bedingungen Klammern? Sind dieser Erforderlich?
08.09.2006 - 15:12 Uhr

Hallo,
warum nicht den String anhand des Trennzeichen (.) trennen? Das letze Element ist dann der Klassenname.

Aber wozu brauchst du das?

In einer IF Anweisung kannst du z.B. schreiben:
if(obj is ClassA)
else if(obj is ClassB)
....

07.09.2006 - 20:39 Uhr

Hallo,
ich denke mal das geht über irgend ein Paramter.

Aber evt. kannst du unsichtbar einen Browser öffnen, mit der Adresse: 'mailto:email@domain.de'.

Schon öffnet sich ein Fenster zum Verfassen der Mail.

07.09.2006 - 20:36 Uhr

Hallo,

Original von frisch

Ich sehe keinen Punkt, bei dem ich herbivores Beitrag bemängeln kann.

Also wenn viele Programmierer mit verschiedenen Prog. Sprachen zusammenarbeiten, sollte man sich schon überlegen, dass jeder if(x== true) schreibt.

Denn bei if(x) wäre es für einen C++-Programmierer nicht klar, dass x unbedingt eine bool Variable sein muss, für ihn kann es z.B. auch eine Int-Variable sein.

Das gleiche, nur andersrum:

if(x)
return 100/x;
else
//Error, keine Division durch 0

Für einen C# Programmierer recht ungewohnt, in C wäre dieser Ausdruck aber kein Problem (und ich sah schon viele Programme/Scripts die soetwas verwendet haben, vorallem in fast jedem PHP Script sieht man so etwas in der Art). Aber zur besseren Lesbarkeit sollte man sich auf:

if(x > 0)

einigen, aber dann auch auf if(x == true) //Sofern x eine bool Variable ist

Meine Meinung dazu 😉

Edit:
PS: Ich verwende == false immer dann, wenn ich dies besonders deutlich hervorheben möchte, also dieses == false so extrem wichtig ist, dass man es auf keinen Fall überlesen darf.
Sonst benutze ich aber auch meistens if(x) bzw. if(!x)

07.09.2006 - 18:15 Uhr

Hallo,
du solltest dich wirklich sträker mit XML beschäftigen, dann wirst du merken, dass das, was du hier postest, schwachsinn ist.

07.09.2006 - 15:59 Uhr

Hallo,
wenn du die Klasse XMLDocument() verwendest, kannst du per .LoadXml() aus einem String ein XMLDocument() erstellen lassen.

Dann einfach per normale Netzwerkfunktion den Inhalt der Datei runterladen, und als String der Methode übergeben.

05.09.2006 - 18:07 Uhr

Hallo,
die Resource-Datei ist doch nichts anderes als eine XML Datei, in der dann 'ZielFeld' und 'Text' steht.
Warum machst du es nicht so, das du anstatt die Resource Datei zu verwenden, die lang.xml aus dem Ordner lädst.

03.09.2006 - 19:47 Uhr

Hallo,
was würde dir denn solch ein Interface bringen?

Oft wendet man ein Interface so an:

INameInterfache variable;
if(....)
  variable = new Klasse1();
else
  variable = new Klasse2();

variable.EineMethode();

Allerdings kannst du folgendes nicht machen:

static class testClass
        {          
        }

//...
testClass variable; //Fehler

Ergo würde dir solch ein Interface nicht viel bringen.
Was du aber machen könntest, ein Singleton-Objekt erstellen, welches deine Anfragen an die Static-Methoden delegiert. Ob das jetzt sinnvoll ist, müsste man aber wissen, was du vor hast.

02.09.2006 - 19:26 Uhr

Hallo,
was mir persönlich immer sehr gut Hilft: Ein Klassendiagramm.

Such dir ein schönes Klassendiagramm-Programm, ich benutze z.B. Altova, und überlege dir, welche Objekte es in deinem Programm später einmal existieren werden.
Dann überlegst du dir, welche Funktionen diese Objekte haben sollen, um auch später flexibel zu sein.
Des Weitern solltest du versuchen, möglichst wenig Beziehungen, bzw. möglichst 'simple' Beziehungen, zwischen den Objekten einzugehen. In einem Klassendiagramm erkennt man sehr schnell, wann einem die Beziehungen über den Kopf wachsen.

Erst wenn dein Klassendiagramm fertig ist, fängst du an die ersten Zeilen code zu schreiben. Durch das Diagramm hast du einen guten Plan von deinem Projekt, und kanst strukturiert vorgehen.

Allerdings sollte man dafür schon UML beherschen, lernt man aber recht schnell.

02.09.2006 - 13:54 Uhr

Hallo,
du musst den Inhalt der Box in HTML formatieren, denn Mails zeigen entweder nur Text an (Textmails), oder es gibt, sofern aktiviert, auch HTML Mails.
Des Weiteren musst du den Header anpassen, und die Email als HTML Mail deklarieren.
Weiteres dazu findest du im Internet oder bei Wikipedia.

01.09.2006 - 15:08 Uhr

Hallo,
ich bin jetzt auf VS2005 umgestiegen, und es gibt dort eine Sache, die mich extrem stört.
Und zwar immer wenn ich eine Datei öffne, wird das Register für die Datei links eingefügt, so das die neuste Datei links, und nicht wie früher, rechts steht.

Weiß jmd. welche Option man ändern muss, damit die neuste Datei bei den Register sich rechts befindet, wie bei den meistens IDEs?

MFG

31.08.2006 - 17:37 Uhr

Hallo,
ist es möglich, ein Property zu erstellen, welches für verschiedene Gültigkeitsbereiche, unterschiedliche Werte setzt (.NET 2).

Beispiel:
Ich habe ein Property z.B. für eine List, diese soll für außen 'ReadOnly' sein, aber intern soll man sie verändern können.

So z.B.


private List<int> _items = new List<int>();

public List<int> Items
{
    private get { return _items; }
    public get { return _items.AsReadOnly(); }
}

Ich weiß, man könnte auch bei private direkt auf die List zugreifen, allerdings wäre es manchmal schöner, wenn diese ein Property wäre.

Danke im vorraus.

31.08.2006 - 16:00 Uhr

Hallo,
bei einer ArrayList gab es die nette Methode .Clone(); womit man ein ArrayList klonen konnte.

Jetzt wollte ich meinen Script auf eine generic List umstellen, allerdings enthält diese Klasse nicht mehr die Methode .Clone();
Gib es dort ein Methode, womit ich eine List von einer Variable zu einer anderen List Variable kopieren kann, und 2 unabhänige Lists erhalte.

Ca. so:
List<int> var1 = new List<int>();
List<int> var2 = new List<int>();

var1.Add(5);
var2 = var1.CloneFuerList();

//var2[0] == 5

Danke

31.08.2006 - 14:34 Uhr

Hallo,
eigentlich benutzt man eine binären Baum dafür, dass man nicht solch "primitive" Suchverfahren werden muss, sondern auf die binäre Suche zurückgreifen kann.

Hier steht was gutes zu Bäumen unter C.

Sofern es kein bin. Baum ist, sry für meinen Beitrag, aber hier die Tiefensuche formal:


DFS(node, goal)
{
  if (node == goal)
    return node;
  else
  {
    stack := expand (node)
    while (stack is not empty)
    {
      node' := pop(stack);
      DFS(node', goal);
    }
  }
}

Quelle

30.08.2006 - 11:19 Uhr

Hallo,
setz doch bei den Thread einfach .IsBackground = true;
So werden diese beendet, sobald deren Eltern-Thread (dein Prog.) beendet wird.

Sonst löse doch einfach bei deinem Main-Form in dem Closing-Event (in der Methode) ein eigenes Event aus. Jede Klasse die einen Destruktor haben möchte, reagiert dann auf das Event des Main-Forms und ruft dann eine interne Klasse, einen Destruktor, auf.

29.08.2006 - 19:58 Uhr

Hallo,

ich bekomme immer folgende Fehlermeldung:

Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' ist in class.dll aufgetreten.

Zusätzliche Informationen: Bei folgendem Index wurde ein hohes Ersatzzeichen gefunden, dem kein niedriges Ersatzzeichen folgt: 295. Die Eingabe befindet sich möglicherweise nicht in dieser Codierung oder enthält keine gültigen Unicodezeichen (UTF-16).

VS makiert dabei immer folgende Zeile:
if (BytesTransferred != null) //Hier ist der Fehler, Zeile Gelb hervorgehoben
BytesTransferred(this, new BytesTransferredEventArgs(remoteFile, size));

Dabei ist das Event so deklariert:

public virtual event BytesTransferredHandler BytesTransferred;
public delegate void BytesTransferredHandler(object sender, BytesTransferredEventArgs e);

//....

public class BytesTransferredEventArgs : EventArgs 
{
}

Dies passiert aber nur sobald ich den Event ein Delegate hinzufüge:
Class.BytesTransferred += new BytesTransferredHandler(Form_BytesTransferred);

Das komische ist, auch wenn alles in try/catch einklammere, erhalte ich weiter die Meldung, und auch wenn ich nach der IF Anweisung den Aufruf des Events auskommentiere, kommt weiter die Meldung.

Evt. kann mir ja jmd. helfen.

Edit
Ich habs gelöst.
Ein paar Zeilen darüber wurde eine Execption geworfen, die ich nicht abgefangen habe, allerdings zeigte VS erst die nächste Zeile als Fehlerquelle an...

29.08.2006 - 18:57 Uhr

Hallo,
es stellt sich die Frage, welche Komplexilität deine Daten haben. Treten dort viele Beziehungen auf etc.

Wenn du einfach nur Daten nacheinander abspeichern musst, ohne besondere Beziehungen, ohne Updates, Inserts, Deletes etc., kannst du auch Dateien benutzen.
Dort solltest dich evt. etwas mit XML beschäftigen.

Hast du aber viele Beziehungen zwischen den Daten, z.B. eine Lagerverwaltung etc., dann würde es mehr Aufwand machen, eine Klasse zu schreiben, die deine Daten entsprechend speichern und auslesen kann. Dort kannst du lieber eine Datenbank benutzen, denn mit SQL ist der Zugriff auf die Daten sehr leicht.
Und wenn du emb. Firebird verwendest, musst du auch nur ein paar Dateien mit in den Programmordner legen, der Benutzer muss dann später nichts weiter installieren.

29.08.2006 - 17:11 Uhr

Hallo,
was du machen kannst: Einen MySQL Server runterladen und installieren.

Sofern du schon eine PHP/MySQL Umgebung lokal auf deinem PC hast, kannst du auch den MySQL Server verwenden.
Wenn du noch keinen lokalen Webserver hast, kann man in ein paar Sekunden mit xampp eine komplette Umgebung installieren, mit MySQL Server.

Als nächstes brauchst du einfach einen SQL Connector, um auf den SQL zuzugreifen, für MySQL gibt es den auf deren Website (mysql.com).
Dort sind auch Beispiele aufgeführt, wie man z.B. eine Verbindung aufbaut, und Daten abfragt.
Hast du die paar grundlegenden Befehle verstanden, um auf den Server zuzugreifen, ist es nicht viel anders in PHP. Einfach die SQL Befehle an den Server senden, und die Antwort verarbeiten, außer das man dann bei C# nicht mysql_query() etc. benutzt, sondern Klassen des MySQL .NET Connectors.

10.08.2006 - 21:13 Uhr

Hallo,
einfach mal nen Sniffer runterladen, und nachschauen wie es bei dir speziell ist.

Sobald die Verbindung aufgebaut ist, kann rein technisch jeder von beiden den ersten Schritt machen, also das erste Paket mit 'Nutz'-Daten senden (aus der Anwendungsschicht), bei manchen Server Anwendungen sendet der Server eine 'Willkommens-Nachricht', bei anderen nicht.

Wie die Verbindung aufgebaut ist, ist genau festgelegt, bei TCP geht dies z.B. über den Drei-Wege-Handshake

09.08.2006 - 22:15 Uhr

Hallo,
persönlich benutze ich den gleichen Stile wie du:

private bool _Name;
public bool Name
{
}

Oft sieht man aber in Libs (z.B. MySQLClient von mysql.com), dass Private Felder die camelSchreibweise, und das zugehörige Property die PascalSchreibweise hat, allerdings steht in den .Net Entwurfsrichtlinien, dass man Variablen nicht an deren Groß- und Kleinschreibung unterscheiden muss (also Var: name, Name, namE etc. sollte nur 1 Variable sein), denn in VB.Net gibt es kein Case-Sensetiv, also Groß-/Kleinschreibung macht keinen Unterschied.

08.08.2006 - 20:59 Uhr

Hallo,
ich habe jetzt eine Lösung gefunden.

Man definiert in der Klasse ein Property 'Items' mit dem Schlüsselwort 'new', um das Poperty von der Elternklasse zu überschreiben.
Ca. so:
public new bool Items { get { return false; } }

In der Klasse selber kann man selber dann auf auf base.Items zugreifen, oder man erstellt eine private Property für base.Items.

Schon kann von außen nicht mehr mehr auf Items zugegriffen werden.

Ist zwar nur Suboptimal, aber besser als jedes mal eine Error-Msg zu erhalten, wenn der Windows Designer wieder versucht hat, Items hinzuzufügen.

08.08.2006 - 14:16 Uhr

Hallo,
naja ich bezweifel, das man alleine in 2 Wochen ein Prog. schreiben kann, was eine Firma wirklich gebrauchen kann.
Denn die Anforderungen, die eine Firma (nicht nur ein Mitarbeiter) an eine Software stellen, sind meistens enorm, und in so kurzer Zeit eigentlich nicht zu realisieren.

07.08.2006 - 13:51 Uhr

Hallo,
hmm seh jetzt nicht so das Problem darin.

Dein Timer ermittelt, welche Computer in der Arbeitsgruppe sich befinden. Dann schaut er für jeden gefundenen Rechner, ob dieser in der ListView steht.
Wenn nicht, ist er 'Neu'.

Dafür solltest du das aber Kapseln.

Also:

  1. Objekte/Computer in der ListView in eine tmp-Variable kopieren, und ListView leeren.
  2. Computer der Arbeitsgruppe dem ListView hinzufügen, aber zuvor überprüfen ob die tmp-Variable diesen Computer bereits enthält (dann ist er nicht neu).
07.08.2006 - 13:46 Uhr

Hallo,
ein anderer Aspekt ist das Geheimnis-Prinzip.
Eine Objekt/Klasse soll nach außen nichts von seiner Implementierung verraten und nur über seine Schnittstelle (allerdings ist hier nicht ein C#-Interface gemeint) ansprechbar sein.

Mal zu den Vorteilen von Propertys:
-In der Set/Get Anweisung kannst du bestimmte Überprüfungen durchführen, ob z.B. ein gültiger Wert gelierfert wird, was bei public Variablen so nicht möglich ist.

-Mehrere Propertys können die gleiche Variable ändern. Du hast jetzt z.B. das Property 'Name', aber evt. braucht eine andere Klasse das Property 'Username', wobei beide Properties den gleichen Sinn haben, also den gleichen Wert liefern. Dies mit 1 public variable zu realiseren ist nicht möglich.

  • Ein Property kann ein Event auslösen, wenn z.B. der Wert geändert wird. Hast du einen File-Browser, wäre z.B. ein Event 'PathChanged' sinnvoll.
    Im Vorraus kannst du aber nicht immer wissen, ob evt. eine Eigenschaft mal ein Event auslöst.

  • Oft passiert es, dass du Variablen in deiner Klasse umbenennen musst, damit die Logik die hinter deiner Klasse steht, nicht zerstört wird.
    Bei einer Public Variable müsstest du jetzt aber auch alle anderen Klassen, die auf die Variable zugreifen anpassen.
    Bei Properties hast du das Problem nicht.

03.08.2006 - 18:15 Uhr

Hallo,
so habs geschafft: freu

Hier die Lösung:


using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.IO;
using System.Text;


public class Qwald
{
         [StructLayout(LayoutKind.Sequential)]
		public struct SHFILEINFO 
		{
			public IntPtr hIcon;
			public IntPtr iIcon;
			public uint dwAttributes;
			[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
			public string szDisplayName;
			[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
			public string szTypeName;
		};

		
		public const uint SHGFI_TYPENAME = 0x000000400;
		public const uint SHGFI_USEFILEATTRIBUTES = 0x000000010;
		

		[DllImport("shell32.dll")]
		public static extern IntPtr SHGetFileInfo(string pszPath, 
			uint dwFileAttributes, 
			ref SHFILEINFO psfi, 
			uint cbSizeFileInfo, 
			uint uFlags);

      public static string TypName(string fileName)
		{
			SHFILEINFO shinfo = new SHFILEINFO();
			

			
			SHGetFileInfo(fileName, 0, ref shinfo,
				(uint)Marshal.SizeOf(shinfo), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);

	
			
			return shinfo.szTypeName;
		}
}

Der Methode 'TypName' übergibt man entweder den kompletten Pfad zur der Datei, oder die Dateiendung (mit Punkt, also z.B. ".txt");
Also Rückgabe erhält man den Dateityp, bei .txt wäre es z.B. Textdokument.

Achtung:
Wenn ihr:
TypName("C:\test.txt");

so aufruft, wird es nicht funktionieren, denn das \ maskiert das t. Richtig wäre:
TypName("C:\test.txt");

oder

TypName(".txt");

03.08.2006 - 17:23 Uhr

Hallo,
hmm hab ich das so undeutlich beschreiben?

Also im Explorer (Details) gibt es eine kleine Sparte, 'Dateityp', dort steht der Dateityp von Dateien.

Bei einer .exe z.B. 'Anwendung', bei einer .cs Datei z.B. 'C# Source File' etc.

Der Dateityp ist in einer Art Datenbank (wahrscheinlich in der Registry) hinterlegt, wenn ich kein Visual Studio installiert habe, ist eine .cs Datei z.B. nicht eine 'C# Source File'-Datei.

Ich würde gerne jetzt den Dateityp, den der Explorer anzeigt, für eine bestimmte Datei auslesen.
Ich möchte als Ausgabe eine HTML-Tabelle haben, in der u.a. der Dateiname aber auch der Dateityp enthalten ist.

03.08.2006 - 17:02 Uhr

Hallo,
im Explorer sieht man ja hinter jeder Datei noch deren Dateityp, z.B. 'Anwendung' bei einer .exe Datei etc.

Mich würde jetzt interessieren, wie man den Dateityp ausliest. Dies ist bestimmt eine Funktion in der shell32.dll, aber leider half Google hier nicht wirklich weiter.

Vielleicht kennt ja einer von euch die Funktion dafür (am besten in C#).

MFG

01.08.2006 - 18:01 Uhr

Hallo,
also die ComboBoxEx muss von der ComboBox erben, da diese einige Methoden der ComboBox überschreiben/erweiteren muss.
Allerdings könnte ich es noch ein Ucl drum herum packen, ist zwar dann doppelt gemoppelt, aber wenn es dann geht.

@marsgk: Ich hab die beiden Methoden überschrieben, dennoch kann man leider per Items.Add() weitere Items hinzufügen.

01.08.2006 - 14:34 Uhr

Hallo,
ich habe eine kleine Erweiterung für die ComboBox gebastelt. Dafür habe ich eine Klasse erstellt (ComboBoxEx), die von ComboBox abgelitten ist.

Wenn ein User jetzt eine ComboBoxEx erstellt, möchte ich, dass er nur Lesezugriff auf die Items hat, aber keine hinzufügen kann.

Wie realisiere ich das?

Wenn ich per override das Items-Property überschreibem erhalte ich immer die Meldung:
"das übernommene Element '..' kann nicht überschrieben werden, weil es nicht als virtuell, abstrakt oder überschreiben markiert ist".

Wenn ich es als New makiere, kann man von außerhalb dennoch Items hinzufügen.

31.07.2006 - 16:21 Uhr

Hallo,
ich habe ein UserControl, dieses enthält eine ImageList.

Jetzt möchte ich gerne ein im Menü => Eigenschaften sichtbares Property schreiben für die Images in der ImageList.

Mein Code sieht jetzt so aus:



      private ImageList imageList = new ImageList();

		[System.ComponentModel.Category("MenuItemProperties"), System.ComponentModel.Browsable(true)]
		public System.Windows.Forms.ImageList.ImageCollection ImagesVonList
		{
			get { return imageList.Images; }
			set 
			{
				foreach(Image singleImage in value)
				{
					imageList.Images.Add(singleImage);
				}
			}
		}

Der get-Abschnitt funktioniert soweit einwandfrei, allerdings wenn ich jetzt im Menü neue Bilder hinzufüge, und das Programm starte, so sind diese in der ImageList nicht mehr gespeichert.

Wie müsste der set Abschnitt richtig für die ImageList.Images aussehen?

30.07.2006 - 17:45 Uhr

Hallo,
ich möchte gerne 2 Panels mittels Splitter variable Groß halten, dabei muss in der Mitte der 2 Panels ein fester Zwischenraum von 50 Pixel bleiben.
In diesen Zwischenraum kommen später Symbole & Buttons.

Also wenn man z.B. die größe des linken Panel verkleinert, so soll sich der Panel in der Mitte nach links verschieben (und eine Größe von 50 Pixel beibehalten), und der rechte Panel soll größer werden.

Also habe ich jetzt folgende Struktur:
Panel_Links (Left) | Splitter1 | Panel_Mitte (Left) | Splitter2 | Panel_Rechts (Fill)



|------| |--| |------|
| Text | |[]| | Text |
|      | |[]| |      |
|      | |[]| |      |
|______| |__| |______|

So wenn man jetzt Splitter1 bewegt, so ändere ich die Größe von Panel_Mitte auf 50 Pixel.

Wenn man Splitter2 bewegt, änder ich die Größe von Panel_Links & Panel_Rechts entsprechend-

Dies funktioniert soweit einwandsfrei, allerdings habe ich jetzt ein kleine Problem.

Wenn ich den Splitter1 mit der Maus anklicke, so kann ich diesen über Splitter2 ziehen.
Andersrum funktioniert dies nicht. Wenn ich also Splitter2 ziehe, so kann die gestrichelte Linie beim ziehen nicht über den Splitter1 gehen.

Weiß jmd. abhilfe?