Laden...

Forenbeiträge von Xander Ingesamt 54 Beiträge

25.05.2011 - 15:07 Uhr

Eine Frage die direkt dazu gehört hab ich nun aber doch noch. Wie bekomm ich jetzt noch den ein oder anderen Wert durch Simikolon getrennt als Wert neben den nun aufklappbaren Eintrag?

25.05.2011 - 14:13 Uhr

Danke. Der letzte link isses.
Naja über die Zeit wiederholen sich die Fragen wohl. Aber ich habs trotzdem nicht gefunden. Evtl bin ich auch zu blöd die Suche zu Bedienen ohne 100 irrelevante Ergebnisse zu bekommen.

Danke auf jedenfall 😃

25.05.2011 - 11:42 Uhr

Hi,
ich bin grade dran mich an einem eigenen UserControl zu versuchen, das ich auch mehrfach einsetzen will. Daher soll die Konfiguration über den Designer möglichst kompfortabel von der Hand gehen.
Nun hab ich also aufs Control gezeichnet und einige einfach Attribute und Events hinzugefügt. Samt beschreibung usw, funktioniert auch soweit wunderbar.

Was ich aber nicht hinbekomme: ein "aufklappbares" Attribut, wie zum Beispiel Location mit seinen beiden "Unterattributen" X und Y. Wie bekomm ich sowas hin?

Ich hab erstmal versucht eine eigene Klasse mit den entsprechenden Attributen wiederum als Attribut zu verwenden. Das klappt so aber nicht. Es taucht zwar im Property-Browser auf ist aber grau und man kann damit nichts anfangen. Ich denke mal das ist der falsche Ansatz aber ich habe leider keine Idee wie das geht. Bzw hab ich auch nichts entsprechdendes gefunden.

03.03.2011 - 13:57 Uhr

Ich hab die LateBindingAPI ja vor einiger Zeit für ein Programm benutzt, was auch erstmal toll und kompfortabel geklappt hat aber scheinbar schaufelt die API den RAM voll bei längerem gebraucht. Das fällt sicherlich bei den meisten Anwendungen garnicht auf.

Nachdem ich ewig den Fehler gesucht hatte, hab ich aus allen XlApplications, XLWorkBooks usw, wieder normale Workbooks usw gemacht und die übrigen Befehle entsprechend angepasst. Und siehe da, die Speicherauslastung meines Programms bleibt konstant bei 30MB. Mit der Api wird pro "Füge eine Zeile ans Excelfile an"-Durchlauf der Speicher voller, sodass nach ca. einem Tag die 2GB Ram voll sind.

Es ist vermutlich mal kein Anwendungsfehler meinerseits, da es ja mit den umständlichen Klassen des Interop.Excel problemlos funktioniert. Wäre schön wenn wir irgendwie rausfinden könnten wieso der angenehmere Umweg über die API den Speicher füllt.

02.03.2011 - 06:56 Uhr

Die DGVs werden vom Thread der Form aktuallisiert. Da ist ein Evenhandler auf ein Event des Arbeitsthreads aktiv, welches Änderungen registriert und die Aktuallisierung started. Das sollte von der Synchronisierung her doch so passen?

Ich werd das mit dem Profiler nachher gleich mal probieren. Bisher hab ich dammit noch nicht gearbeitet. Derartige Probleme gabs noch nicht.

01.03.2011 - 15:55 Uhr

Hi,

ich bin grade an einem Programm das Daten am COM-Port empfängt und, weils so gefordert ist in einem Excel-Workbook ablegt. Nun dachte ich eigentlich ich wäre fertig, aber der Speicherbedarf der Anwendung steigt weiter und weiter. Ja ich weis dass der GC sich darum kümmert wenns knapp wird. Aber selbst bei einem System das schon jede menge Swappen muss, weil der RAM voll ist steigt der Bedarf weiter. Ich finde aber die Ursache nicht.

Die lokal deklarierten Objekte sollten ja wieder freigegeben werden, sofern ich damit nicht noch irgend was anderes aufrufe. Also alle int, double, string, byte[], List<> usw...?
Als globale veränderliche hab ich lediglich einen StringBuilder, 2 List<string>, 2 DataTable und 2 Excel Workbooks

Kurz zum Ablauf des Programms:
Beim Start wird in einem extra Thread angelegt für die Aufbereitung der Daten und zum füllen des Excel-Files.

