Laden...

Forenbeiträge von AndiBar Ingesamt 65 Beiträge

20.07.2007 - 15:43 Uhr

Hallo schillerdeluxe!

Vorm gleichen Problem stand ich vor ein paar Tagen.
Soweit ich weiß, laufen die Timer immer in einem eigenen Thread. Um im elapsed-ereignis auf Objekte anderer Threads zugreifen zu können (bei mir wars ein Control in meinem GUI), musst du das timer.SynchronisingObject auf deinen aktuellen thread festlegen.
Also quasi t.SynchronizingObject = this

Gruß, Andi

19.07.2007 - 11:05 Uhr

Sonst gäbe es auch noch die button.performClick-Methode, die ein Click-ereignis generiert. Wenn es das ist, was du willst.

Gruß, Andi

18.07.2007 - 09:00 Uhr

Hehe, der Antikettenbrief ist auch deshalb sehr witzig, wei er direkt nach dem Funkspruch-Hoax gepostet wurde 😉 Sieht fast nach ner Antwort aus g

Ich persönlich finde die Englische Variante lustiger...die is einfach schön kurz und knackig. --->Link

Gruß, Andi

16.07.2007 - 15:06 Uhr

@Herbivore

Ah, stimmt ja, dann sind die natürlich fest. Ich könnt mir trotzdem vorstellen, dass in den EventArgs die Lösung liegt. In denen wird doch bestimmt eh transportiert, was robertico als dritten Parameter in die DoEvent-Funktion ausgelagert hat, oder?

[edit]
Hab mir grad mal die MouseEventArgs herausgepickt und angeschaut...bei denen lässt sich durch die Properties schon was unterscheiden.

Gruß, Andi

16.07.2007 - 14:56 Uhr

Nochmal kurz Problembeschreibung: Du möchtest mit sämtlichen Events die gleiche Funktion auslösen, dabei aber wissen, von welcher Aktion/welchem Event die Funktion ausgelöst wurde, soweit richtig?

Ich denke, du könntest dir deine eigene EventArgs-Klasse herleiten. Mit der übergibst du dann die Information, welches Event grad gefeuert hat.
So komplett der Sinn erschließt sich mir da aber momentan auch grad nicht. Was DoEvent machen soll wär mal interessant 🙂

Gruß, Andi

13.07.2007 - 10:44 Uhr

Klingt sehr schlüssig.
Bin ja auch selber schuld, dass ich es etwas zweckentfremde, da muss man dann halt selber ran 😉

13.07.2007 - 10:24 Uhr

@Mr.Sparkle

Je nun, wenns zum Konzept gehört ist das dann halt so, danke für die Info.

Ich werde dann einfach einen Lauscher bauen, der kontinuierlich den Gameport abhört (polled) und meldet (Event), wenn sich der Keystatus ändert. Heruntergebrochen auf eine Taste und ein Event klappts auch schon gut.

Ich dachte halt, dass dieser Lauscher evtl schon bei DirectInput drinsitzt.

Gruß, Andi

12.07.2007 - 11:25 Uhr

Servus,

Ich habe hier ein quasi selbstgebasteltes Gamepad (Soll mal ein Fußschalter für eine Gerätesteuerung werden). Wird auch als solches erkannt, als Gamecontrol in die Systemsteuerung eingebunden, alle vier Tasten funktionieren, wie sie sollen.

Die Eingaben des Gerätes möchte ich nun daher per DirectInput schnappen und an das entsprechende Programm weitergeben; die einzige Möglichkeit, die ich dafür bislang sehe (und auch soweit implementieren konnte) war die kontinuierliche Abfrage über die Device.Poll-Funktion, timer-gesteuert periodisch halt.

Sollte das nicht auch einfach über Events möglich sein? Taste gedrückt, event feuert? HitmanII hat das anscheinend irgendwie hinbekommen (zum Thread), schreibt aber nicht, ob per directInput oder anders und ist schon über ein halbes Jahr nicht mehr hiergewesen...

Hat jemand von euch evtl. einen Tip?

