Laden...
L
Benutzerbeschreibung

Forenbeiträge von Lord Hessia Ingesamt 497 Beiträge

08.08.2007 - 10:33 Uhr

Hallo,

hat noch niemand versucht, Databinding auf diese Weise zu verwenden?
Da ich bereits die nächste Maske in meinem Programm habe, die ebenfalls mehrere Datensätze einer Tabelle darstellen soll, ohne eine DataGridView zu verwenden, scheint mir das doch ein häufigeres Problem zu sein.

04.08.2007 - 18:15 Uhr

Hallo,

ich würde gerne die Inhalte einer Tabelle (jeder Eintrag besteht aus einem Text und einem booleschen Wert), an eine View binden. Es sollen - wie bei einem DataGridView - alle Einträge auf der Seite dargestellt werden. Allerdings würde ich gerne einfach nur CheckBoxen in mehreren Spalten nebeneinander darstellen. anstatt ein DataGridView-Control zu verwenden. Das ganze soll ungefähr so aussehen:
Text1 [] Text2 [] Text3 []
Text4 [] Text5 [] Text6 []
Text7 [] Text8 []

Das dynamische Erzeugen der CheckBoxen ist ja kein Problem. Problematisch ist aber, dass ich immer nur einen Datensatz an die View binden kann. Aktuell steht z.B. in allen CheckBoxen Text1 und sie sind entweder alle selektiert oder nicht.
Gibt es eine Möglichkeit, jeweils eine Tabellenzeile an eine CheckBox zu binden?

02.08.2007 - 17:27 Uhr

So weit, dass ein Fehler in einem der .NET-DB-Zugriffs-Klassen auftreten könnte, bin ich noch gar nicht. Der Fehler stammt direkt von der Datenbank. Er wird auch ausgegeben, wenn ich das Statement direkt auf der Datenbank-Konsole ausführe.

01.08.2007 - 12:53 Uhr

Hallo zusammen,

ich habe mich in letzter Zeit mit anderen Projekten beschäftigt, und dieses Problem hinten angestellt. Mittlerweile ist es aber wieder akut. Deshalb wollte ich noch einmal nachfragen, ob jemand eine Lösung des Problems für SQLite weiß oder zumindest eine Idee hat, warum SQLite die Lösung von Andre nicht annimmt.

Gruß Flo

13.01.2007 - 12:58 Uhr

Original von herbivore
Es lohnt nicht, das auf Verdacht oder gut Glück zu tun.

Da kann ich zustimmen. C/C++ zu lernen würde dann Sinn machen, wenn Du laufzeitkritische Dinge programmieren willst. Oder Programme für Systeme schreibst, die wenig Resourcen zur Verfügung haben.
Java unterscheidet sich von C# hauptsächlich darin, dass hinter C# ein viel größeres Framework steckt, während man bei Java viele Fremdbibliotheken benötigt. Erst wenn Du in den Bereich Webentwicklung gehst, gibt es große Unterschiede aufgrund der Vielzahl an Frameworks für die Webentwicklung mit Java.

Ach ja, Java-GUIs sind mittlerweile nicht mehr zwangsläufig hässlich, wie regen gemeint hat.

11.01.2007 - 21:58 Uhr

Hallo, ich bin seit langer Zeit auch mal wieder hier.

Ich setze in meinem Programm einen HttpListener ein, der eine Konfigurationswebseite anzeigt. Man kann auf der Webseite einige Dinge ändern und nach erfolgreicher Änderung der Konfiguration zeigt eine Webseite den Erfolg an.
In unregelmäßigen Abständen (manchmal bereits beim ersten Aufruf der Konfig-Webseite, manchmal erst beim fünften) wird eine HttpListenerException geworfen.
Könnt ihr nachvollziehen, woran das liegt?

Der Code sieht folgendermaßen aus:

/// <summary>
/// Startet einen lokalen, programminternen Webserver, der an den uebergebenen URLs lauscht.
/// </summary>
/// <param name="urls">URLs, die ueberwacht werden sollen. Es werden die uebergebenen URLs
/// und alle untergeordneten URLs beobachtet</param>
private static void listenAt(string[] urls) {
  if (!HttpListener.IsSupported) {
    log.Warn("Die bequeme Konfiguration ueber den Webbrowser " +
          "funktioniert nur unter Windows XP SP2 or Server 2003.");
    return;
  }
  
  if (urls == null || urls.Length == 0) {
    log.Warn("Es wurde keine Konfigurations-Webseite registriert. " +
                "Sie koennen das Programm somit nur ueber direktes " +
                "Bearbeiten der config.xml-Datei konfigurieren.");
    return;
  }
            
  // Existiert bereits ein Listener? Dann diesen zunächst killen
  if (httpListener != null) {
    httpListener.Stop();
  }
  
  // Neuen Listener erzeugen und alle URL-Prefixes hinzufuegen
  httpListener = new HttpListener();
  foreach (string url in urls) {
    httpListener.Prefixes.Add(url);
    log.Info("Der HTTP-Listener wird gestartet und wartet auf Anforderungen " +
               "der Konfigurations-Webseite unter " + url + "config");
  }
  
  try {
    httpListener.Start();
    while (true) {
      // Note: The GetContext method blocks while waiting for a request.
      HttpListenerContext context = httpListener.GetContext();
      HttpListenerRequest request = context.Request;
      
      if (request.Url.AbsoluteUri.Contains("close")) {
        // Die URI enthaelt "close", wenn die Konfiguration bearbeitet wurde
        bool configChanged = false;
        
        // Lesen der eingegebenen Daten
        Stream body = request.InputStream;
        StreamReader reader = new StreamReader(body, Encoding.UTF8);
        
        String newConfig = reader.ReadToEnd();  // HIER TRITT DER FEHLER AUF
        configChanged = appSettings.updateConfig(newConfig);
	
        // Bestaetigung anzeigen, ob Konfiguration geaendert wurde
        HttpListenerResponse response = context.Response;
        // Construct a response.
        string responseString = appSettings.createConfigChangeResultPage(configChanged);
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
        // Get a response stream and write the response to it.
        response.ContentLength64 = buffer.Length;
        System.IO.Stream output = response.OutputStream;
        output.Write(buffer,0,buffer.Length);
        output.Flush();
        output.Close();
        response.Close();
        
        body.Close();
        reader.Close();
        
        // TODO: Wie kann man hier den Request schließen? In der MSDN steht:
        // If you are finished with the request, it should be closed also.
      }
      else if (request.Url.AbsoluteUri.Contains("config")) {
        // Die URI enthaelt "config", wenn die Konfigurationswebseite angezeigt werden soll
        HttpListenerResponse response = context.Response;
        // Construct a response.
        string responseString = appSettings.createConfigPage();
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
        // Get a response stream and write the response to it.
        response.ContentLength64 = buffer.Length;
        System.IO.Stream output = response.OutputStream;
        output.Write(buffer,0,buffer.Length);
        output.Flush();
        output.Close();
      }
    }
  }
  catch (Exception ex) {
    log.Error(ex.ToString());
  }
  finally {
    httpListener.Stop();
  }
}

Folgende Exception wird an der Stelle "HIER TRITT DER FEHLER AUF" gefeuert:
System.Net.HttpListenerException: Es wurde versucht, auf eine nicht vorhandene N
etzwerkverbindung zuzugreifen
at System.Net.HttpRequestStream.Read(Byte[] buffer, Int32 offset, Int32 size)

at System.IO.StreamReader.ReadBuffer()
at System.IO.StreamReader.ReadToEnd()
at StockQuoteFilter.App.listenAt(String[] urls) in c:\Dokumente und Einstellu
ngen\Admin\Eigene Dateien\SharpDevelop Projects\StockQuoteFilter\App.cs:line 397

08.12.2006 - 13:50 Uhr

Einfach ein "GROUP BY ItemNo" an das SQL-Statement dranhängen

05.12.2006 - 10:58 Uhr

Hast Du das Problem mittlerweile gelöst?
Ich sehe die Stelle in Deinem Statement nicht, wo der Parameter eingefügt wird und die Geschichte mit dem Value kapiere ich auch nicht.

Du meinst wohl eher so etwas:

OdbcDataAdapter odbcadapter = new OdbcDataAdapter("select * from news where startdate between @p1 and now() and enddate >= now()", connection);
odbcadapter.SelectCommand.Parameters.Add("@p1", startDate);
18.11.2006 - 14:10 Uhr