Beim SerialPort.DataReceived-Event werden die Daten am StringBuilder angehängt. Dann wird der String gesplittet bei '\r', der StringBuilder wird per Clear() geleert und der letzte Part des Splits wird wieder in den Stringbuilder eingefügt.
Die übrigen Teile des Splits werden an das Worksheet im ExcelFile angehängt und ausserdem für die Anzeige per Event an die Form geschickt, wo das ganze jeweils bei '\t' gesplittet und anhand des Inhalts in Datatable1 oder Datatable2 angefügt. 2 der Werte werden an die Listen angefügt. Die Tables sind an DGVs gebunden und die Listen werden je an eine Serie in einem Chart gebunden. Die Methode fürs das ganze wird per Invoke ausgeführt, da ich scheinbar die Daten jedesmal neu an die Series binden muss.

Überschreitet eine der DataTables oder Listen 100 Einträge wird per RemoveAt(0) der erste Eintrag entfernt.

Soviel dazu. Ich komm einfach nicht dahinter wo Datenleichen zurückbleiben.
Bei Clear() und RemoveAt() wird der entsprechende Speicher doch freigegeben beim nächsten GC durchlauf?
Kann das ganze mit den ExcelWorkbooks zu tun haben? Beim Neustart der Anwendung ist der Speicherbedarf immer der gleiche. Egal ob in dem Excel-File keiner oder schon 1000000 Einträge sind. Aber die Excel.exe braucht auch kontinuierlich mehr Speicher.

Ich hoffe das ist ausführlich genug, damit evtl jemand einen Tipp für mich hat. Bei überschlagen 30kb Speicher pro Sekunde ist der Ram irgendwie doch recht flott voll.

11.01.2011 - 10:27 Uhr

Okay, nun bleibt aber noch das Problem, dass das Manuelle öffnen der Excel-Datei während der Laufzeit des Programms dazu führt, dass alle anderen vom Programm geöffneten Dateien ebenfalls sichtbar werden. Bzw. manipuliert werden.

Wenn Excel einfach eine weitere Instanz von EXCEL.EXE starten würde, anstatt die von meinem Programm mitzubenutzen wären die Probleme alle hinfällig. Gibts eine Möglichkeit anderen Anwendungen die Mitbenutzung meiner vom Programm geöffneten Excel-Instanz zu verbieten?

11.01.2011 - 07:46 Uhr

Naja ich muss die Datei schon bearbeiten. Also fällt das weg.
Wie find ich denn mittels Com die laufenden Prozesse? Atm kann ich die Mit Systems Diagnostic finden und ggebenenfalls beenden, aer eben nicht verwenden.

10.01.2011 - 15:26 Uhr

Hi,

jeder kennt das wenn man in excel eine Datei öffnet und die selbe wieder öffnen will, sagt einem Excel, dass die datei schon benutzt wird und nurnoch schreibgeschützt geöffnet werden kann. Genau das will ich auch.

Wenn mein Programm nun aber eine ExcelApplication erstellt und ein Workbook öffnet und ich dann manuell nochmal die selbe Datei öffne, während mein Programm damit werkelt, wird das Workbook sichtbar und ich kanns schließen. Das hat zur folge dass es auch für mein Programm geschlossen wird und dann alles nicht mehr geht.

Damit verbunden gleich noch ein anderes Problem, das genau in die andere Richtung wirkt. Wenn die Datei schon offen ist vom Excel und ich dann mein Programm starte, kann es logischerweise nicht auf die Datei zugreifen. Also müsste man rausfinden ob die Excel-File schon offen ist. Aber wie? Ich wollte alle Workbooks der ExcelApplication durchgehen aber da sind keine drin. Die offnen Workbooks laufen offenbar unter einem anderen Prozess von Excel. Hab ja auch mehrerer EXCEL.EXE im taksmanager aufgeführt. Aber wie greif ich auf deren offene Workbooks zu? Momentan schließe ich ALLE laufenen EXCEL-Prozesse. Aber das ist natürlich blöd da auch geöffnete Excel-Tabellen geschlossen werden, die mit meinem Programm garnichts zu tun haben.

22.12.2010 - 13:47 Uhr

Ich idiot hab den index vergessen. Da gibts natürlich auch kein Width. Args. Thx

22.12.2010 - 10:58 Uhr

Hi,

ich hab ein DataGridView an ein DataTable gebunden. Nun haben die Spalten aber bestimme verhältnisse zueinander. Ganz dumme frage, wie Spreche ich die Columns an um die Width einzustellen??

Als ich vorher das DataGridView per hand angelegt hatte im Designer wurden ja für jede Column ein neues Object angelegt, das ich direkt über seinen Namen anspreche und per columnname.Width einfach ändere. Aber bei DataTable kann ich natürlich kein "Design" einstellen. Aber beim DataGridView kann ich ja auch nicht direkt auf die Columns.Width zugreifen.