[edit]
Wobei ich mir grad überlege, dass es eh einen ständigen Horcher/Poller am Gameport geben muss, der bei Statusänderung diese events feuern würde oder? Die Frage ist halt, ob es einen solchen schon gibt , ansonsten verschiebt sich das Problem ja nur ne Ecke nach hinten und ich hab nichts davon...also doch Timer im Programm. Denk ich da richtig?

Gruß, Andi

11.07.2007 - 17:44 Uhr

Hajo, da sind ja doch einzwei Groschen gefallen, respekt 😁 👍 Dezimal wärs halt genauso (gibt halt drei Typen, solche die Zählen können und solche dies nich können)

Wie auch immer, der Scherz is erstmal fett zerredet, dafür die Diskussion ziemlich witzig gg

Schönen Feierabend!

11.07.2007 - 15:56 Uhr

@herbi
ldr hat den entscheidenden Teil markiert 😉

[edit] witze erklären is blöd 😉

11.07.2007 - 15:39 Uhr

Ich dachte es gibt 11 Arten? Die, die binär zählen können und die, dies nicht können 😉

10.07.2007 - 16:42 Uhr

Als Nutzer finde ich ein solches Verhalten furchtbar.
Grade auf dem Desktop, auf dem man zumindest über die Symbole eine ordnende Kontrolle haben möchte. Die SonyEricson Handy-Software macht irgendwie genau das...legt ein Icon auf den Desktop, das du mit Bordmitteln nicht wegbekommst. Nervt. Aber kannst die ja mal fragen, wie die das gemacht haben 😉

Wenns ein öffentliches Terminal ist, ist das natürlich was anderes. Da soll ja keiner so einfach rumpfuschen. Aber dafür gibts dann halt wie gesagt die Nutzerberechtigungen.

Gruß, Andi

05.07.2007 - 15:35 Uhr

Naturtalent 😉

Kürzlich wurd ein 2-jähriges Mädel in MENSA aufgenommen, es ist also vieles möglich 😉

Gruß, Andi

03.07.2007 - 15:55 Uhr

Haferflocken und Eiweiß mixen, dranschmieren, trocknen lassen 😁

02.07.2007 - 15:07 Uhr

Jup, den Arrayindex brauche ich als Parameter für andere Funktionen. Aber für die Zukunft merk ichs mir.

@jstolz:
Kurzer Einfall: Die Typabhängikeit kann man sich ersparen, wenn man statt "Button" einfach das übergeordnete "Control" nimmt.


Control blubb = sender as Control;
blubb.Name;

Gruß, Andi

02.07.2007 - 14:51 Uhr

Könntest die Buttons in ein Button[]-Array packen.
Dann beim event ne for-Schleife laufen lassen, wo du abfragst, welcher Button der sender war. In etwa wie folgt:



Button clickedButton = sender as button;

for(int i = 0; i<ButtonArray.GetLength(0)); i++)
{
   if(clickedButton == ButtonArray[i]) {return i;}
}


Das gäbe dir den Arrayindex des geklickten Buttons zurück, die Rückgabe kannst natürlich so gestalten, dass du was damit anfangen kannst.

[edit]
@jstolz
Hui, cool, das is mal eleganter als mein Ansatz. Feine Sache. Muss ich gleich mal schaun, ob ich das bei mir einbauen kann, da ich mit meinen Arrays doch ziemlich viel nebenher mache.

Gruß, Andi

02.07.2007 - 11:50 Uhr

Servus,

ich weiß, C# und Treiberentwicklung passt nicht so wirklich zusammen, aber vielleicht kennt ja jemand eine gute Ressource zum Thema Treiberentwicklung (speziell USB), DDK etc.

Hier gibts schonmal einen ganz netten Überblick, incl. der, naja, Hiobsbotschaft, dass Treiberentwicklung am besten unter C, evtl. auch C++ geschieht. Hab mit beidem, grade mit C, noch kaum Erfahrung.

Konkret soll demnächst einen kleinen USB-Fußschalter an ein Gerät und seine Software anbinden(PC-Windows basierend) und hab bislang kaum Ansatzpunkte zur Recherche. Auf Amazon hab ich zumindest wenig bis nichts passendes gefunden, Google war (bis auf den Wiki-Link) bislang auch nich so arg helfend.

Gruß, Andi