Wenn Deine Frage also lautet, wie man einen Datenbankzugriff schreibt, der austauschbar ist, dann kann ich Dir diesen Artikel empfehlen: http://www.microsoft.com/germany/msdn/library/net/adonet/SchreibenEinerPortierbarenDatenzugriffsschicht.mspx?mfr=true

17.11.2006 - 11:18 Uhr

Hallo Joerg,

Dein Beitrag hat mir trotzdem sehr geholfen, da man das substr() von SQLite genauso verwenden kann, wie ich festgestellt habe. Damit klappt's:

UPDATE ingredient_juice SET color = substr(color, 3, 6);

Gruß Flo

17.11.2006 - 00:52 Uhr

Wie ist es in SQL möglich, den Wert eines Feldes mit einem Substring dieses Wertes zu ersetzen.
In meiner Datenbank stehen zur Zeit für Farbangaben Werte wie 0x123456 oder 0xFFFFFF in der Spalte Color. Ich würde daraus gerne 12345 und FFFFFF machen.

Folgender Versuch hat nicht funktioniert:


create table temp(id integer, newcolor varchar(6), color varchar(8));
INSERT INTO temp SELECT id, substr(color, 3, 6) AS newcolor, color FROM ingredient_juice;
UPDATE ingredient_juice SET color = (SELECT newcolor FROM temp WHERE ingredient_juice.id = temp.id);

Ich nehme mal an, dass die WHERE-Klausel des Updates das Problem ist, weiß aber keinen besseren Weg.

Habt Ihr bessere Ideen - evtl. auch ohne temporäre Tabelle?

Ach ja, ich verwende SQLite - es steht also kein TSQL oder so zur Verfügung.

16.11.2006 - 15:40 Uhr

LEFT JOIN müsste eingetlich das sein, was Du willst.

15.11.2006 - 17:28 Uhr

Ok, ich habe mittlerweile den Grund für das falsche Verhalten gefunden.
Es handelt sich bei dem beschriebenen Verhalten offenbar um einen Bug. Sobald eine ComboBox irgendwo anders als in der höchsten Menüebene hinzugefügt wird, so zeigt sie keine Daten an, die per DataSource an das Control gebunden wurden.

Die einzige Möglichkeit, das ganze zu umgehen, ist es, die Daten "per Hand" in die ComboBox einzutragen.

s. auch http://www.vbdotnetforums.com/showthread.php?p=38024

14.11.2006 - 18:05 Uhr

Ich würde gerne nochmal nachhaken. Die beschriebene Vorgehensweise funktioniert bei mir nicht. Trotz der Zeile


toolStripComboBox.ComboBox.DataSource = new string[] {"abc", "def", "ght"};

bleibt die ComboBox im Menu leer. Woran kann das liegen?

12.11.2006 - 18:30 Uhr

Da hast Du Recht. Das passiert dann, wenn man versucht, für das Beispiel einfachere Variablennamen zu erzeugen. Habe es geändert.

Aber nun sind unsere Beispiele gleich und wie gesagt, bei mir geht das so nicht (die ComboBox bleibt leer). Bist Du sicher, dass es funktionieren müsste?

11.11.2006 - 19:42 Uhr

Ich möchte an eine ToolStripComboBox eine DataTable binden.
Die ToolStripComboBox selber hat ja keine DataSource-Eigenschaft, sie besitzt jedoch eine ComboBox-Eigenschaft, die wiederum DataSource besitzt.

Leider bleibt die ComboBox aber bei folgendem Code leer:


DataTable dt = IngredientDal.getAllIngredientsAsDataTable(IngredientType.Juice);
// dt enthält Einträge: Console.WriteLine(dt.Rows.Count) gibt 90 aus
this.toolStripComboBox.ComboBox.DataSource = dt;

// Ingredientname und ID kommen in der DataTable vor
this.toolStripComboBox.ComboBox.DisplayMember = "Ingredientname";
this.toolStripComboBox.ComboBox.ValueMember = "ID";

Hat jemand von Euch schonmal eine DataTable an eine ToolStripComboBox gebunden und kann mir sagen, wie das geht?

10.11.2006 - 12:54 Uhr

Das würde nur bei einer statischen Klasse funktionieren.
Bei nicht statischen Klassen musst Du zunächst ein Objekt anlegen und auf diesem die Methode aufrufen.
Class1 objektVonClass1 = new Class1();
objektVonClass1.MyVoid();