20.12.2010 - 15:48 Uhr

Hi,
das offset das du anhängen willst kriegst du mit

TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now);
16.12.2010 - 16:31 Uhr

Dank einem denkanstoß von dir hab ichs nun hinbekommen. Da ich allerdings nicht LateBindingAPI und parallel direkt Microsoft.Office.Interop.Excel benutzen will mussich wohl warten bis dus eingebaut hast oder es selbst reinbaun. Mag keine frickellösungen ^^

using Microsoft.Office.Interop.Excel
...

Application a = new Application();
Workbook w = a.Workbooks.Open(@"Pfad");

Series s = (Series)w.Worksheets[2].ChartObjects[1].Chart.SeriesCollection(1);
s.Format.Line.Weight = (float)2;
s = (Series)w.Worksheets[2].ChartObjects[1].Chart.SeriesCollection(2);
w.Close(true);

für 2 Linien im Chart auf dem zweiten Worksheet.

15.12.2010 - 13:53 Uhr

Hi,

ich sitze immernoch/wieder an der Excelsache. Diesmal liegt das Problem darin dass das von mir mit Daten gefüllte Diagramm zu dicke Linien hat (2.25). Dadurch werden große Teile anderer Linien überdeckt und das ganze Diagramm recht unübersichtlich.

Gibt es eine Möglichkeit Programmtechnisch die Liniendicke zu verändern?
Irgendwo stand was vonwegen xlChart.SeriesCollection() aber das gibts bei mir nichtmal.

10.12.2010 - 08:58 Uhr

@Xander:
Das Event DataReceived der Klasse SerialPort wird in einem anderen Thread ausgeführt, wenn du das meintest. Um das Threading selber hat sich der Aufrufer selber zu kümmern. Da passiert sonst nichts automatisch.

Naja wenn ich doch aber für jeden Port ein neues Object erstelle und ein DataReceived-Event für jedes, dann ist das doch ebenso asynchron und man muss sich nicht um weiteres Threading kümmern.
Warum soll man für ein so kleines Problem soviel Aufwand betreiben?

09.12.2010 - 15:59 Uhr

Hi,

wäre hier nicht List<> günstiger? Und in dem fall eben List<List<string>> ? Naja statt string eben was rein soll.
Das lässt sich dann erweitern List[0].Add oder für die andre Dimension eben List.Add();

Die Gefahr die mir jetzt auffällt, dass beim erweitern kein quadratisches Feld aufgespannt wird, sondern das z.B. 3x3 array auch so aussehen kann, wenn man nicht gleichmäßig alle spalten durchläuft und erweitert:
[x][x][x]
[x][x]
[x][x][x]

Da gleich meine eigene Frage an erfahrenere. Funktionieren tut das, aber sollte man das benutzten? Gut oder eher schlecht? ^^

Oder ein DataTable. Da kannst du Rows und Columns hinzufügen wie du magst.

Als dritte möglichkeit, wenn auch vermutlich nicht schön kannst du auch ein passend großes Array neuanlegen und einfach alles umkopieren.

09.12.2010 - 15:47 Uhr

Kümmert sich nicht der Eventhandler um dieses Multithreading?

09.12.2010 - 15:44 Uhr

doch über das Object sender. Ich habs nur von sender in comPort umbenannt, weil ich das eben so mache um nicht zu vergessen was ich da bekomme.

09.12.2010 - 15:03 Uhr

Das hier klingt wie das was du wissen möchtest.
http://www.computerhilfen.de/hilfen-14-224290-0.html

P.S.
nur so nebenbei.
Beim suchen ist mir aufgefallen, dass hier im Forum bereits 2005 ein Österreicher an der Frage gescheitert ist. Witziger zufall.
Input an Parallelerschnitt. (event. InpOut32.dll)

09.12.2010 - 14:48 Uhr

SerialPort.GetPortNames() liefert dir ein Array mit allen verfügbaren COM-Portnamen. Ich bin zwar auch noch recht neu in der C# programmierung aber warum definierst du den SerialPort global?

wie wäre es mit etwas in der Art:

private void button1_Click(object sender, EventArgs e)
    ...
    foreach (string portName in SerialPort.GetPortNames()) 
    {
        UMTS_GetData(Port_Connect(portName), textBox1.Text)
    }
    ...
}

private SerialPort Port_Connect(string portName)
{
    ...
}

private voidUMTS_GetData(SerialPort comPort, string pin)
{
    ...
}

private void port_DataReceived(object comPort, SerialDataReceivedEventArgs e)
{
    ...
comPort.close();
}