29.06.2007 - 11:54 Uhr

Kleine zusätzliche Idee:

Es gäbe auch noch DataGridView.CurrentCell
Das sollte ja immer die geklickte/doppelgeklickte sein, wenn du im Click-Event deren Spaltenindex überprüfst, kannst du mit der dann gleich weiterarbeiten und hast dann auch gleich die passende Reihe für deine XML-Informationen.

Gruß, Andi

29.06.2007 - 11:17 Uhr

Hallo Citizen.ron,

Man kann die Usersettings ja sehr einfach wieder überschreiben. Einfach einen reset-Knopf bauen, der ein Settings-Objekt erzeugt. Dann sollte das per Zuweisung schnell wieder drin sein.


MyNamespace.Properties.Settings MeinSettingObjekt = new MyNamespace.Properties.Settings();

MeinSettingObjekt.gewähltesUserSetting = MeinSettingObjekt.passenderAppConfigDefaultwert;

Das sollte es dann schon gewesen sein. Ist zwar jetz nich getestet und voneinem Anfänger(mir), hab mich aber auch grad damit auseinander setzen müssen. In meinem Setting-Objekt sind jedenfalls alle Einstellungen, egal ob Anwendungs- oder User-geflaggt als Property vorhanden und können dementsprechend verwertet werden.

Gruß, Andi

20.06.2007 - 12:09 Uhr

Du liebe Zeit, ja richtig!

Als properties stehn sie ja im settings.Designer, da bin ich doch schonmal drüber gestolpert. Gnarf. Da wird einmal "gegettet" und das wars dann.
Wieder einmal ein Grund, dass man eigentlich alles selber schreiben sollte...

Super, danke für die Aufklärung! 🙂

Gruß, Andi

P.S
wobei beim mysettings.reload doch eigentlich wieder auf die properties zugegriffen werden müsste oder? Werd das mal eben im Debugger überprüfen.

20.06.2007 - 11:06 Uhr

Original von SeboStone
Soweit ich weiss werden die settings zwar gespeichert (überprüfe mal die Datei selbst), aber Deine Array wird dadurch nicht automatisch mit den neuen Daten gefüllt!

Das ist eben das, was ich beobachtet hab. Wundern tuts mich trotzdem, da die mysettings.Choice-Strings die Änderungen übernehmen. Und im Array wird ja auf genau die verwiesen. Da ist ja nichts hart reingeschrieben, da stehn ja nur die Verweise.

Naja, is jetz halb so tragisch, mir fallen auf Anhieb mehrere Workarounds ein, vom (von dir genannten) Neuerzeugen des Arrays bis zum Raussschmeißen des Arrays und der Schleife und dann halt Einzelabfragen der Radiobuttons(sind ja nur drei)...mich würd nur mal das "wieso" interessieren.

Gruß, Andi

20.06.2007 - 10:39 Uhr

Hallo,

ich habe hier ein Array, welches drei Strings enthält, die ich mir aus den UserSettings lade, das geschieht im Konstruktor der Form:



Project.Properties.Settings mysettings = new Project.Properties.Settings();

string[] Choices = new string[] {mysettings.Choice1, mysettings.Choice2, mysettings.Choice3}


Die Strings werden im folgenden nach Nutzereingaben über Textboxen umgeformt, der Nutzer wählt über Radiobuttons aus, welchen er bis zur nächsten Änderung verwenden will. Dieser wird in einem weiteren Usersetting "string CurrentChoice" gespeichert.