=> s. z.B. auch Kapitel 6 in diesem Buch: http://www.galileocomputing.de/openbook/csharp/

10.11.2006 - 12:48 Uhr

Hallo Andre,

vielen Dank, der Ausdruck sieht ja schonmal ziemlich beeindruckend aus und ich habe ihn wohl mittlerweile auch verstanden. Allerdings bekomme ich den Fehler:
no such column: d.Ingredient_ID (es ist kein Schreibfehler, bei mir heißt die Spalte Ingredient_ID mit "_")

Dabei enthält die Tabelle, auf die die Bedingung angewendet wird, sehr wohl eine solche Spalte. Evtl. liegts daran, dass SQLite Probleme mit zu vielen JOINs hat. Weiß da jemand etwas drüber?

Dass es mehrere Zutaten mit der gleichen Menge geben kann ist mir klar, allerdings ist es mir dort egal, welche ausgewählt wird. Da müsste ein einfaches GROUP BY Cocktailname reichen.

10.11.2006 - 01:33 Uhr

Ich kämpfe gerade mit einem SQL-Ausdruck. Wer eilt mir zur Hilfe?

Es gibt drei Tabellen:
Cocktail (ID, Cocktailname)
Insertion_Juice (Cocktail_ID, Ingredient_ID, Quantity)
Ingredient_Juice (ID, Ingredientname)

In Insertion_Juice stehen also zwei Fremdschlüssel. Cocktail_ID verweist auf Cocktail.ID und Ingredient_ID auf Ingredient_Juice.ID

Folgendes soll selektiert werden:
Planter's Punch | 6 cl Ananassaft
Kiba | 10 cl Kirschsaft
Mein Cocktail | 28 cl Karottensaft
usw.

Ich hätte also gerne den Cocktailnamen aus Cocktail, die Menge aus Insertion_Juice und den Namen der Zutat aus Ingredient_Juice - so weit kein Problem, allerdings gibt es auch Cocktails, die keinen Saft enthalten, deren ID also in Insertion_Juice gar nicht auftaucht. Diese sollen allerdings auch angezeigt werden (Problem I). Außerdem soll - als Schmankerl so zu sagen - nur immer ein Saft pro Cocktail angezeigt werden und zwar der mit dem höchsten Wert bei Quantity (Problem II).

Das Programm, dass u.a. diese SQL-Abfrage enthält, gabs schonmal als WinApi-Version und da hatte ich mit vielen temporären Datenbank-Tabellen gearbeitet, aber das würde ich dieses Mal gerne umgehen.

Mein Statement sieht bislang so aus - die beiden Probleme werden dadurch aber nicht gelöst.

 SELECT Cocktailname, insertion_juice.Quantity, ingredient_juice.Ingredientname
FROM cocktail LEFT JOIN insertion_juice ON cocktail.ID = insertion_juice.Cocktail_ID
JOIN ingredient_juice ON ingredient_juice.ID = insertion_juice.Ingredient_ID
10.11.2006 - 01:03 Uhr

Mh, also das ist eine ziemlich grundlegende Frage für alle OO-Sprachen. Ich nehme also an, dass Deine bisherigen Programmiererfahrungen keine Objektorientierung umfassen. Deshalb solltest Du Dir schon ein buch zum thema gönnen.

Als Einstieg wird hier meistens folgendes Buch empfohlen: http://www.galileocomputing.de/openbook/visual_csharp/index.htm (weil fast alles drin und kostenlos)

Zu Deiner Frage: Ohne den näheren Verwendungszweck zu kennen, würden mir folgende Möglichkeiten einfallen:

  • Die Klasse (geht erst ab .NET 2.0) oder zumindest ihre Methoden und Properties (geht auch schon vor .NET 2.0) statisch machen, dann kannst Du von überall auf ihre Methoden und Properties zugreifen, wenn Du ihren Namespace inkludiert hast
  • Ein Objekt von Class1 in Form1 erzeugen und dieses verwenden
  • Eine zentrale Klasse erzeugt sowohl ein Objekt von Class1 als auch alle Formulare und übergibt diesen das Class1-Objekt
24.10.2006 - 16:07 Uhr

Kannst Du nicht einfach mehrere Tabs öffnen?

24.10.2006 - 15:12 Uhr