Das sollte alle möglichen Ports durchprobieren und das Problem, mit der Zerstörung von Port-Objecten auf deren Antwort du noch wartest, beseitigen

07.12.2010 - 11:37 Uhr

Nunja das Problem konnte ich schon dadurch beheben, dass ich das Chart nurnoch beim beenden meiner Anwendung aktuallisiere. Aber das Clear werd ich dennoch lieber mit einbauen.

Das letzte verbliebene Problem:

Wenn ich per SetSourceData folgende Range einfüge
"$E4;$E6:$E{0};$G4:$H4;$G6:$H{0}" , dann nimmt er Spalte E,G;H. Logisch.

Nehme ich allerdings
"$B4;$B6:$B{0};$E4;$E6:$E{0};$G4:$H4;$G6:$H{0}" , dann nimmt er B,C,G,H. Das versteh ich nicht. Das lies sich noch weiter machen. Ich hab testweise mal ein paar spalten im Excelfile vertauscht, sodass ich dann
"$B4;$B6:$B{0};$F4:$H6;$F6:$H{0}" ausgewählt habe. Da wählte Excel wieder skurrilerweise B,C,G,H.

Bei "$B4;$B6:$B{0};$F4:$I6;$F6:$I{0}" gabs schließlich B,C,F,G,H. Das was ich eigentlich bei dem vorhergehenden aufruf haben wollte. Wie kommt denn sowas nur zustande?

07.12.2010 - 09:27 Uhr

Also ich bin jetzt erstmal ein Stückchen schlauer.

Ich verzichte atm aufs Datum und nehme $E4:$Exx;G4:Hxx;
nun verändere ich aber jede Zeile die Source und scheinbar wird die da nicht ersetzt sondern eweitert. D.h. im Diagramm ensteht für jeweils 3 Werte jeder Reihe eine neue Datenreihe. Das soll ja nun nicht.

EDIT: Das hängt wohl wieder damit zusammen dass er die eigentlichen Werte als horizontale Achse missbrauchen will.

06.12.2010 - 14:41 Uhr

Was mich total verdutzt ist auch dass in dem Diagrammdatenfeld von Excel immer was anderes steht als ich per SetSourceData reinschiebe.

Ich hab schon folgendes, sowie sich daraus ergebender Variationen probiert. ALso alles mit beiden Sheets als Range Quelle sowie mit und ohne Zahlenwerte, mit $B4 sowies $B$4 entsprechend für alle, mit Datum ohne Datum. Es funktioniert ja nichtmal wenn ich nur $E6:$E20 eingebe.


XlWorksheet zahlenwerte = workSheet = workBook.Worksheets[1];
XlWorksheet chartsheet = workSheet = workBook.Worksheets[2];
LateBindingApi.Excel.Charts.XlChartObject chart = chartSheet.ChartObjects[1];

XlRange dataRange;

dataRange = zahlenwerte.Range(string.Format("$B4:$K{0}", LastUsedRow));
chart.Chart.SetSourceData(dataRange);

dataRange = zahlenwerte.Range(string.Format("=$G$4;$G$6:$G${0};$H$4;$H$6:$H${0};$E$4;$E$6:$E${0}", LastUsedRow));
chart.Chart.SetSourceData(dataRange);

dataRange = chartSheet.Range(string.Format("Zahlenwerte!$E6:$E{0};Zahlenwerte!$E4:$E{0};Zahlenwerte!$G4:$G{0};Zahlenwerte!$H4:$H{0}", LastUsedRow));
chart.Chart.SetSourceData(dataRange);


06.12.2010 - 14:27 Uhr

Wenn ich das benutze habe ich statt der gewünschten 3 Werte nur 2 und dazu noch die falschen. Da steht dann Zeitliche zuordnung und Datum drin statt Minimum, Maximum und Mittelwert.

Ich sitzt da schon seit Freitag dran und verzweifel 😕

06.12.2010 - 13:59 Uhr

Ja frag mich. ^^ Ich hab das auch nur so bekommen. Warum Spalte C überhaupt mit einbezogen wird ist mir auch ein Rätsel. Bei den anderen 3 Spalten scheint der Name der in der Legende auftaucht aus der 4. Zeile zu kommen. Das macht ja irgendwo noch Sinn. Das Datum soll als Horizontale Achsenbeschriftung herhalten. Nur weis ich nicht wie man das außerhalb von Office einstellen kann.

06.12.2010 - 12:13 Uhr

Ok. Ich hab mal ein paar 100 der Beispieldaten rausgeworfen damits kleiner wird. Aber das sollte ja egal sein.

Das oben gepostete Bild ist aber nicht komisch. So soll das aussehen. ^^

06.12.2010 - 08:31 Uhr