for(int i = 0; i<Choices.GetLength(0); i++)
{
   if(i = //gewählter Button)
     {
        CurrentChoice = Choices[i]  //An dieser Stelle ist das Array "Choices" immer                 noch mit den initialwerten belegt! Die Änderungen an den Strings wurden also nicht weitergereicht.
      }
}

Auch ein mysettings.save(), mysettings.reload() vor der Schleife änderte nichts an den Strings im Array, CurrentChoice wird immer der veraltete string übergeben. Frage mich wieso, seht ihr da einen Grund?

Gruß, Andi

19.06.2007 - 10:12 Uhr

Original von herbivore
...Es steht das Projekt darf nicht kommerziell sein. Man darf das Programm also nicht verkaufen. Und damit ist es auch kein Trick auf Entgelt zu verzichten, sondern die Voraussetzung. Eine Firma, die den Trick anwenden würde, würde kein Geld verdienen.

Die Hürde zu umgehn ist einfacher, als einem Kleinkind den Lutscher zu klauen.
Dann gibt man halt die Software für lau raus, schließt aber gleichzeitig einen hochdotierten "Berater"-Vertrag ab oder berechnet 10.000€ für den Kaffee wärend der Präsentation.

Ich denke daher auch, dass die kommerzielle Nutzung allgemein nicht so ganz koscher sein wird. Sauber ausdefiniert is die Sache aber wahrlich nicht.

In diesem Fall würd ich mich aber auch nicht groß drum scheren...dafür ist der Radius einfach zu klein und der Geist der Sache ist wie gesagt auch erfüllt.

[edit]Ich benutze im übrigen auch ein VS von der MSDNAA...in meinem Praktikum grad sitz ich natürlich an ordentlichen Versionen der Firma, nehme aber mein Programm auch mit heim und bearbeite/teste es da weiter. Ob das nu rechtlich erlaubt ist oder nicht ist mir da ehrlich gesagt ziemlich wumpe...
[/edit]

Gruß, Andi

P.S
Achja, der Kugelschreiber...den muss er seiner Mutter aber nicht nur schenken, sondern vorher bauen 😉
Wenn er die Maschinen, mit denen er das machen müsste, nur unter der Lizenz benutzen dürfte, mit dem Ergebnis ausschließlich private Briefe zu schreiben...was wäre dann? 😉

18.06.2007 - 11:41 Uhr

Hallo,

muss diesen Thread doch mal wieder aufwärmen...

Ich hatte jetzt quasi genau das gleiche Problem: Wie komm ich gescheit an die Connectionstrings ran? Und zwar möchte ich nicht nur verschiedene Datenbanken anbieten (das wär ja über mehrere ConnectionStrings in der App.Config nicht das Problem, wie geschildert) sondern auch die Serverdaten (wie IP und Port) über ein Optionenmenü einstellbar machen (so dass die DB auch mal umziehen kann, das könnte nämlich bei uns durchaus mal passieren).

Und da stand ich genauso vorm Berg mit dem Schreibschutz, bis ich das über nen ganz billigen Workaround umgangen hab, indem ich die app.config einfach als XMLDocument geladen, verändert und wieder zurückgespeichert hab.

Jetzt stellt sich mir natürlich die Frage nach dem Sinn eines Schreibschutzes für die Configuration-Klassen, wenn das so billig umgangen werden kann...hat man sich da irgendwas bei gedacht?

Gruß Andi

18.06.2007 - 11:24 Uhr

Original von herbivore
String.Insert ändert - wie alle String-Funktionen - nicht das String-Objekt, sondern liefert als Ergebnis ein neues String-Objekt mit der Einfügung. Nützt also hier nicht.
herbivore

Ahja, richtig, laut Anfangsproblem ist ja ne Zuweisung a la


blödelstring = blödelstring.insert(0, "Blödelei")

nicht möglich. Nich richtig hingeschaut, sorry. Eigentlich war mir das schon bekannt, das hatte mich mal bei ner replace-Operation kurz verwirrt, bis ich dahinterkam 😉

Gruß, Andi

15.06.2007 - 17:06 Uhr

Kleine Anekdote:

Ich hatte mal meine Mausdaumentaste mit "Explorer öffnen" belegt. Das größte Vergnügen eines Kumpels war es dann, immer wenn ich nicht hinsah, ewig oft draufzuklicken bis nix mehr ging...Stichwort "Arbeitsplätze schaffen". Jaja, besagter Kumpel hat ein ganz ganz feines Gespür für Wortwitz X(

Jedenfalls war nach ca 60 "geschaffenen Arbeitsplätzen" der Rechner auf Zeitlupe...der Explorer ist ja doch bissel komplexer.

Gruß, Andi

15.06.2007 - 17:00 Uhr

Zum Reinschreibproblem:
Da sollte konkret die Lines[line].insert-Funktion helfen.

Zur Cursorposition würd ich mich auch an WinSharp93's Hinweis halten.

Gruß, Andi

14.06.2007 - 13:10 Uhr

Kannst ein DataView mit deiner Tabelle erstellen und das dann nach dem Datum sortieren..bei absteigender Sortierung sollte das aktuellste Datum dann immer ganz oben an fester Position stehen und du kannst es bequem auswählen.

14.06.2007 - 11:13 Uhr

Bin auf dem Gebiet auch noch eher am Anfang...ein Versuch:

für jeden erwünschten ComboBoxeintrag eine BindingSource bauen


BindingSource bs1 = new BindingSource();
bs1.DataSource = //dein DataSet;
bs1.DataMember= //gewünschter Inhalt;

BindingSource bs2 = new BindingSource();
bs2.DataSource = //dein DataSet;
bs2.DataMember= //gewünschter Inhalt;

Diese dann in ein Array packen. Dann einen EventHandler für ComboBox_SelectedIndexChanged bauen


void ComboBox_SelectedIndexChanged(object sender, eventargs e)
{
    this.DataGridView.DataSource = BindingsourceArray[this.ComboBox.SelectedIndex];
}

Ist jetzt ungetestet, und wie gesagt von einem Anfänger, aber vielleicht einen Versuch wert.

Gruß, Andi

14.06.2007 - 10:52 Uhr

Ich würde mit dem selektierten ComboBox-Inhalt je einen eigene SQL-Kommando-String verknüpfen und damit dann jeweils die Abfrage durchführen.

Oder holst du dir die Tabelle und willst, einmal geladen, die Darstellung über die ComboBox verändern/anpassen?
Dann würd ich jeweils die Datenbindung aus dem DataSet heraus an das GridView verändern, also jeweils andere Daten aus dem DataSet selektieren und binden.

Gruß, Andi

12.06.2007 - 11:57 Uhr

Klappt Bombe!


void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex > -1)
            {
                if (this.dataGridView1.CurrentCellAddress.X == 0)
                {
                    //Funktionsaufruf
                 }
            }
        }