Hast Du es schonmal mit exception.GetBaseException().Message versucht?

22.10.2006 - 19:56 Uhr

Ja, sehr gut!

22.10.2006 - 16:01 Uhr

Da waren wohl die falschen Nutzer online 🙂
Ich fand den Link auch immer sehr praktisch (eigentlich mein einziger Einstiegspunkt neben der Suchfunktion). Warum ist der denn verschwunden? Und hilft es, wenn wir ganz lieb darum bitten, dass er zurück kommt?

16.10.2006 - 00:56 Uhr

Ich wollte mein Programm aus Lerngründen mehrsprachig machen. In meinem C#-Buch steht, dass man zunächst ne txt-Datei mit allen Strings erzeugen und dann durch den Resource File Generator "resgen" in eine resX-Datei daraus generieren soll. Leider bekomme ich bei einem Aufruf über die Kommandozeile die Fehlermeldung, dass resgen nicht vorhanden sei. Resgen scheint auch auf der gesamten Platte nicht vorhanden zu sein - wo sollte sich diese Datei im Normalfall denn befinden?

01.10.2006 - 01:42 Uhr

Hallo JAck30lena,

also ne ArrayList halte ich nicht für besonders optimal. Wenn man mit C# anfängt und man von der Generics-Syntax verwirrt wird, dann hat sie evtl. eine Berechtigung. Sonst bin ich der Meinung, dass man (unter .NET2.0) möglichst selten die gute alte ArrayList benutzen sollte.
Eine generische Liste hat zum einen der Vorteil, dass sie typsicher ist (d.h. der Compiler meckert, wenn Du etwas anderes als den erwarteten Typ hinzufügen willst) und zum anderen muss keine Konvertierung vorgenommen werden.
Und wenns schnell gehen soll und trotzdem typsicher sein muss, dann - wie gesagt - bei Strings die StringCollection verwenden. Die hat allerdings keine sort-Methode.

01.10.2006 - 01:15 Uhr

Da gabs gerade erst einen Thread zu. Dort wird zwar keine Lösung vorgestellt, aber ein Link auf pdfSharp angegeben: PDFSHARP wie einbinden? - vielleicht hilft Dir das ja.

01.10.2006 - 01:10 Uhr

Das ist aber ein sehr allgemeiner Wunsch. Weshalb wohl auch noch keiner geantwortet hat. Wofür benötigst Du denn eine Anleitung? Für das Erstellen der Anwendung? Der Datenbank? Das Anbinden der Datenbank? Das Ausführen der Anwednung auf anderen Rechnern? Den Abgleich mit dem Server (was stellst Du Dir da genau vor)?

01.10.2006 - 01:07 Uhr

Warum die generische Liste? Ich würde einfach ne StringCollection nehmen. Zu finden im Namespace System.Collections.Specialized

28.09.2006 - 21:08 Uhr

Also ich finde die Exceptions in der Regel ziemlich eindeutig und mit aussagekrätigen Fehlermeldungen versehen. Es mag Ausnahmen geben, aber dass in der MSDN mehr drinsteht liegt in der Natur der Sache. Und natürlich schadet es nie, spätestens bei einem Fehler (meistens auch schon früher) einen Blick in die MSDN zu werfen.

28.09.2006 - 18:56 Uhr

Original von JunkyXL
Das hätte auch als Info dabei stehen können..

Schon. Du musst aber zugeben, dass es auch einer gewissen Logik nicht entbehrt. Woher soll denn sonst bekannt sein, welche Klasse Du meinst? Du kann ja mehrere gleichnamige Klassen im Projekt haben, die sich nur durch den Namespace unterscheiden.

28.09.2006 - 17:43 Uhr

Das Thema heißt Reflection. Mit diesem Suchbegriff kannst Du Dich hier im Forum schon ein paar Stunden befassen 🙂

28.09.2006 - 13:18 Uhr

Du musst die Rückgabe von GetUserData ja auch irgendwie weiterverwenden. Aktuell wird sie einfach verworfen.
Statt:

Service.GetUserData("'PersonID'=12345");

so etwas:

UserData userData = Service.GetUserData("'PersonID'=12345");

und dann mit userData weiterarbeiten (Der Typ UserData ist natürlich nur geraten, Du hast die besseren Möglichkeiten, herauszufinden, was GetUserData zurückgibt)