Du meinst das mit dem Diagramm? Geht auch. Hauptsache es ist hinterher das gleiche Diagramm. Es wäre mir im Grunde sogar lieber das Teil neu zu erstellen, da ich dann das ExcelTemplate nicht mit dem Programm mit schleifen müsste. War nur etwas zu faul rauszufinden was der alles an den Charts für einstellungen vorgenommen hat. Aber auch dann weis nich ja immernoch nicht wie ich dem Chart sage, welche der ganzen Werte Achsenbezeichnung sind und welche Messwerte für die Legende.

Ich hab das ganze Ding schon umgeschrieben und benutzte dein XLlateBinding. Thx erstmal dafür, das macht das ganze deutlich übersichtlicher und einfacher.

03.12.2010 - 13:26 Uhr

Hi,

ich hab ein ExcelFile mit 3 Sheets. Im ersten stehen die Zahlenwerte, welche ich Zeile für Zeile erweitere. In dein beiden anderen Sheets sind zusammen 5 Charts . Das soll ich so als Vorlage nehmen. Die Charts sollen nun entsprechend der bereiche aus denen sie Daten beziehen erweitert werden, weil sie ja die neuen Werte sonst nicht berücksichtigen.

Hier komm ich jetzt nicht weiter. Die Charts stellen immer gleich mehrere Werte als Diagramm dar. Ich habs mit Chart.SetDataSource() reingepackt aber das Diagramm ist total verhunzt. Ausserdem ist die Zeile mit dem Diagrammdatenbereich im Excel dann leer, obwohl was angezeigt wird.

Klar woher soll der auch wissen welcher der Werte für die Achsenbeschriftung da ist und welcher Daten. Bzw zieht das Diagramm auch die Legendeneinträge aus dem Range.

Hier mal noch ein Bild von einem der Diagramme inklusive dem Diagrammdatenbereich so wie es ist bevor ich versuche ihn zu erweitern.

02.12.2010 - 15:33 Uhr

Juhu. Und danke für die Hinweise.
Aber ich würde die Aufgabenstellung gerne erstmal abgeben. Ich werd zwar mal überlegen ob mir was einfällt, was nicht zu einfach für euch alle ist aber ich will das hier nicht allzulang blockieren. Grade weil ichs auch zum Üben gut find 😄

02.12.2010 - 13:41 Uhr

Hi,

ich habs mal versucht aber als C# Neuling schaff ich Sekundenzeiten allerdings nicht. Ich bin mir nichtmal sicher ob es stimmt. Ich brauch ca. 2,5min für den Vergleich aller 4.294.967.296 Möglichkeiten und finden ca. nach 1,5min das erste und einzige Ergebnis.

Achja ich hab das nur versucht schnell hinzubekommen und nicht wirklich auf Form und speziell Zeilenlänge geachtet. Sorry.


    class BeuteTeilen
    {
        public BeuteTeilen()
        {
            Stopwatch stopWatch = new Stopwatch();
            string vertragAlice = "Hiermit beschliessen Alice und Bob die Aufteilung der Beute." +
                                  " Alice bekommt 80 Prozent und Bob den Rest.";
            string vertragBob = "Hiermit beschliessen Alice und Bob die Aufteilung der Beute." +
                                " Bob bekommt 80 Prozent und Alice den Rest.";
            string[] splittedAlice = vertragAlice.Split(' ');
            string[] splittedBob = vertragBob.Split(' ');
            int variations = Convert.ToInt32(Math.Pow(2,splittedAlice.Length - 1));
            byte[] SpecialHashAlice = new byte[variations];
            byte[][] SpecialHashBob = new byte[variations][];

            for (int i = 0; i < variations; ++i)
                SpecialHashBob[i] = SpecialHash(SpecialText(splittedBob, i));

            stopWatch.Start();
            for (int i = 0; i < variations; ++i)
            {
                SpecialHashAlice = SpecialHash(SpecialText(splittedAlice, i));
                for (int j = 0; j < variations; ++j)
                {
                    if (VergleicheInhalte(SpecialHashAlice,SpecialHashBob[j]))
                    {
                        Console.WriteLine("__________________________________________________");
                        Console.WriteLine("Result nach: " + stopWatch.Elapsed.ToString());
                        Console.WriteLine("Alice: " + SpecialText(splittedAlice, i));
                        Console.WriteLine("Hash: " + System.BitConverter.ToString(SpecialHashAlice));
                        Console.WriteLine("---------------------------------------");
                        Console.WriteLine("Bob: " + SpecialText(splittedBob, j));
                        Console.WriteLine("Hash: " + System.BitConverter.ToString(SpecialHashBob[j]));
                    }
                }
            }
            Console.WriteLine("__________________________________________________");
            Console.WriteLine("Alles durchprobiert nach: " + stopWatch.Elapsed.ToString());
            stopWatch.Stop();
            Console.ReadLine();
        }
        //---------------------------------------------------------------------
        bool VergleicheInhalte(byte[] val1, byte[] val2)
        {
            if (val1[0] != val2[0] || val1[1] != val2[1] || val1[2] != val2[2] || val1[3] != val2[3])
            {
                return false;
            }
            else
                return true;
        }
        //---------------------------------------------------------------------
        string SpecialText(string[] splittedOrginal, int variation)
        {
            StringBuilder sbHelper = new StringBuilder();
            string asBinary = Convert.ToString(variation, 2).PadLeft(16, '0');

            for (int i = 0; i < splittedOrginal.Length - 1; ++i)
            {
                sbHelper.Append(splittedOrginal[i]);
                if (asBinary[i] == '1')
                    sbHelper.Append("  ");
                else
                    sbHelper.Append(" ");
            }
            sbHelper.Append(splittedOrginal[splittedOrginal.Length - 1]);
            return sbHelper.ToString();
        }
        //---------------------------------------------------------------------
        static byte[] SpecialHash(string message)
        {
            byte[] result = GetMD5Hash(GetMD5Hash(Encoding.Default.GetBytes(message)));
            return new byte[] { result[0], result[1], result[2], result[3] };
        }
        //---------------------------------------------------------------------
        static byte[] GetMD5Hash(byte[] BytesToHash)
        {
            return new MD5CryptoServiceProvider().ComputeHash(BytesToHash);
        }
    }