Danke Noodles!

[edit]
Noch schlauer: Gleich auf e.ColumnIndex == 0 prüfen, dann kann ich mir die zweite If-Abfrage auch sparen.

12.06.2007 - 11:42 Uhr

Schonmal gute Info, dass die RowHeader auch als Cell mit ColumnIndex -1 gelten, wusst ich noch nicht, danke!

Aber das Event benutz ich ja. und die weitere Verarbeitung sollte nur unter folgender Bedingung auftreten:


if (this.dataGridView1.CurrentCellAddress.X == 0)
{...Funktionsaufruf}


Damit sollte eigentlich (unwissentlich, aber immerhin) die -1 Column ausgeschlossen sein oder?
[edit]
Ah verflucht, natürlich nicht, ich frag ja nicht die geklickte Zelle, sondern die CurrentCell ab. Da muss also deine Abfrage noch mit rein, werd ich gleich mal ausprobieren.

Gruß, Andi

12.06.2007 - 10:46 Uhr

Hallo!

Ich hab da eine kleine Unanehmlichkeit mit meinem DataGridView(wird aus einer kleinen DB gefüllt). Die Daten der dargestellten Datensätze sollen per Doppelklick auf die Zellen der ersten Spalte(test_id) weiterverarbeitet werden. Dass auf keine anderen Spalten und nur auf gefüllte Zellen reagiert wird, habe ich bereits sichergestellt.

Nur wird das DoubleClick-Ereignis auch ausgelöst, wenn ich im rot-markierten Bereich im Anhang doppelklicke(warum auch immer...ne Zelle ist das ja eigentlich eher nicht 🤔 ). Da ich in diesem Ereignis die "CurrentCell" verarbeite und die nach dem ersten Doppelklick auf eine gültige Zelle gesetzt ist, wird also auch dann der Handler aufgerufen.

Das ist jetzt kein Weltuntergangsproblem, aber doch sehr unerwünscht und userverwirrend, falls es mal dazu kommt. Kennt da jemand eine Lösung oder hat ne Idee für einen Woraround? Mit ner Listbox spiel ich grad ein wenig rum, die ist aber wenig komfortabel, würd das DataGridView gern behalten.