28.09.2006 - 13:14 Uhr

Könnte völlig daneben sein, da ich mit #Develop arbeite und das hervorragende NSIS zum Setup-Erstellen verwende, aber hast Du auch auf Release umgestellt?

28.09.2006 - 13:10 Uhr

Danke sheitman,

werde mit meinem neu erworbenen Wissen gleich mal irgendwo angeben gehen 😁

28.09.2006 - 13:07 Uhr

Bist Du denn sicher, dass eine Exception geworfen wird? Kann ja auch sein, dass alles glatt geht und einfach das Programm direkt nach dem geposteten Code-Abschnitt "normal" beendet wird.

28.09.2006 - 02:02 Uhr

Original von sheitman
@lord hessia
bitweiser vergleich ist meienes erachtens nach nur bei zahlentypen zumindest und java auch 100% so
das && abricht sobald ergebnis fest ist bei java 100% so und bei bei c++ mit großer wahrscheinlichkeit

War der erste Satz eine Antwort auf meine Frage ob das mir bislang unbekannte Verhalten von & für boolsche Werte eine "Erfindung" von C# ist? Dann habe ich ihn nämlich nicht verstanden. Vielleicht ist es schon zu spät.
Den zweiten Satz habe ich verstanden und unterschreibe ich 😉

27.09.2006 - 16:38 Uhr

@Linus: Die Abfrage auf != null musst Du nicht von mir übernehmen, da Du - bei Verwendung der while-Schleife (über die wir ja am Anfang diskutiert haben) - schon absicherst, dass OUTP auf keinen Fall null sein kann.