Meine Lösung war dann:


Result nach: 00:01:38.462238
Alice: Hiermit  beschliessen Alice und  Bob die  Aufteilung  der  Beute. Alice bekommt 80  Prozent  und Bob den  Rest.
Hash:A3-D5-6C-0A
------------------------------------------------
Bob: Hiermit beschliessen  Alice  und  Bob die Aufteilung der Beute.  Bob bekommt 80  Prozent  und Alice den  Rest.
Hash:A3-D5-6C-0A

24.11.2010 - 15:38 Uhr

Alternativ, falls das mit den IDs oben mehr als nur Symbolcharakter hat

SELECT * FROM Orders WHERE (ID ≥ 1 AND ID ≤ 123) OR (ID ≥ 150 AND ID ≤ 1000) OR ...

Die Abfragen quasi in zusammenhängende bereiche zusammenfassen, wenn das möglich ist.

18.11.2010 - 08:15 Uhr

Naja für jemand der beim lesen fremden Codes noch nicht so geübt ist kann das schon beängstigend sein. Das wiederholt sich so 10mal mit einigen Änderungen für jede ComboBox.

ok nächstes mal such ich nach was besonders gruseligerem 😜

18.11.2010 - 07:42 Uhr

Da möcht ich jetzt auch mal was zu beitragen. Folgendes ist ein Schnipsel aus einem Projekt das ich um ein paar Funktionen erweitern darf. ich bin grad dabei zu versuchen zu verstehen was mein Vorgänger wo und wie gemacht hat und versuch gleich mal zu benutzen was ich gestern dank gfoidl über CCD gelesen hab.

    
private void InitializePortData()
    {
      // Zähler
      int i;
      // Namen
      string[] PortNames = SerialPort.GetPortNames();
      // Index
      int CurIndex = -1;

      // Portnamen setzen
      for( i = 0; i < PortNames.Length; i++ )
      {
        // Index
        int Index = this.PortNameCmbBox.Items.Add(PortNames[i]);

        if (PortNames[i] == this.SrPort.PortName)
          CurIndex = Index;
      }

      if (this.PortNameCmbBox.Items.Count > 0 &&
        CurIndex >= 0 && CurIndex < this.PortNameCmbBox.Items.Count)
      {
        this.PortNameCmbBox.SelectedIndex = CurIndex;
      }
...
}

18.11.2010 - 07:23 Uhr

Schau dir mal das Windows Forms Sample HIER an. Fand ich letztens recht hilfreich um überhaupt mal einen Einblick den Funktionsumfang von MSChart zu bekommen.

17.11.2010 - 14:30 Uhr

Hehe, ja der Thread war ein bisschen Mitbegründer meiner Fragen.

17.11.2010 - 11:59 Uhr

Gibts eventuell einen gewissen Trend zu dem ganzen? Aber bitte nicht einfach weglassen ^^