Gruß, Andi

06.06.2007 - 12:52 Uhr

Habs jetzt so gelöst:


<xsl:template match="CheckAnalogIn">
     CheckAnalogIn <li> Test: <xsl:apply-templates select="@Test"/></li>
  </xsl:template>

@Gloki
Danke dir für den Vorschlag!

06.06.2007 - 11:55 Uhr

ah, das scheint irgendwie mit einem "@" zusammenzuhängen...häng mich nochmal rein.

06.06.2007 - 11:13 Uhr

Servus,

ich habe hier XML-Dateien, wo praktisch alle relevanten Informationen in den Attributen des jeweiligen Knotens drinsitzen. Auszug:


<Testresults>

   <Checklist>
     <Check1 Test="True"/>
     <Check2 Test="True"/>
   </Checklist>

   <Test>
     <Channel1>
       <_1MHz Vpp="0" Vpp_Valid="False" Frequenz="0" f_Valid="False"/>
       <_2MHz Vpp="0" Vpp_Valid="False" Frequenz="0" f_Valid="False"/>
     </Channel1>
   </Test>
</Testresults>

Nun möchte ich diese XML-Protokolle gerne in ein html-Dokument überführen. Das blöde ist nur, dass ich ja nicht mit <xsl:value of select bla/> arbeiten kann, weils keine values gibt. Daher muss ich irgendwie an die Attribute rankommen. Gibts da eine Möglichkeit?

DIe XML-Daten umzubauen (dann halt mit Werten) würde ich gerne vermeiden, weil die Datei an sich so sehr übersichtlich ist und am besten so bleiben soll.

Gruß, Andi

05.06.2007 - 17:14 Uhr

tss, dass hier noch niemand Cohen-Brüder Filme genannt hat...Fargo oder The Big Lebowski zum Beispiel. Knüllerfilme.

Ich persönlich stehe ja auch enorm auf gescheite(!) Superheldenverfilmungen. Die X-Men-Trilogie, bzw die Spidermans find ich zum Beispiel ganz großartig, Daredevil oder die Fantastic four kann man hingegen locker in die Tonne treten...

An nicht ganz so bekanntem finde ich z.B Elling und Wilbur wants to kill himself richtig schön.

Klassiker mag ich auch gern, der genannte Arsen und Spitzenhäubchen ist echt fantastisch, Ladykillers auch ganz groß, El Dorado mit John Wayne und Robert Mitchum...toller Western. Manche mögens heiß ist auch fantastisch. Apropos Jack Lemmon: Das Mädchen Irma La Douce ist auch super, desweiteren haben Er und Walther Matthau auch tolle Dinger zusammen gedreht.

So, langt erstmal 😉

Gruß, Andi

25.05.2007 - 13:49 Uhr

Ah, das stimmt, Hochkammata haben tatsächlich gefehlt, da wirds wohl dran gescheitert sein. Guter Hinweis. Aber das mit den Parametern ist wohl in jedem Fall die schlauere Lösung.

Gruß, Andi

25.05.2007 - 10:20 Uhr

@unclesam

ich muss zugeben, so ganz verstehe ich deine Frage nicht...
Die string-deklaration ist natürlich mit anführungszeichen versehen("pipapo"). Aber wenn ich dann die Variable an den Kommandostring ankleben will, darf ich das doch nicht in Anführungszeichen packen, weil er doch ansonsten nicht als variablenwert sondern den Namen als String anfügt.

Ich seh grad, ich hab im Code unten den Kommentar "//hier wird der string korrekt aufgelöst angezeigt, die Variablen stehen an den richtigen Stellen, das Kommando ist so gültig." geschrieben. Muss natürlich "Variablenwerte" heißen. Hast du das gemeint?

Gruß, Andi

24.05.2007 - 16:28 Uhr

Wie versprochen, hier die Meldung:

Feine Sache, das Ding läuft, und zwar mit folgenden Zusätzen:


NpgsqlParameter p_ersteZahl = new NpgsqlParameter("@ersteZahl", DbType.Int16);
                NpgsqlParameter p_zweiteZahl = new NpgsqlParameter("@zweiteZahl", DbType.Int16);
                NpgsqlParameter p_text = new NpgsqlParameter("@text", DbType.String);

                p_ersteZahl.Value = ersteZahl;
                p_zweiteZahl.Value = zweiteZahl;
                p_text.Value = text;
//und der neue Aufruf:
NpgsqlCommand com = new NpgsqlCommand("INSERT INTO test (id, seriennummer, textdaten) VALUES (@ersteZahl, @zweiteZahl, @text)", connect);

Original von VizOne
...Im Leben eines jeden ADO.NET Entwicklers kommt der Moment, wo ihn irgendjemand aus irgendeinem Forum auf Parameter hinweist. Und ab dann geht's steil nach oben 😉

feine Geschichte, dann kann ja jetz nix mehr schiefgehn 😉 Danke dir nochmal!

Gruß, Andi, dem Feierabend entgegencodend.

24.05.2007 - 16:00 Uhr

ah, klingt hervorragend. den Absatz hab ich in meinem Büchlein anscheinend übersprungen.
Mal kurz lesen und umsetzen, bei Erfolg kommt Meldung. Danke schonmal! 🙂

24.05.2007 - 15:39 Uhr

Hallo zusammen,

Ich hab hier ein recht komisches Problem mit einem eigentlich simplen sql-Kommando.
In einer PostgreSQL-DB ist eine kleine Tabelle, drei Spalten namens: id(integer), seriennummer(integer), textdaten(text).

Folgender Code, um was reinzuschreiben:


using (NpgsqlConnection connect = new NpgsqlConnection(ConnectionString))
            {
                int ersteZahl = 123;
                int zweiteZahl = 456789;
                string text = "pipapo";
                
                connect.Open();
                NpgsqlTransaction transact = connect.BeginTransaction();
                NpgsqlCommand com = new NpgsqlCommand("INSERT INTO test (id, seriennummer, textdaten) VALUES ("+ ersteZahl +", "+ zweiteZahl +", "+ text +")", connect);
                com.Transaction = transact;
                
                string bums = com.CommandText; //hier wird der string korrekt aufgelöst angezeigt, die Variablen stehen an den richtigen Stellen, das Kommando ist so gültig.
                com.ExecuteNonQuery(); //Fehler!
                transact.Commit();
}

Beim ausführen von com.executeNonQuery knallt er mir jedesmal raus mit der Meldung: "Spalte "pipapo" existiert nicht". Dabei steht pipapo ganz klar als Value für die Spalte textdaten.

Da die Zahlen korrekt reingeschrieben werden, wenn ich den text rauslasse (ich hab ihn auch manuell eingefügt, also nicht über eine stringvariable, leider gleicher Fehler), vermute ich irgendein Problem mit dem Typ, wobei mir völlig schleierhaft ist, woher das kommen könnte. Wenn ihr einen Hinweis hättet wär das super.

Gruß, Andi

21.05.2007 - 15:01 Uhr

@svenson
Serialisierung klingt wirklich sehr verlockend. Ich bin in meinem Buch grad mal kurz drübergeflogen, da werd ich mich mal genauer mit auseinandersetzen. Danke für den Hinweis!

[edit]
Im übrigen hab ich mal eben geprüft, wie "einfach" das händische zusammenklöppeln würde. Ergebnis: Igitt. 44 Strings für Tags. Dazu diverse Ergebnis-Arrays von den Textfeldern/anderen Controls. Das ganze dann in die richtige Reihenfolge zu bringen wär schon bissel eklig.

@herbivore
Gut, dann sind wir uns soweit einig denke ich 😉
Danke für die Infos und Anstöße!

Gruß, Andi

21.05.2007 - 13:57 Uhr

@svenson
Hm, ich gebe zu, es wäre zumindest für den Lerneffekt sinnvoller, die XML-Strings übers DOM zu erzeugen (steige da grade ein).
Nur scheu ich grad ein wenig den Aufwand (die Tags eben per Hand einzubauen ist demgegenüber ne Ecke weniger Stress) und desweiteren bekomme ich als Ergebnis dann auch eine XML-Datei, die ich dann (mangels xml-typ) eh wieder in einen string umwandeln müsste, um sie in Postgres einzufügen, oder?