Das Beispiel war nur gedacht, um Dir zu zeigen, wo der Unterschied zwischen && und & liegt. Denn, auch wenn meine Aussage ja so einige Fehler hatte, so trifft immerhin die Aussage zu, dass bei && nur der erste Operand geprüft wird, wenn dessen Wert false ist, bei & aber trotzdem noch der zweite. Die Begründung aber, warum das so ist, die solltest Du (zumindest für C#) eher in dem Zitat suchen, dass marksgk gepostet hat als in meinem Text 😉

27.09.2006 - 16:31 Uhr

Original von marsgk
Denn der &-Operator auf bool angewandt führt keinen binären Vergleich durch, sondern einen logischen wie der &&-Operator. Nur mit dem Unterschied, dass beide Seiten immer ausgewertet werden.

Hallo marsgk,

vielen Dank für die Information. Das wusste ich nicht. Ist das eine Besonderheit von C#? Ich habe das bei C++ oder Java nämlich noch nie gehört...

27.09.2006 - 13:49 Uhr

Wenn Du in html-Tags etwas ersetzen willst, warum machst Du das dann auf Wortbasis? Da wäre doch .* oder eher .*? viel besser...

27.09.2006 - 13:07 Uhr

Dann kannst Du natürlich auch keine Methoden aufrufen 🤔

Das ist aber genau das, was Du willst, wenn Du dem WebService Daten mitgeben musst.

27.09.2006 - 12:10 Uhr

Du kannst doch den Code Deines Vorgängers 1-zu-1 übernehmen.

27.09.2006 - 12:01 Uhr

Hat denn Dein WebService üerbaupt Methoden bzw. sind die public?

Nebenbei. Eine Property setzt Du nicht so

Instanz1.PersonID("12345");

sondern so

Instanz1.PersonID = "12345";
27.09.2006 - 10:42 Uhr

Ok, sheitman hat das ganze in der halben Zeit und mit der Hälfte des Textes auch beschreiben können...

27.09.2006 - 10:38 Uhr

Ok, dann kann ich doch nicht an mich halten. Natürlich funktioniert es, aber es ist nicht das, was Du willst. Es ist zwar nett, wenn die richtigen Ergebnisse rauskommen, aber auch der Weg zum Ergebnis sollte richtig sein. Kein Mensch fährt über München wenn er von Frankfurt nach Basel will, obwohl er auch ankäme und das Ergebnis das gleiche wäre.

if (OUTP.Contains(input) &! OUTP.Contains("textbaustein"))

Bei diesem Ausdruck geschieht folgendes:

  • OUTP.Contains(input) => wird ausgewertet zu true oder false, in der Folge als boolean_a bezeichnet
  • OUTP.Contains("textbaustein") => wird ausgewertet zu true oder false, in der Folge als boolean_b bezeichnet
  • ! OUTP.Contains("textbaustein") => boolean_b wird negiert, in der Folge als boolean_bneg beteichnet
  • OUTP.Contains(input) &! OUTP.Contains("textbaustein") => boolean_a und boolean_bneg werden binär UND-verknüpft. D.h. true wird als 0000 0000 0000 0001 und false als 0000 0000 0000 0000 angesehen. Die UND-Verknüpfung sorgt dafür, dass Stellen, die sowohl bei boolean_a als auch bei boolean_bneg 1 sind auch im Ergebnis 1 sein, alles andere wird zu 0.
    Das ergibt, dass nur aus true & true (also 0000 0000 0000 0001 und 0000 0000 0000 0001) wieder true wird. Im Prinzip genau das, was Du willst.

In diesem speziellen Fall funktioniert es also, aber schon bei folgendem Ausdruck würde es gewaltig auf die Schnauze fallen:

if (OUTP != null &! OUTP.Contains("textbaustein"))

Ein Unterschied zwischen binären (&) und logischen (&&) Operatoren ist nämlich, dass logische nur immer so weit ausgewertet werden, wie unbedingt nötig. Im obigen Fall würde das Ergebnis also bereits zu false ausgewertet, wenn OUTP null ist. Dadurch würde der zweite Teil (OUTP.Contains.. ) nicht mehr angefasst, was andernfalls auch ne Null-Pointer-Exception erzeugen würde.

Ich nehme mal an, dass Du nur für Dich selber programmierst, aber trotzdem solltest Du auch noch bedenken, dass Leute, die Deinen Code lesen ungefähr folgende Gedankengänge durchmachen müssen, um es zu verstehen, während bei Verwendung eines && alles klar wäre 🙂

Und hier noch ein netter Text zu Datentypen in C#: http://de.wikibooks.org/wiki/Programmierkurs_C-Sharp:_Datentypen

27.09.2006 - 09:40 Uhr

Friedel hat es ja schon gezeiogt, wobei man es in der Regel aber genau andersherum macht. D.h., dass man immer den Konstruktor mit den meisten Parameter aus denen mit weniger Parametern heraus aufruft und die fehlenden Parameter mit Standardwerten belegt.

26.09.2006 - 17:37 Uhr

Ja, meine Aussage war mehr so gemeint, dass es ja nicht in Frage kommt, wenn Du auf jeden Fall C# einsetzen willst / musst, da Du beim Einsatz des Eclipse-Frameworks (nicht der Entwicklungsumgebung) ein Java-Programm schreiben müsstest.

Nur der Vollständigkeit halber:
RCP - Rich-Client-Platform
EMF - Eclipse Modelling Framework

26.09.2006 - 17:14 Uhr

Entwickelst Du eine Forms- oder Web-Anwendung?

26.09.2006 - 17:12 Uhr

Oder um es nochmal anders auszudrücken: foo ist für Funktionen das, was bei der GUI Form1 ist: Der Entwickler war einfach nicht kreativ oder motiviert genug, sich einen sinnvollen Namen auszudenken.

26.09.2006 - 16:29 Uhr

Original von Linus
ps.: dabei fällt mir auf, dass man die beiden if noch zusammen basteln könnte 🙂

Oder es ganz weglassen, wenn Du while statt do while verwendest, so wie es in meinem Post von 11:17 steht...

Mich wundert, dass das hier funktionieren soll:

if (OUTP.Contains(input) &! OUTP.Contains("textbaustein"))

& steht für ein binäres UND. Das logische UND, das Du meinst, wird durch && beschrieben.
Außerdem solltest Du Dir angewöhnen, das ! zur Negation immer direkt vor den zu negierenden Ausdruck zu schreiben, also

!OUTP.Contains("textbaustein")

Aktuell sieht es so aus, als ob das &! zusammengehörte.

P.S.: Man kann jetzt wieder lange drüber diskutieren, warum das & evtl. doch funktionert, obwohl es nicht das ist, was Du willst, aber das haben wir ja bereits an anderer Stelle zu einem anderen Thema getan und das hat Dir ja eher weniger als mehr geholfen, deshalb wollten wir es dieses Mal evtl. unterlassen 🙂