@dN!3L
Du sprichst dich in dem Thread ja als Gegner von Regions aus. Aber grade wenn man die XMLKommentare fürs IntelliSense benutzt wird das ohne relativ schnell sehr übersichtlich. Was machst du da um das ganze übersichtlicher zu halten?

btw hab ich mal einen Screenshot einer Testklasse mit der ich den Umgang mit XML in C# probiert hatte angehängt. Da ist mal alles zugeklappt bis auf eine Region. Versuchs halt nach logischen zusammengehörigekeiten zu kapseln.

17.11.2010 - 11:40 Uhr

Da is ja schon mal etwas zu dabei.

@herbivore
Ich hab nach "codegestaltung", "codestyle", "codedesign" und noch einigen anderen dingen gesucht. Jeweils zusammen und getrennt sowie ohne das Beiwort Code. Nach "Konvention" oder "Gliederung" hatte ich aber in der Tat nicht gesucht. 😉

@gfoidl, der Link ist mal sehr aufschlussreich. Besonders folgendes Zitat vom Anfang.

Ein professioneller Softwareentwickler setzt sich mit dem Metier bewusst auseinander.
D.h. er reflektiert über sein Produkt, seine Arbeitsweise, seine Materialien und Werkzeuge. Ein professioneller Softwareentwickler ist nicht einfach zufrieden, wenn sein Chef oder Kunde zufrieden sind. Er ist auch nicht einfach mit dem zufrieden, was ein Hersteller ihm empfiehlt. Stattdessen beobachtet und prüft er ständig seine Ergebnisse und bemüht sich um die Weiterentwicklung seiner selbst wie auch des Metiers.

Ich bin ja noch weeeeeeeeeeeit weg von professionell, aber immerhin kann ich mich in dem da unten wiederfinden. In dem einen Monat C# hab ich deswegen ein bereits funktionierendes Projekt nochmal fast komplett neu gemacht und werds wohl nochmal überarbeiten, weil ich nun einige Sachen gelernt/gesehen hab, die das ganze kürzer/schneller oder einfach besser machen.

17.11.2010 - 10:56 Uhr

Hi,
ich hab jetzt ein wenig die Suchfunktion beansprucht und die FAQs durchwählt aber dazu nix präzises gefunden. Da ich ja noch relativ am Anfang stehe und daher noch flexibel was meine "Form" angeht möchte ich gerne wissen was bei der Gestaltung des eigenen Codes beachtet werden muss, was Geschmackssache ist und was man niemals nicht tun sollte.
Eventuell hat ja wer ne Art Leitfaden.

Grundsätzlich liefert das openbook von galileocomputing ja schon ein klein wenig dazu, ala Groß- und Kleinschreibung bei Klassen/Methoden/Variablen und wie man die Namen wählen sollte. Quasi Kommentare sparen und Übersichtlichkeit erhöhen durch ausdrucksstarke Bennennung aber das ist mir schon klar.

Ich selbst hab mir in der kurzen Zeit jetzt angewöhnt verhältnismäßig oft #region/#endregion zu verwenden. Ob das nen Fehler ist weis ich nicht aber so verschwindet Code aus meinem Blickfeld den ich grade nicht betrachten will. Also meist Methoden über und/oder unter der die ich grade Bearbeiten will. Zudem ist das Ding quasi gleich noch ein Kommentar der den jeweils gekapselten Codschnipsel beschreibt. Mehr als ne Zweifachverschachtelung mache ich allerdings nicht, sonst wärs das mit der gewonnenen Überscht.

17.11.2010 - 08:47 Uhr

Ich hab vor kurzem angefangen mich durch Creative Commons lizensierte Musik zu hören. Da gibts ja auch schon ne ganze Menge und vieles ist erstaunlich gut.

Um mal eins zu nennen aus bisschen 8bit Musik und Gitarre "Pornophonics" mit Sad Robot. ^^
Kann man sich gratis und Legal unter www.jamendo.com anhören/runterladen und je nach gefallen seine Lieblingskünstler direkt supporten.

16.11.2010 - 18:31 Uhr

Wieso nicht? Die Änderung die zu einer Reaktion führen sollen nimmt im Regelfall ja der User im DGV vor. Warum soll das dann nicht reagieren, wenns dafür doch ohnehin schon den passenden Handler gibt? Muss sich ja mal jemand was dabei gedacht haben.
Und dass man als Reaktion dann die gebundenen Daten ändert statt das DGV das kann man ja dann handhaben wie man lustig ist.

Aber ich lass mir gerne erläutern warum man das nicht machen sollte. Bin ja noch recht frisch bei der C# Programmierung und da nimmt man eben den einfachsten Weg der einem in den Blick fällt. =)

16.11.2010 - 15:32 Uhr