@herbivore
Da hatte ich auch schonmal reingeschaut (Stringbuilder-Klasse). Zitat:

"Bei einem String-Objektverkettungsvorgang wird immer ein neues Objekt aus der bestehenden Zeichenfolge und den neuen Daten erstellt."

Klingt für mich schwer nach currentString+=newString oder? Wobei weiter unten dann halt steht:

**"...Wenn eine feste Anzahl von String-Objekten verkettet wird, empfiehlt sich daher die Verwendung der String-Klasse für einen Verkettungsvorgang. Die einzelnen Verkettungsvorgänge können dabei vom Compiler sogar in einen einzigen Vorgang zusammengefasst werden." **

Daher kam ja die Verwirrung bei mir 😉

21.05.2007 - 13:23 Uhr

Hallo Herbivore,

ich denke, so werd ichs auch machen. Nur der Sinn dieser zwei ergebnisgleichen und zumindest halt "baugleich" erscheinenden Funktionen erschließt sich mir halt nich so ganz.

Dann könnt man das gleiche noch (drittens) per for-schleife und dem += Operator zusammenkletten(concat wird wohl nichts anderes machen nehm ich mal an). Diese ganzen Wege nach Rom verwirren mich irgendwie ein wenig, aber mir solls ja recht sein.

Gruß, Andi

21.05.2007 - 13:03 Uhr

Moin!

Soweit ich das überschaue machen beide ja grob das gleiche, gibts Bereiche, wo das eine sinnvoller als das andre ist?

Konkret hab ich hier ne Menge Textfelder und andere Controls, deren Werte ich auslesen und zusammen mit handgeschriebenen Strings(Tags) als XML-formatierten String wieder ausgeben möchte(XMLWriter bringt mir leider nicht so viel, da die Datei/der String in eine Postgres-DB soll und Postgres laut Doku keinen XML-Typ kennt).

Die Stringanzahl ist jedenfalls bekannt, machts da Sinn, einen Stringbuilder mit maximaler Länge zu nehmen? Bequemer zumindest scheint mir, die Dinger in ein array zu packen und das dann per concat zusammenzuschweißen. Comments?

Gruß, Andi

10.05.2007 - 16:16 Uhr

Ich habe hier ein Testprogramm, das Gerätefunktionen durchcheckt. Diese Geräte basieren auf einem kleinen Linuxserver, den ich auch über ein Webinterface ansprechen kann (und zum testen auch muss).

Ich rufe dafür aus dem Testprogramm einfach den Systembrowser über process.start("http://IP-Adresse") auf. Das Webinterface ist allerdings passwortgeschützt, damit die Kunden nicht einfach in den internen Einstellungen rumpfuschen.

Im Testverfahren wärs natürlich ganz nett, sich die Passworteingabe bei jedem Gerät zu ersparen, deswegen würde ich gerne username (der ist immer gleich) und passwort(generiert sich aus Daten, die ich habe) direkt per klick der aufpoppenden Passwortabfrage übergeben und am besten gleich noch "Enter" hinterherdrücken, dann wär der Tester direkt in seinem Menü.

Ich weiß nur nicht, wie ich dem Browserdialog (den kennt mein Programm ja nicht) etwas übergeben soll. Ist das halbwegs stressfrei möglich? Wär halt ein sehr nices nice-to-have...

Gruß, Andi

10.05.2007 - 10:30 Uhr

Ach schau an, tatsache^^
Na gut zu wissen 👍

10.05.2007 - 10:16 Uhr

Original von budili

P.S. Ist dieses Tool beim MS Visual Studio 2005 dabei ??

nö, musst kurz googeln.

10.05.2007 - 10:02 Uhr

Dafür ist der dependency walker tatsächlich genau das richtige. Der benennt dir jede Funktion mit Namen, die in der DLL vorkommt. Mit dem Funktionsnamen kannst du dann ja im Quellcode suchen, was die Dinger dann genau machen. Ich geh mal davon aus, das du den hast, bzw. zumindest drankommen kannst, wenns ein Kollege geschrieben hat.

Gruß, Andi