Original von FZelle
Wofür sind wohl so dinger wie der SQL-Server, Oracle, DB2 o.ä. entsanden?
Hm, dafür, dass sich manche Unternehmen die **** ihrer Eigner vergolden lassen wollen? Man nehme MySQL, optimiere den Server bis zum Anschlag, schreibe sauberen Code, umgehe alles, was MySQL ausbremst, weil die Entwickler keinen Bock drauf haben, sinnloses Zeug zu optimieren (zB "inner joins") und fahre einen Benchmark gegen Oracle, mySAP, DB2 & Co...
Stimmt, ich bin mehr für das O² zu haben, also OODBMS 😉 Noch mehr wäre ich für ein "Entity-oriented DBMS" zu gewinnen, aber was soll's, man kann nicht alles haben 😉
Original von Code-Hacker
Allerdings muss man damit wohl ziemlich vorsichtig umgehen, da die einzig und allein auf Performance programmiert wurde und absolut nicht auf Sicherheit.
Tja, wären Programmierer keine Menschen, könnte man das zum Prinzip erkären 😉
So, dann oute ich mich, obgleich in Berlin wohnend, als absoluter "Ärzte"-Hasser. Farin hat ne Stimme, die mich nur aufs Klo treibt wie sonst nach extremer Überdosis Alkohol, und Bela vergreift sich, auch wenn er ne gute Stimme hat, an heiligen Klassikern weit über seinem Niveau. Punk(t) 😉
Original von Chief Brodie
_Original von CarstenP_Wie findeste "Athena"? 😉
ist, glaub ich, die einzige türkische band, die ich kenne...
habe ich auf nem konzi gesehen - irgendwo habe ich auch n paar songs von denen.
live waren sie ganz cool - studio hat mir ein bisschen zu wenig drive, wenn du weisst, was ich meine...
Ja, ich war beim Grand-Prix auch total verblüfft über die Jungs, die sind da abgegangen wie Clash zu den besten Zeiten. Und ich hab später noch ein paar Konz-Videos gesehen, da waren sie noch besser. Vom Sound her mag man gar nicht glauben, wie die schräg sein können. Echt kultig 🙂
Fortran kommt nicht umsonst von "formula translator". Es gibt kaum eine effizientere Programmiersprache für mathematische und Mathe-basierte Probleme. Das, was Fortran in Sachen "number crunching" mitbringt, müsste man in C(/#) höchst umständlich erstmal zusammenfrickeln. Manche Mathe-Libs, gerade für C, sind zwar schon ziemlich weit entwickelt, aber gerade in Sachen Vektoren, Matritzen ist Fortran grandios. Wäre klasse, wenn man Fortran-Libs in C# nutzen könnte 😉
Ja, wie gesagt, es ist eben Geschmacksache. Ich benutze JOINs nur dann, wenn es gar nicht mehr anders geht (und es geht sehr oft ohne). *-Abfragen habe ich öfter dann, wenn es drum geht, Basisdaten zu ändern, also zB ne Adresse. Da werde ich, weil ich 2 von 12 Feldern nicht brauche, die beiden Felder nicht weglassen. Bisschen faul bin ich dann doch 😉
Hm, Du findest also
SELECT Persons.ID AS PersonID, Persons.FirstName, Persons.LastName, Persons.Birthdate, ..., Addresses.ID AS AddressID, Addresses.Street, Addresses.City, Addresses.ZIP, ... FROM [...] WHERE [...]
lesbarer als
SELECT Persons., Addresses. FROM [...] WHERE [...]
? Okay...
Ist aber wie immer Geschmacksache, wie man das handhabt. Ich halte mich ja auch nicht an alle Patterns & Practises, die irgendwo durchs Netz spuken. Wenn man Regeln kennt und verstanden hat, darf man sie natürlich brechen 😉
Schau Dir mal die Klasse System.Drawing.Design.UITypeEditor an, da findest Du, was Du brauchst.
Ich widerspreche dem Widerspruch nur ungerne, aber dennoch begründet. 😉
Das vorgestellte Schema ist nicht speziell auf C#/.NET zugeschnitten, sondern soll möglichst allgemeingültig sein (und findet nur bei älteren DBs seine Grenzen, wenn diese DBs Tabellen- und Feldnamen auf x Zeichen begrenzen, wie etwa dBase III).
Beispiel: MySQL + PHP:
$sql = "SELECT Persons.*, Addresses.* FROM Persons, Adresses
WHERE Person.AddressPID = Address.ID";
$result = mysql_query($sql, $conn);
$row = mysql_fetch_row($result);
Dieser Code würde "unexpected results" liefern, da die MySQL-Abfrage-Engine die Feldnamen nicht qualifiziert. Wenn man auf $row nun nicht per numerischem Index, sondern über den Feldnamen zugreift, rauscht's, denn es gibt zwei Felder, die "ID" heißen. Was also ist denn nun $res["ID"]? Die Person-ID oder die Address-ID?
Original von Chief Brodie
P U N K R O C K ! ! !
Wie findeste "Athena"? 😉
Stored procedures sind aber wieder DB-abhängig und damit nur in sehr engen Grenzen portierbar, wenn man die DB-Engine wechselt. Ist aber wie immer Geschmacksache, und 20 Dinge sprechen dafür, Programmlogik in die DB zu schieben (Speed vor allem), und 20 Dinge dagegen. Ich halte es so, dass ich die DB möglichst wenig mit Logik fülle (nichtmal Constraints), sondern so gut wie alles in den Code packe.
Alles, was nicht "normal" ist g Also, Charts-Pop und HipHop und vor allem Soul-Gejaule gehen schonmal gaaar nicht. Kill R.Kelly!
Beim Programmieren (zuhause, net im Büro lol) je nach Stimmung Black Metal (Therion, Tristania & Co.), alten und neuen Indie-Electro-Pop und EBM (DM, VNV Nation, F242, Nizzer Ebb usw.), älteren Brit-Pop und Gruft-Rock (James, Smiths, Sisters of Mercy, Cassandra Complex) oder auch mal "schöne Stimmen" der Sorte Kate Bush, Tori Amos, Peter Gabriel. Oder wenn meine Stimmung ganz anders tickt, dann blubbert auch mal Trance und Elektro.
Sodale, ich wollte die "Patterns & Practises", also hier mal eine Praktik zur Benennung von Datenbanken, Tabellen und Feldern.
Grundsätze
Der Grundsatz bei der Benennung ist stets, dass die Namen selbstdokumentierend sein sollten. Das vorgestellte Schema ist bereits Jahrzehnte alt (ja, wirklich) und stammt noch aus Mainframe-Zeiten. Es mag auf den ersten Blick umständlich erscheinen (so umständlich etwa, wie eine Variable "vorname" statt "vn" zu nennen), führt jedoch zu sehr lesbaren SQL-Statements.
1. Datenbank-Name
Oft ist der Name einer Datenbank vorgegeben, z.B. bei Datenbanken, die auf einem Webserver per Web-Interface erstellt werden. Dann treffen die hier gemachten Vorschläge natürlich nicht zu.
Wenn der Name frei zu vergeben ist, sollte er aus zwei Teilen bestehen, die zusammen den Sinn der Datenbank komplett dokumentieren. Bei sehr großen Datenbanken (groß iSv "bildet viel ab") kann auch ein Begriff den Sinn der Datenbank beschreiben.
Beispiele:*CustomerRelations *SourcecodeRepository *myCSharp
2. Tabellen-Namen
Der Name einer Tabelle reflektiert den Inhalt. Das klingt erstmal trivial, ist aber oft vernachlässigt. Enthält die Tabelle also Produkte, so heißt die Tabelle konsequent "Produkte" oder "Products" (und nicht anders!).
Die (quasi-)englische Variante ist aus einem einfachen Grund zu bevorzugen: Englische Plural-Bildung besteht idR aus dem einfachen Anhängen eines "s", während die deutsche Plural-Bildung sehr unregelmäßig ist.
Warum "quasi"? Weil man sich von der grammatisch korrekten Plural-Bildung bei den Ausnahme-Fällen trennt. So wird aus einer Tabelle, die Städe beinhaltet, also eigentlich "cities", dennoch "Citys". Der Sinn wird später klar.
3. Feld-Namen
Das Thema der Feld-Benennung ist am komplexesten, aber es gibt klare Regeln, die nur eins fordern: keine Ausnahmen.
Eine Zeile (Row, Record) beinhaltet die Information zu einem Objekt. Deswegen beginnt der Name eines Feldes prinzipiell mit dem Singular des Tabellen-Namens. Wenn also die Tabelle "Persons" heißt, beginnt der Name jedes Feldes mit "Person". Die weitere Benennung ist Geschmacksache. Für bestimmte Datentypen gibt es jedoch sinnvolle Konventionen:*ID - "PersonID" *bool'sche Werte - sind entweder "is"s oder "has"s: "PhoneNoIsSMSCapable" (Tabelle "PhoneNos"); "ComputerHasInternetAccess" (Tabelle "Computers"). *Datum-/Uhrzeit-Werte - enden - wenn der Feldname nicht bereits selbstredend ist - auf "At" oder "On" auf "From" oder "To" oder "Until", ggf. ergänzt um "D", "T" oder (nach eigenem Geschmack) "DT", wobei "D" einen reinen Datumswert, "T" einen reinen Zeitwert (time) und "DT" einen kombinierten Datum-Zeit-Wert markieren: "EventCreatedAt" (Datum-Zeit-Wert); "PersonBirthdate" (Datums-Wert, keine Ergänzung nötig); "AlertRememberAgainAtT" (Zeit-Wert). *Referenz-IDs (foreign keys) - werden durch den Singular der referenzierten Tabelle und "RFID" oder "PID" (pointer to ID) gekennzeichnet ("PersonAddressPID").
Der Sinn dahinter ist nicht, möglichst lange Feldnamen zu erzeugen, sondern Feldnamen, die sich selbst erklären. Das Feld "PersonGender" kann nur zur Tabelle "Persons" gehören. Dies erlaubt auch, halbautomatisierte Verfahren zur Erstellung von Tabellen, SQL-Abfragen usw. einzusetzen (deswegen der "Quasi-Plural"). Außerdem erübrigt es sich, in SQL-Abfragen Feldnamen durch den Tabellennamen zu qualifizieren:
SELECT Persons., Addresses. FROM Persons, Addresses WHERE AddressID = PersonAddressPID
4. Referenz-Tabellen (n:m-Zuordnungen)
Hier gibt es keine feste Regel zur Benennung. Ich persönlich verwende zur Kennzeichnung einer solchen Tabelle ein führendes "x": xCompanysProducts, und kürze beim Feld dann ab: xCPCompanyPID und xCPProductPID.
Also, so ungern ich dem Meister widerspreche, in dem Fall muss es sein. ADO.NET kann alles, aber die Verwaltung von AutoIncrement-IDs ist eine sehr aufwändige Sache, zumal mit einer Datenbank, die nicht "Microsoft SQL Server" heißt. Ich würde die IDs selbst erzeugen, und das, was sich da geradezu aufdrängt, sind GUIDs.
Da Du früher oder später händisch in Deinen Tabellen rumhacken wirst (eher früher, nämlich in der Testphase), mach die ID-Spalte zum String mit 40 Zeichen Breite. String-GUIDs sind 38 Zeichen breit, aber die einfachste Methode, GUIDs zu generieren, nämlich die übers VS.NET, erzeugt Registry-GUIDs, und die sind um "{" und "}" ergänzt. Wenn Du dann in Access oder was-auch-immer rumhantierst und Deine ID-Spalte 40 Zeichen breit ist, kannst Du die Registry-GUID einfach über Clipboard in die DB-Tabelle kopieren und die geschweiften Klammern nach dem Einfügen weglöschen.
Wenn Du im Code die GUID generierst, brauchst Du keine speziellen (d.h. DB-spezifischen) Konstrukte, um für alle drei Tabellen die Keys zu erzeugen.
Nebenbei, um meinen Vorschlag zum "Patterns & Practises"-Forum zu forcieren, werde ich mal hier unter "ADO.NET" was zur Benamung von Datenbanken, Tabellen und Feldern posten.
So, gerade ist die V0.2 fertig geworden. Sie hat eine stabilere Fehlerbehandlung und schmeißt jetzt einige eigene Exceptions. Die Änderungen sind auf der Beschreibungs-Webseite (s. erstes Posting) dokumentiert.
EDIT: Außerdem ist die Assembly jetzt signiert, sodass sie leichter in eigene Projekte einzubinden sein sollte, in denen auf sowas getestet wird.
oder wie immer bei diesem thema:
Also, was mir persönlich Spaß machen würde, wären ne Menge Add-Ons für das VS, da fehlt viel, auch wenn das VS 2005 davon einiges bieten wird, beispielsweise
* Property-Creator (mache ich derzeit über ein einfaches Makro, könnte man aber auch viel komfortabler gestalten), also "private string Bla" wird zu "private string m_bla" + getter und setter. Das kann mein Makro natürlich, aber en bloc-Konvertierung und ein paar andere Features wären schon ganz schmuck.
* Datenbank-To-DataSet-Definition-Wizard - FileOpenDialog bzw. Datenquellen-Browser, "Klick", Browse auf Tabellen, "Klick", fertig ist das DataSet.
* Auto-Favoriten-Importer aus einem bestimmten, festzulegenden Unterordner der IE-Favoriten, die dann als Menüpunkt mit "|>"-Symbol und den entsprechenden Unterpunkten angezeigt werden, weil man viele Dinge ja doch nicht unbedingt aus der MSDN hat.
* ein "Designer-Designer", um das PropertyGrid für ein selbstentwickeltes Control über eine grafische Oberfläche manipulieren zu können.
EDIT: Glatt vergessen, was mir noch einfällt, wäre eine Sammlung von Wrapper-Klassen für die Crypto-Sachen von .NET. Sprich: sowas wie:
* string[] myRSA.GenerateCryptKeyPair()
* string[] myRSA.GenerateSignKeyPair()
* string myRSA.ImportPublicKey(string filepath)
* string myRSA.CryptWithPublicKey()
* string myRSA.EncryptWithPrivateKey(string filepath)
etc. Das Ganze könnte (sollte) PGP-kompatibel sein, sodass man die üblichen Keys, die im Netz rumschwirren, benutzen kann, wobei da natürlich noch
* string myRSA.ImportPublicKeyFromURI(string URI)
geil wäre 😉
Ähm... fingerheb
07/23/2004 00:00:00 = 07/23/2004 00:00:00
07/23/2004 16:00:00 > 07/23/2004 00:00:00
07/24/2004 00:00:00 > 07/23/2004 00:00:00
string d = myDate.ToString("MM/dd/yyyy");
string sql = "DateTime >= #" + d + " 00:00:00# AND DateTime <= #" + d + " 23:59:59#";
Hast Du irgendwas an der Lokalisierung geschraubt? Hast Du im String testweise mal den Punkt durch ein Komma ersetzt?
Wo denn, wo denn? Ah, jetzt ja... 🙂 Dann machs doch einfach so:
<soap:body xmlns:m="jollex">
<m:TransportXMLFile>
<m:XMLContent>
{?xml version="1.0" encoding="utf-8"?}
{terminplaner xmlns:p="http://www.htw-dresden.de/s4137/person"}
{termin}
{absender}
{p:person}
{p:name}Hedler{/name}
{p:vorname}Martin{/vorname}
{p:datum tag="32" monat="01" jahr="1872" /}
{/p:person}
{/absender}
{text}Vortrag über Web-Services{/text}
{datum tag="22" monat="10" jahr="2003" /}
{/termin}
{/terminplaner}
</m:XMLContent>
</m:TransportXMLFile>
</soap:body>
Dann hast Du Deine XML-Datei so eingepackt, dass der SOAP-Parser die Finger daovn lässt. Du liest dann einfach den XMLContent-Knoten aus, ersetzt die geschweiften wieder durch spitze Klammern und hast eine unangetastete XML-Datei.
das heißt, wenn ich von ner klasse erbe oder eine erstelle, die IDisposable implementiert, geht das auch bei eigenen? klasse klasse 🙂
Nur mal so als Idee:
Wie wäre es, wenn Du Deine DataTable gleich an die Tabelle der Datenbank bindest, statt sie manuell zu erzeugen? Wenn Du ein SELECT absetzt, dass auf jeden Fall 0 Zeilen zurückliefert ("WHERE 1 = 0"), hast Du zumindest mal eine sauber definierte Tabelle. Danach befüllst Du die DataTable wie gehabt mit DataRows und zeigst das DataGrid an. Wenn der Anwender die Daten nicht will, tust Du einfach gar nix. Wenn er sie behalten will, brauchst Du jetzt nur noch einen xxxCommandBuilder und kannst, weil die Rows ja alles den Status "added" haben, via xxxDataAdapter.Update(DataSet) alles in die Tabelle der Datenbank schreiben.
klappt das mit dem "using" eigentlich bei database-connections auch so schmuck wie bei file-I/O?
und @ invisible: glaub mir, jeder, der in ADO.NET einsteigt, kriegt erstmal nen knoten in der birne, bis er nach und nach erkennt, wie elegant der entwurf eigentlich ist. vor allem lernt man eigentlich sehr schnell sehr viel bei dem thema und blickt nach ein paar experimenten recht flott durch. man sollte sich bloß nicht von der MSDN verwirren lassen, weil die so viele wege nach rom aufzeigt, dass man am ende nicht mehr weiß, welcher für welchen fall der richtige ist 😉
äh, ich glaube, wir haben uns missverstanden (jedenfalls du und ich 🙂 ), was das mit den strings betrifft.
dein code sieht erstmal okay aus. ich machs mir persönlich immer leicht dadurch, dass ich den xmlns auf irgendwas eigenes setze, weil es letztlich ja doch nur um das geht, was zwischen <soap:body ...> und </soap:body> steht.
mir ging es um was anderes, nämlich darum, dass du zum beispiel entweder
<soap:body xmlns:m="CP">
<m:SubmitTicket>
<m:CustomerID>47110815</m:CustomerID>
<m:ProductID>12345</m:ProductID>
<m:Version>2.1</m:Version>
<m:Timestamp>2004-07-22 15:29:13</m:Timestamp>
...
</m:SubmitTicket>
</soap:body>
oder kürzer
<soap:body xmlns:m="CP">
<m:SubmitTicket>
<m:TicketData>47110815;12345;2.1;2004-07-22 15:29:13;...</m:TicketData>
</m:SubmitTicket>
</soap:body>
schreiben kannst. klar, ein guter XML-parser kann mit der ersten version 1000 tolle sachen anstellen, aber letztlich fummelt man sich seine daten dann doch bloß per parser in eine datenstruktur und friemelt sie dann in eine datarow oder so. und da ist es aus meiner erfahrung einfach praktischer, statt mit 100 tags zu arbeiten, einfach nur eins zu nehmen und das dann kurz und bündig zu verarbeiten. dieses pseudo-CSV-format hat sich bei mir vor allem eben immer dann bewährt, wenn es darum ging, daten in eine datenbank zu stopfen, weil die daten schon fast in datarow-format ankommen.
Original von NoOneKnows
Brainf*ck-Compiler
gibts schon ne syntax-spec für "brainf*ck"? 😁
Original von Scordo
generell sind die NetzworkStreams nicht wirklich zu empfehlen, in den meisten Fällen sollte man doch lieber auf die Low-Level-Socket-Implementierung zurück greifen und sich selbst was vernünftiges schreiben.Is aber nicht so einfach da bei den Basis-Komponenten wirklich nur das nötigste implementiert ist und man ziemlich viel wissen bzw. sich anlesen muss um diese zu gebrauchen.
Jeppa, völlige Zustimmung. Das Framework gaukelt einem vor, IP wäre so schmuck einfach, dass das ein Kinderspiel sei, aber denkste. Ich würde mal sagen, wer noch keinen kleinen Server, der über IP arbeitet, in C geschrieben hat, inklusive fork() und solchen Späßen, wird sich auch mit dem Framework schwer tun, wenn er eine stabile, zuverlässige und performante Lösung entwickeln will.
MSDN sagt:
public bool Checked {get; set;}
Mit .NET-Bordmitteln wirst Du die Tristate-Fähigkeit der Checkbox also wohl nicht hinkriegen. Riecht mir nach einem sehr tiefen Griff in die WinAPI...
Wegen SOAP und Webserver: Einigen Systemen, etwa PHP, muss man erst beibringen, dass sie einen POST-Request komplett als "raw data" behandeln können. Falls Dein Server natürlich ein IIS ist mit .NET, hast Du da keine Probleme. Mir ist es jedenfalls passiert, dass der Server, der den Service bereit stellen sollte, mit einem SOAP-Request nix anzufangen wusste und ich erstmal wegen einer Einstellung (php.ini) mit dem Provider verhandeln musste.
Ansonsten kann ich aus der Praxis nur dringend dazu raten, dass Du Dir FZelles Vorschlag zu Herzen nimmst und Deine Daten in einen einzigen String packst (das könnte dann so ähnlich wie eine CSV-Datei aussehen). Alles andere macht einen tierischen Aufwand, der zudem total überflüssig ist. SOAP an sich ist schon umständlich genug.
solange es noch in der entwicklung ist (und das ist es, wie man am ToDo sieht, außerdem ist das abfangen von fehlern noch sehr rudimentär, das kommt aber im laufe des wochenendes), ist es freeware. danach werd ichs so handhaben bei "sandbar" und co, sprich: für nichtkommerzielle projekte wirds mit einer erwähnung in der programminfo oder der programm-readme "bezahlt", für kommerzielle projekte ist es dann verhandlungssache.
EDIT: ich habe gerade die beschreibung etwas korrigiert und komplettiert und auch einen passus in sachen lizenz bzw. verwendung reingeschrieben. 😉
Okay, okay, auch kein echtes Projekt, nur ein Steuerelement, aber vielleicht guckt ja trotzdem mal jemand:
http://www.clubb.de/private/cp/dotnet/picklist.html
C#arsten
Assembler...
<world.persons.durchgeknallt.Scooter>Ihr seid ja alle wahnsinnig!</world.persons.durchgeknallt.Scooter>
Das kann nur daran liegen, dass Ihr nie die Gelegenheit hattet, nen selbstgebauten (d.h. einen auf einer mit Fädeldraht verdrahteten Platine sitzenden) und maßlos übertakteten Zilog-Z80C-19"-Einschub-Computer per "c't"-EPROM-Brenner binär zu programmieren 😁 Mei, das Ding hatte am Ende irre 6 MHz und 128 KByte RAM und konnte unter CP/M Pascal-Programme übersetzen! Gute, alte Zeiten... g
*spam* Mei, Kinder, Unsereins schlägt sich noch damit herum, wie er nützliche Controls bauen kann, und Ihr schwadroniert im Geiste schon wieder von Assembler... 😉
Hm, da findest Du sicher viele interessierte Leser, aber gibt's hier auch kompetente Autoren zu dem Thema? Ich will niemandem auf die Füße treten, aber zu diesen Themen wirklich präzise Aussagen findet man ja nichtmal in der MSDN...
Original von NoOneKnows
Noch zu GC.Collect(). Man sollte es nicht verwenden, weils inperformant ist. .NET kümmert sich selbst darum, wann es notwendig ist aufzuräumen. Und man braucht keine Bedenken haben, noch bevor angefangen wird auszulagern wird .NET einmal den GC laufen lassen 🙂
Ja, eben. Genau deswegen verstehe ich es nicht. Aber es ist doch kaum so, dass alle, die unbedingt GC.Collect() machen wollen, ewig-gestrige C-Hacker sind? Ich tippe eher darauf, dass die GC in VB ziemlich miserabel war, in allen Versionen.
Allerdings rate ich trotzdem dazu, statt die GC "überlisten" zu versuchen, lieber mit ein paar Tools der GC in ihrer natürlichen Form bei der Arbeit zuzuschauen. Die ist nämlich verblüffend gut und effizient.
*argh*...
mit der "Focused"-Eigenschaft des Items, Du ********!!!
Ach ja, danke, so einfach kann es manchmal sein...
*schnell versteck*
Hm, ich hoffe, ich kann mich jetzt verständlich ausdrücken... räusper
Ich hab da also so eine ListView auf einer Form, in der ich mächtig rumrühre. Unter anderem hab ich das Ding so aufgebohrt, dass man in allen Spalten nach Einträgen per Tastatur suchen kann (so, wie es sonst nur bei der ersten Spalte geht). Das heißt, ich stelle im Code ein, welches Item "selected" ist (ist immer nur eins).
So, wenn ich die Selection so manipuliere, dann wird das richtige Item zwar als selektiert angezeigt (also so farbig hinterlegt halt), aber offenbar gibt es noch eine zweite "Selection", wohl eher einen Fokus, welcher einen anderen Eintrag mit so einer dotted Linie umgibt. D.h., wenn ich jetzt über die Tastatur suche und anschließend mit den Pfeiltasten manövrieren will, steht der Fokus nicht korrekt, und die ganze Selektiererei war für die Füße. Wie setze ich da bitte den Fokus auf das richtige Item?
*spam* Wieso wollen eigentlich so viele Leute zwanghaft die CG mit der Hand machen?
Nochmal zum Mitschneiden für mich...
Du hast eine FormIrgendwas : Form. Darauf klebt ein Label...
class myForm : Form
{
private Label myLabel;
// <-- diese Stelle bitte merken!
public void myForm()
{
this.InitializeComponent();
}
private void InitializeComponent()
{
// sonstigen krams a la Form Designer weggelassen
this.myLabel = new Label();
this.myLabel.Location = new Point(10, 10);
this.myLabel.Size = new Size(50, 20);
this.myLabel.Text = "mein Text";
this.Controls.Add(this.myLabel);
}
}
Und jetzt willst Du die Text-Eigenschaft Deines Labels von "außen" ändern? Dann füge einfach an die Stelle, die Du Dir da oben merken solltest, dieses ein...
public string myLabelText
{
get { return this.myLabel.Text; }
set { this.myLabel.Text = value; }
}
... und schon kannst Du per
myForm frm = new myForm();
frm.myLabelText = "mein neuer Text";
den Text ändern.
... oder hab ich jetzt was falsch verstanden?
@NoOne: Auch Geschmacksache 😉 Ich würde mir wünschen, man könnte dem VS-Editor beibringen, die öffnende { in der vorigen Zeile zu lassen, ohne dass es dann bei der Formatierung durcheinander kommt. Ich lasse dem Ding also seinen Willen und nehme die einzelne { in einer extra Zeile in Kauf. Mir persönlich wird Code dann teilweise ZU luftig, zumal ich auch Einzeiler nach "if"s einklammere, statt mich dieser Unsitte hinzugeben, Einzeiler oder Folge-"if"s direkt an die Zeile davor zu kleben. Es soll sogar in alten Linux-Kerneln aus diesem Grund zu Abschmierern gekommen sein, weil der Programmierer anders "dachte" als der Compiler 😉
Ich denke, die Frage lässt sich am leichtesten dadurch beantworten, dass man sich
if (foo) {
for (int i = 0; i < 10; i++) {
...
}
}
else {
...
}
anschaut und im Vergleich dazu
If foo Then
Dim i As Integer
For i = 0 To 9
...
Next i
Else
...
Endif
Ich persönlich mag Kleinschreibung und geschweifte Klammern. Ich finde "next", "endif" und Co. hässlich. Das ist der einzige Grund, weswegen ich nach VB6 mit Freuden zu C# statt zu VB.NET gewechselt bin: (zu) viel PHP und C++ und JScript in der Zwischenzeit, sodass meine Augen einfach an geschweifte Klammern und die "luftigere" Optik von C-ähnlicher Syntax gewöhnt sind.
Fazit: bis auf ein paar wenige Prozent mehr Performance für C# (die mit .NET 2.0 vermutlich behoben sein werden) ist das eine reine Geschmacksfrage.
Original von alexander
Hallo,finde die Idee grundsätzlich nicht schlecht.
Das wird intern bei uns diskutiert werden.
Hui, klasse! Was kann ich mehr erwarten! 🙂
Original von UserNeo
Falls du ersters suchst, dann siehe meinen ersten Beitrag, dort gibt es die Standard Version kostenlos 🙂 .
Jau, das Teil ist nicht schlecht, nur kann es das Wichtigste nicht: Bilddateien laden.
Jau, Günni, aber es geht ums Selbermalen. Illustrator und Photoshop sind gute Freunde von mir, aber sowas wie (System.CastTo.Freeware)Microangelo; fehlt mir 😉
Ja, gerade zur Projekt-Planung und zum -Management fallen mir spontan viele Themen ein... Zum Beispiel:
"Wir sind eine kleine Software-Firma, unsere Programmierer sitzen aber verteilt zwischen Buxtehude und Ibiza, wie synchronisieren wir unsere Sourcen und beliefern unsere Kunden mit einem vernünftigen, einheitlichen Stand?"
"Unser Key-Account hat eine neue Software angefordert. Wie können wir einen Prototypen vorführen, den wir nach der Präsentation nicht komplett in die Tonne treten müssen? Wie finden wir also einen goldenen Mittelweg zwischen 'rapid prototyping' und 'reusability'?"
"Wo liegt das sinnvolle Mittelmaß zwischen 'Schnell reingehackt' und 'literarischem Programmieren'? Wie schreibt man also selbst-dokumentierenden Code, ohne 2/3 der Zeit mit Dokumentation zu vergeuden? Zeit ist Geld..."
"Wie sorgt man dafür, dass die neue Kollegin sich an die bisher von mir im Schweiß meines Angesichts durchgesetzten Coding-Standards hält? Wie definiert man für sich Schwellenwerte, hinter denen neue Ideen zum Redesign des eigenen Codes führen sollten?"
usw...
Der Vollständigkeit halber, aber nur deswegen... Ich heiße so, das "P" ist der erste Buchstabe meines Nachnamens 😉
Original von Code-Hacker
War das eine Anspielung auf mich und darauf wie mein entwickelter Code aussieht? 😉
*schmunzel* Nee, war keine Anspielung auf irgendwen hier, und Hacking gehört zum Programmieren sowieso dazu. Man kann nämlich bei allzu viel Dogmatismus auch mit Kanonen auf Spatzen schießen 😉
Aber ich finde es schön, dass meine Anregung so viel Anklang findet. Ich verfeinere meine Idee mal ein wenig:
Forum-Name: Software-Entwicklung allgemein
Unter-Foren:
1. Software-Projekt-Planung und -Management
Was gehört in ein Pflichtenheft? Wie definiert man Milestones? Wie verwaltet man ein Mehr-Personen-Projekt? Wie hält man Termine ein? Wie erklärt man den GAU seinem Chef und seinen Kunden? Wie hält man sich die Vertriebsfritzen vom Leib?
2. Vom Fehler zur Lösung
Erfahrungsberichte aus der Praxis zu typischen Problemstellungen; welche Ansätze sich als problematisch erwiesen haben und warum -- und bewährte Alternativen.
3. Patterns & Practises
Erprobte Ansätze zum Entwurf und zur Entwicklung von Software, zur Lösung typischer Aufgaben und zum Umschiffen alltäglicher Klippen.
4. Philosophisches
Static? Singleton? Instanz? Erfahrungsaustausch und Diskussion über Software-Entwicklungs-Strategien.
2 und 3 überlappen sich natürlich. Meine persönliche Idealvorstellung wäre, wenn Leute, die Lust drauf haben, erstmal in (2) einen kurzen, knappen Erfahrungsbericht schreiben und erzählen würden, was sich so alles als problematisch bis total besch...eiden erwiesen hat, und dann in (3) eine gute, erprobte Lösung vorstellen.
... oder so ähnlich.
Ein Forum, in dem man sich über typische Programmier(er)fehler austauschen kann. Ich finde solche Beiträge, die in vielen Programmier-Foren immer wieder mal irgendwo auftauchen, sehr lehrreich. Man könnte es auch à la MS "Patterns & Practises" nennen und ähnlich wie in den FAQ, aber eben spezifischer, vom Fehler zur Lösung arbeiten. Dabei solls nicht so sehr um ganz spezielle Dinge gehen ("Wie zeige ich meine MySQL-Tabelle in einem DataGrid an?"), sondern eher in der Art "Wie entwerfe ich grundsätzlich eine Multi-User-Datenbank-Anwendung, und worauf muss ich achten?"
Interessant sind dann zwar auch Tutorials (aber die gibts ja teilweise schon zuhauf), aber vor allem Erfahrungsberichte der Sorte "Ich habe es erst so und so gemacht, aber das war totaler Mist, weil: 1., 2., 3.". Wer dann vor einer solchen Aufgabe steht und sich vielleicht ähnliche Gedanken macht, wie der Autor zu Beginn, und somit in dieselben Probleme rennen würde, kriegt dann kein "mach es mal so, Kleiner!" um die Ohren, sondern eine Erklärung und einen "Denk-Weg", den er entlang gehen kann, um an Ende (hoffentlich) so schlau zu sein wie der Autor, ohne dessen Fehler selbst machen zu müssen.
In so einer Forums-Ecke könnte man außerdem ein bisschen über Entwurfsmuster (Singleton? static? oder doch eine normale Instanz?) und Vorgehensweisen (Top-down? Bottom-up? Kraut-und-Rüben?) philosophieren. Ich persönlich mag solchen Austausch jedenfalls, weil es gegen Betriebsblindheit hilft ("ich hab das gestern so gemacht, also mach ichs heute auch wieder und morgen erneut, bis mir einer erklärt, warum meine Idee dämlich ist!").
Für n00bs hätte diese zweite Abteilung vielleicht eher Unterhaltungs- als praktischen Nährwert, aber auf jeden Fall dürfte es den einen oder anderen aufmerksamen und geneigten Leser dazu animieren, sich damit auseinander zu setzen, dass es eben doch einen grundlegenden Unterschied zwischen Code-Hacken und Software-Entwicklung gibt 😉