Mhhh mal naiv mit einem DataGridView gedacht braucht man nichtmal mehr ein eigenes Event. Mit "CellValueChanged" reagiert das Programm auf eine Änderung und man bekommt ja auch einfach raus in welcher Cell diese war und kann auf Beziehungen zu anderen Zellen prüfen.
Evtl sollte man wärend des Aktuallisierens das Event noch deaktivieren, damit mans nicht dauernd mit abfeuert.

Naja nur so ein Gedanke. Ein entprechendes Event, das auf Änderungen bei den Bezügen reagiert ist aber vermutlich etwas effizienter.

16.11.2010 - 12:55 Uhr

Lass mich raten. Vorher hattest du genau eine Zeile?
Du musst natürlich alle Zeilen dann vom Programm erzeugen lassen. Also

this.gridView.Rows.Add()
16.11.2010 - 11:13 Uhr

Das ist merkwürdig. Bei mir gehts. Es ist nicht zufällig die ForeColor gleich der BackColor? Nur um das einfachste mal auszuschließen. 😁
Bzw. ist das angelegte auch Cells[0]? Keine anderen Columns davor?

Funktioniert das Dropdownmenü beim drauf drücken? Die 3 Einträge sollten ja angezeigt werden?

16.11.2010 - 10:26 Uhr

int i,j = 0; //Zeile und Spalte 
datagridview1.Rows[i].Cells[j].Value = "ja";
//oder
//datagridview1.Rows[i].Cells[j].Value = "nein";
//oder
//datagridview1.Rows[i].Cells[j].Value = "vielleicht";

je nachdem was du eben willst und wohin es soll. Wenn du es über einen Index haben willst wirst du wohl den Weg über Enums von ErfinderDesRades nehmen müssen.

16.11.2010 - 07:51 Uhr

Naja vCombo.Index ist Read-Only. Hast dus mal mit vCombo.DisplayIndex probiert? Naja das wird dir vermutlich nicht viel helfen, da es ja nur die angezeigte Reihenfolge beeinfluss.

Wozu willst du den Index der Column eigentlich selbst bestimmen?

15.11.2010 - 09:42 Uhr

Achso. Wenn das noch immer nicht will kanns auch an der Konvertierung liegen, die wir hier bisher ja nicht extra durchführen. Dann einfach noch (Image) vor resizedImage setzen beim erstellen des Graphics-Objektes und beim return.
Dann sollte es aber eigentlich funktionieren.

15.11.2010 - 09:17 Uhr

Probier mal folgendes

        public static Image Resize(Image originalImage, double newWidth_p)
        {
            double dlFaktor = newWidth_p / originalImage.Width;
            double newHeight = dlFaktor * originalImage.Height;
            double newWidth = dlFaktor * originalImage.Width;

            Bitmap resizedImage = new Bitmap((int)newWidth, (int)newHeight);
            Graphics newGraphics = Graphics.FromImage(resizedImage);
            newGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;

            Rectangle DrawingArea = new Rectangle(0, 0, (int)newWidth, (int)newHeight);
            newGraphics.DrawImage(originalImage, DrawingArea);

            return resizedImage;
        }
15.11.2010 - 08:49 Uhr
Bitmap resizedImage = new Bitmap((int)newWidth, (int)newHeight);
Rectangle DrawingArea = new Rectangle(0, 0, (int)newWidth, (int)newHeight);
newGraphics.DrawImage(resizedImage, DrawingArea);

return resizedImage;

Nur mal so als Frage. Wo füllst du resizedImage?

11.11.2010 - 15:51 Uhr

Das kann ich dir sagen. Durch das Vertauschen von Cosinus und Sinus, hast du im Prinzip nur die Änderungswerte für die Achsen X und Z vertauscht.

Mal angenommen du schaust nach exakt 0°, dann bewegst du dich bei einem Vorwärtsschritt ja 100% nach Z und 0% nach X. Du berechnest quasi immernoch den Rückwärtsschritt aber bewegst dich nun 100% nach X und 0% nach Z. Quasi nach rechts. Mit nem Minus wirds dann eben links.

Eigentlich clever ^^

11.11.2010 - 15:31 Uhr

Er hat doch geschreiben, dass er die Position der Figur anhand der Kameraposition aktualisiert. Macht doch auch keinen Unterschied ob man die Figur zur Kamera oder die Kamera zur Figur ausrichtet. Bei einem Shooter ist beides ja ohnehin am selben Fleck.

In dem Stück code steckt halt nicht drin, wie und wo er die Positionen synchronisiert.

@Pria
Thx für die Antwort. Ich sehe meinen Denkfehler.