Laden...

Forenbeiträge von SeeQuark Ingesamt 946 Beiträge

06.05.2009 - 20:27 Uhr

Du könntest sie auch per Reflection abfragen.
[Artikel] Reflection und Metaprogrammierung

ScrollBar horizontalScrollBar = (ScrollBar)typeof(DataGridView)
    .GetProperty("HorizontalScrollBar", BindingFlags.NonPublic | BindingFlags.Instance)
    .GetValue(dataGridView1, null);

ScrollBar verticalScrollBar = (ScrollBar)typeof(DataGridView)
    .GetProperty("VerticalScrollBar", BindingFlags.NonPublic | BindingFlags.Instance)
    .GetValue(dataGridView1, null);

MessageBox.Show("Horizontal: "  + (horizontalScrollBar.Visible ? "Sichtbar" : "Unsichtbar") +
                " | Vertical: " + (verticalScrollBar.Visible   ? "Sichtbar" : "Unsichtbar"));

Besonders schön ist der Code dann allerdings nicht.

mfg
SeeQuark

06.05.2009 - 14:37 Uhr

Es gibt sogar das Standardsnippet "invoke" dafür.

Ansonsten: :rtfm: Process.Exited-Ereignis
Das kommt mir einfacher vor, als dazu noch eine Klasse zu haben und ist vermutlich unmessbar performanter, da nicht ein zusätzlicher Thread benötigt wird (btw: IsBackground sollte da auf true sein.).

mfg
SeeQuark

06.05.2009 - 14:08 Uhr

@rastalt: Dein pattern berücksichtigt das Zeichen "°" noch nicht (macht aber nix) und hat noch den Schönheitsfehler, dass ausser ".gif" auch noch "xgif" möglich ist, da dein Punkt noch nicht escaped ist.

[PRE](?<=°>)[^<]+?\.gif(?=<°)[/PRE]

Es liefert zusätzlich nur den Filenamen und nicht noch die Abgrenzungen mit.

mfg
SeeQuark

05.05.2009 - 17:23 Uhr

Schnell, schnell:

<Slider Name="slidi" DockPanel.Dock="Top" IsSnapToTickEnabled="True" LargeChange="5" >
    <Slider.Template>
        <ControlTemplate TargetType="Slider">
            <ComboBox Height="{TemplateBinding Height}"
                      Width ="{TemplateBinding Width }">
                <ComboBox.ItemsSource>
                    <MultiBinding>
                        <MultiBinding.Converter>
                            <l:MultiToRangeConverter/>
                        </MultiBinding.Converter>
                        <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Minimum"/>
                        <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Maximum"/>
                        <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="LargeChange"/>
                    </MultiBinding>
                </ComboBox.ItemsSource>
            </ComboBox>
        </ControlTemplate>
    </Slider.Template>
</Slider>
[ValueConversion(typeof(double[]), typeof(double[]))]
class MultiToRangeConverter : DependencyObject, IMultiValueConverter
{
    object IMultiValueConverter.Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        try { return Convert((double)values[0], (double)values[1], (double)values[2]); }
        catch { return null; }
    }
    public double[] Convert(double start, double end, double step)
    {
        double[] doubles = new double[(int)((end - start) / step)];

        for (int i = 0; i < doubles.Length; i++)
            doubles[i] = i * step + start;

        return doubles;
    }

    object[] IMultiValueConverter.ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

Jedenfalls geht es so im Prinzip.

mfg
SeeQuark

05.05.2009 - 12:28 Uhr

Nun ich hätte gerne eine ComboBox mit den Elementen 1-100. Einen Slider könnte ich auch nehmen. Allerdings möchte ich dass der Benutzer den Wert präzise auswählen kann und habe mich daher für die ComboBox entschieden.

Du kannst bei einem Slider die IsSnapToTickEnabled-Eigenschaft auf :::{style="color: darkred;"}&quot;True&quot;){darkred} stellen.
Dann gehen nur die Werte im Abstand von LargeChange. Mehr nicht.

Wenn du dann auch noch das Aussehen der ComboBox haben willst, dann würde ich ein ControlTemplate schreiben (das Array bekommst du über einen Converter), aber bei 100 Elementen finde ich das eher unpraktisch für den Benutzer.

mfg
SeeQuark

04.05.2009 - 21:13 Uhr

Generell: Eine ArrayList sollte nicht mehr verwendet werden. Benutze dazu die Generischen Varianten. Siehe [Übersicht] .NET Framework 2.X Auflistungen.

  1. Problem: ausgelesen und geschrieben wird automatisch in char, ich brauche aber int-Werte zum sortieren.

StreamReader.ReadLine(); kannst du mit int.Parse in einen Integer verwandeln.

  1. Problem: wenn ich die Zahlen sortiert zurückschriebe, werden sie drunter geschrieben und nicht überschrieben.

Ich würde ein SortedDictionary<int,egal> verwenden. Dann wird automatisch sortiert.

Zum Beispiel-Code: [Hinweis] Wie poste ich richtig? Punkt 4. Wenn jemand nett ist und Zeit hat, bekommst du ihn vielleicht, aber verlangen kannst du so was nicht.

mfg
SeeQuark

04.05.2009 - 17:17 Uhr

Es ist wirklich genau das gleiche, nur sparst du dir etwas Tipparbeit.
Und imho wirkt es mit Lambda-Expressions auch etwas übersichtlicher.

Grössere Funktionsrümpfe sind in einer extra Methode besser aufgehoben.

mfg
SeeQuark

04.05.2009 - 17:12 Uhr

Erscheint bei mir 2

Will ich auch 😛.
Am Computer/GraKa kann es jedenfalls nicht liegen.

Jetzt beginnt das grosse Raten:
- Vielleicht verwendest keine Animationen sondern einen/bzw. mehrere Timer.
- Oder die Elemente haben SnapsToDevicePixels=(&quot;True&quot;){darkred}.

Vielleicht wäre es besser, wenn du den xaml-Code der relevanten Stelle bzw. einem Nachbau des Problem postest.

mfg
SeeQuark

04.05.2009 - 16:47 Uhr

Wegen deinem Doppelpost habe ich zuerst da geantwortet. Herbivore war so freundlich, das zu löschen.

Die "WPF-Fähigkeit" des Computer, die Tier, kannst du mit so auslesen:

void button_Click(object sender, RoutedEventArgs e)  
{  
    MessageBox.Show("Tier: " + (RenderCapability.Tier >> 16)); // Die >> müssen sein!  
}  

Zu der Tier: siehe :rtfm: MSDN:
>
.

mfg
SeeQuark

04.05.2009 - 16:40 Uhr

Etwas kleiner bekommen kannst du deine App vielleicht, in dem du sie in ein komprimmiert in ein Archiv (zip, rar, etc.) verpackst.
Eine Hilfs-Programm entpackt diese in den Arbeitsspeicher (byte[]) und startet sie.
System.Reflection.Assembly.Load nimmt auch ein byte[] an (damit sind lustige Spielchen möglich =)).
So könntest du vielleicht etwas Grösse rausholen, aber der Start dauert dann ewig...

Ich würde es einfach so lassen.

mfg
SeeQuark

03.05.2009 - 16:41 Uhr

Siehe da: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke).
Da wird es sehr schön erklärt und sollte danach eigentlich funktionieren.

Wenn jedoch sehr schnell, sehr viele neue ListViewItems hinzugefügt werden, dann sollte man das besser über einen Timer mit einer threadsicheren Queue (bspw. die Lockfreie threadsichere Queue) lösen.

mfg
SeeQuark

02.05.2009 - 18:17 Uhr

Mit WPF hast du imho viel ausgereiftere Layout-Panels (DockPanel, Grid, (Virtualizing-)StackPanel, UniformGrid, etc) als WinForms. Obwohl man mit diesen auch das meiste machen kannst.
Ausserdem wird da alles in logischen Einheiten (double) angegeben, und es ist alles vektororientiert. Du kannst also zoomen bis zum geht nicht mehr.
Shapes existieren auch.
Wenn man WPF erst einmal kennen gelernt hast, will man es nicht mehr missen.

Übrigens sprichst du jetzt vom Framework und nicht der Sprache an sich, die eig. völlig unabhängig von .NET definiert ist.

mfg
SeeQuark

27.04.2009 - 12:33 Uhr

Wie kann ich in einem Timer gesteuerter Code in einen Tread auslagern? Ich habe viel code... da dachte ich mir ob es vielleicht anstatt 10 Threads zu machen nicht einfacher wäre 1nen für die Zeit auf dem GUI zu machen?

Es gibt auch andere Timer, die ausserhalb des GUI-Threads laufen.

Eine Timer-Unterscheidung findest du bspw. hier: aufruf alle 10 sekunden.
Ich würde dir eher den System.Threading.Timer empfehlen.

Du musst aber aufpassen, dass du dann nicht direkt auf die GUI zugreifen kannst.
Siehe dazu [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke).

mfg
SeeQuark

27.04.2009 - 12:19 Uhr

Also jetzt verwende ich das DatePicker-Control aus dem WPF Toolkit.
Das ist von Microsoft, Opensource und enthält auch ein Datagrid.

mfg
SeeQuark

26.04.2009 - 18:42 Uhr

Das Wichtigste hast du nicht bedacht: Es sollte auch bei Computern laufen, die kein .NET installiert haben.
Dann müsstest du auf unmanaged C++ umsteigen. Generell wird im Thread Setup selbst programmieren davon abgeraten, einen eigenen Installer zu schreiben.
Da du mit .NET auch noch viel Interopt erledigen musst, ist C# auch noch ungeeignet.

Zu 2. siehe vielleicht auch noch Verknüpfung (*.lnk) erstellen. (Für diese Frage wäre vermutlich ein eigener Thread, bzw die SuFu besser gewesen.

  1. Ist nur eine der vielen Tätigkeiten, die ein Installer machen sollte. Das ist alles relativ komplex, du solltest also lieber fertige Installer (z.bsp. den schon erwähnten InnoSetup) verwenden.

mfg
SeeQuark

25.04.2009 - 17:01 Uhr

Vielleicht kannst du einen EventTrigger verwenden (DragOver-Event).

mfg
SeeQuark

24.04.2009 - 22:11 Uhr

Eventuell könnte für dich noch [Artikel] Reflection und Metaprogrammierung interessant sein.
Damit du das Programm während der Laufzeit erstellen kannst 😉
Generell würde ich aber die XML-Datei bevorzugen. Bei Bedarf noch "Deflaten", dann kann man es nicht so leicht öffnen.

mfg
SeeQuark

22.04.2009 - 12:14 Uhr

das war ein beispiel, wie du die bilder anzeigen kannst (XAML zu C#).
Wie du die Bilder alle lädst solltest du doch schon wissen (Directory.GetFiles) und es dann umzusetzen dürfte doch auch nicht mehr so schwer sein.

mfg
SeeQuark

21.04.2009 - 20:38 Uhr

Man kann es vieleicht irgendwie mit IndexOf machen.

Man kann auch einfach eine zweite Variable hochzählen.
Das ist immer noch performanter als eine for-Schleife, hat dafür aber auch einen Zähler.

Solange es nicht auf Performance geht, ist die for-Schleife üblicher, bzw. lesbarer.

mfg
SeeQuark

20.04.2009 - 18:09 Uhr

Die Bilder stupid anzeigen ist nicht schwer.
Anstatt des Grids kannst du auch das UniformGrid verwenden. Dann musst du die Margin-Property nicht angeben.
Ansonsten halt einfach die SourceProperty über das BitmapImage setzen. Margin ist vom Typ Thickness und Width, eh klar, vom Typ double.
Dann kannst du das auch per for-Schleife erledigen.

Ungetestet etwa so:

Grid grid = new Grid();

for (int x = 0; x < 10; x++)
    for (int y = 0; y < 10; y++)
        grid.Children.Add(new Image
        {
            Source = new BitmapImage(new Uri("TheSource")),
            Width = 1,
            Margin = new Thickness(x, y, x, y)
            ...
        });
Content = grid;

Es sei dir aber klar, dass du bei so vielen Bildern ev. auf die Alternativen umsteigen musst.

mfg
SeeQuark

20.04.2009 - 16:36 Uhr

Soll dein Programme alle millionen Bilder zusammensetzen?!?
Wenn die gross sind hast du bald Speicherprobleme.

Zusammensetzen kannst du die vielleicht noch arbeitsspeicherschonend mit XXL-Bilder Stitchen zusammensetzen, aber diese dann anschliessend anzuzeigen kann schon leicht zu einer OutOfMemoryException führen.

Hab ich soweit verstanden, was du willst?

mfg
SeeQuark

20.04.2009 - 16:32 Uhr

Du kannst die Daten direkt editieren und brauchst nicht mit den TextBoxen auffahren.

Ausserdem lässt sich ohne weiteres eine Star-Size der Collumns definieren, wie in einem Grid. Das hat mich am ListView gestört und einen einfacher WorkAround geht da auch nicht.

Ist halt etwas komfortabler und wenn du das Toolkit schon hast...

mfg
SeeQuark

19.04.2009 - 20:17 Uhr

Wenn du keinen Converter basteln willst, könntest du auch mehrere "DataContexte" nutzen, indem du an die Auswahl der Combo-/CheckBox bindest. Am Besten mit einem Trigger. Dazu gibt es beim Binding die Binding.ElementName-Property.

An die SelecedItemProperty muss man auch nicht binden, solange das ListView den gleichen DataContext nutzt. Für das SelecedItem kann man ein Slash vor die Property setzen.

Vielleicht noch einen Hinweis: Im WPF Toolkit (von MS) existiert ein DataGridView.

mfg
SeeQuark

19.04.2009 - 20:05 Uhr

Dictionary<int, Dictionary<TKey,TValue>>

Eigentlich müsste das Dictionary<int, KeyValuePair<TKey,TValue>> heissen.

Wenn du aber sowieso einen Indexer brauchst, warum nicht gleich eine List<int, KeyValuePair<TKey,TValue>>?

Ich möchte auf diesen Index mit "vor" und "zurück" über einen "int Zeiger" blättern können.

Dann könntest du auch eine LinkedList<> verwenden.
Die unterstützt genau das, jedoch keinen direkten Indexer.

Auf alle Fälle noch interessant: [Übersicht] .NET Framework 2.X Auflistungen.

mfg
SeeQuark

19.04.2009 - 19:58 Uhr

das gesammte Verzeichniss Zippen und dann Unzippen

Das Unzippen müsste sowieso gehen. Die Lib unzippt imho flach, da musste ich mal einen Workaround zum Verschachteln bauen.

Wie du ein gesamtes Verzeichnis zippen kannst erfährst du beim Snippet Verzeichnisse und Dateien rekursiv durchlaufen.

mfg
SeeQuark

17.04.2009 - 10:25 Uhr

Was möchtest du eigentlich rausfiltern?

Den Inhalt der Klasse, die einzelnen Werte der Klasse, etc?

Die einzelnen Werte erreichst du mit (?<=.+: ).+?(?=;), den Inhalt der Klasse mit (?<=\w {)[-\s\d\w:;#]+.

Ich kann dir noch das [Artikel] Regex-Tutorial bzw. zum Testen das On-the-fly Regex-Tester: Regex-Lab sehr empfehlen.

mfg
SeeQuark

17.04.2009 - 10:17 Uhr

Wie soll denn mit einem Komma, bzw. Punkt verfahren werden?

Soll das nachher abgeschnitten werden?
Dann ist die Variante von NeXoR.aT i.o., ev. könntest du den string dann noch splitten (int.Parse(myString.Substring(myString.IndexOf('.')));), was etwas performanter wäre.

Wenn du runden willst, kannst du Convert.ToInt32(double.Parse(myString)); verwenden (oder, etwas performanter, die erste Variante verwenden und wenn der Wert nach den Punkt grösser gleich 5 ist aufrunden).

Du musst aber aufpassen, da ein Komma nicht als Trennzeichen gilt. Möchtest du das, musst du eventuell die CultureInfo mitgeben, oder es "replacen".

mfg
SeeQuark

16.04.2009 - 18:58 Uhr

Grundsätzlich gilt ja dass man Events die man anmeldet auch wieder abmelden sollte um den GarbageCollector die Möglichkeit zu geben alten Speicher zu beseitigen.

Nicht ganz. Schau mal da: MemoryLeaks / nicht abgehängte Events.
So gross scheint das Problem nicht zu sein.

Ich habe das mal getestet:

using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows;
using System.Windows.Controls;

namespace EventTest
{
    public class TestWindow : Window
    {
        public TestWindow()
        {
            Height = 200;
            Width = 200;

            Button newWindowButton = new Button { Height = 25, Content = "Neues Fenster" };
            newWindowButton.Margin = new Thickness(5);
            newWindowButton.Click += (s, e) => openTestWindow();

            Button newWindowsButton = new Button { Height = 25, Content = "25 Fenster öffnen" };
            newWindowsButton.Margin = new Thickness(5);
            newWindowsButton.Click += (s, e) =>
            {
                for (int i = 0; i < 25; i++)
                    openTestWindow();
            };

            Button closeWindowsButton = new Button { Height = 25, Content = "Alle Fenster schliessen" };
            closeWindowsButton.Margin = new Thickness(5);
            closeWindowsButton.Click += (s, e) => closeWindows();

            Button allocRamButton = new Button { Height = 25, Content = "Speicher anfordern" };
            allocRamButton.Margin = new Thickness(5);
            allocRamButton.Click += (s, e) => allocRam();

            StackPanel stackPanel = new StackPanel();
            stackPanel.Children.Add(newWindowButton);
            stackPanel.Children.Add(newWindowsButton);
            stackPanel.Children.Add(closeWindowsButton);
            stackPanel.Children.Add(allocRamButton);

            Content = stackPanel;

            Closed += (s, e) => closeWindows();
        }
        List<Window> windows = new List<Window>();

        void openTestWindow()
        {
            Window window = new Window { Height = 120, Width = 180, Title = "Test" };

            window.Tag = windows.Count;
            window.Closed += (s, e) => windows.RemoveAt((int)window.Tag);
            window.ShowInTaskbar = false;

            ButtonControl button = new ButtonControl { Margin = new Thickness(10), Content = "Hallo" };
            button.Click += (s, e) => { MessageBox.Show("Event ist dran"); };
            window.Content = button;

            window.Show();
            windows.Add(window);
        }
        void closeWindows()
        {
            for (int i = windows.Count - 1; i >= 0; i--)
                windows[i].Close();
        }

        void allocRam()
        {
            ThreadPool.QueueUserWorkItem((WaitCallback)(o =>
            {
                for (int i = 0; i < 1000; i++)
                {
                    int[] array = new int[100000000];
                }
            }));
        }
    }

    public class ButtonControl : Button
    {
        public ButtonControl() { }

        ~ButtonControl()
        {
            MessageBox.Show("Destruktor aufgerufen!");
        }
    }

    static class Programm
    {
        [System.STAThreadAttribute()]
        public static void Main()
        {
            new Application().Run(new TestWindow());
        }
    }
}

Man verzeige mir den XAML-Verzicht und die kompakte Programmierung für dieses Beispiel.

Trotz den beiden Event-Registraturen

window.Closed += (s, e) => windows.RemoveAt((int)window.Tag);
// und
button.Click += (s, e) => { MessageBox.Show("Event ist dran"); };

wird der Speicher wieder freigegeben.

Du machst dir vermutlich unnötig Sorgen.

EDIT's: Code...

mfg
SeeQuark

16.04.2009 - 15:07 Uhr

Dazu noch:

        public Setting Settings  
        {  
            get { return (Setting)GetValue(SettingProperty); }  
            set  
            {  
                this.DataContext = value;  
                SetValue(SettingProperty, value);  
            }  
        }  

Eine Dependency-Property sollte eigentlich keinen Code enthalten. Das Binding verwendet sie ja nicht direkt, sondern nimmt die direkte Variante.

Daher solltest du, wenn überhaupt, die CallBack-Methode (PropertyChangedCallback) verwenden.

Andererseits ist die Frage, ob das bei deinem Beispiel überhaupt sinnvoll ist.
Da wäre imho ein Converter besser geeignet, den du dann dem Binding mitgibst.

Dann wäre eine eigene DependencyProperty gar nicht notwendig.

mfg
SeeQuark

16.04.2009 - 14:46 Uhr

Das vor dem Thread starten sollte ja kein Problem darstellen.
Einfach vor dem Aufrufen die Labels disablen.

Und enablen kannst du in der Thread-Methode selber ausführen, wie in [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke) beschrieben.

Wenn du auf Performanz achten willst, kannst du auch den ThreadPool verwenden.

Vielleicht noch interessant: [Artikel] Multi-Threaded Programmierung

mfg
SeeQuark

16.04.2009 - 14:20 Uhr

Vorneweg: Ich kan kein Visual Basic.
Anonyme Delegates sind jedoch im IL-Code auch nur Funktionen, welche jedoch keinen Namen haben (Erkenntnis: Anonyme Methoden sind eine Kurzchreibweise für Klassen.).

Vielleicht geht es, wenn du einfach auf eine normale Funktion umsteigst.

Oder müssen es anonyme Delegates sein?

mfg
SeeQuark

16.04.2009 - 14:15 Uhr

die praktische Anwendung kommt mit dem Drucken

Und ein OnTheFly-Lösen? Mit den Pfeiltasten? Das wäre imho auch was.

was sind "größere" Bilder

200x200. Zoom auf Maximal, eventuell auch niedriger, geht schwer zu testen.

mfg
SeeQUark

16.04.2009 - 14:06 Uhr

Schick.

Jedoch bekomme ich folgende Ausnahme bei grösseren Bildern:

[PRE]System.ArgumentException: Ungültiger Parameter.
   bei System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
   bei System.Drawing.Bitmap..ctor(Int32 width, Int32 height)
   bei YAMG.MainForm.DrawMaze()
   bei YAMG.MainForm._tbarCellWidth_Scroll(Object sender, EventArgs e)[/PRE]

Bei grossen Bilder wäre ein asyncroner Erstellungsprozess auch nicht schlecht.
Ausserdem mag ich Deutsch lieber. Du kannst ja bei diesem Programm erste Versuche mit Lokalisierung machen.

Jetzt fehlt nur noch eine praktische Anwendung, da das Lösen im Moment schwer ist, ohne den Bildschirm zu bemalen 🤔****

Vielleicht hat jemand bei der Gelegenheit einen Vorschlag für ein Icon?

Nimm doch ein generiertes Labyrinth bspw. mit der Grösse 4x4.

mfg
SeeQuark

16.04.2009 - 12:35 Uhr

deine letzte Formel funktioniert nicht ...

Stimmt. Eigentlich ist es ja gar keine Formel.
Aber das, was ich hingeschrieben habe ist Quatsch.

bsp:
8 * 12 = (8 + 2) * (12 - 2) - 2² = 10² - 2² = 100 - 4 = 96 (ich hoffe, da ist diesmal kein Fehler drin)

Verallgemeintert wäre das dann IMHO so:
a * b = (a + c) * (a - c) - c²

Auch diesmal keine Garantie auf die Formel.

Jedenfalls kann das bei bestimmten Rechnungen helfen.

Eigentlich also nur mit n=3.

Jetzt mach das mal z.Bsp im Hexadezimalen Zahlensystem 😁

mfg
SeeQuark

16.04.2009 - 12:06 Uhr

Ich kann eigentlich nicht richtig Kopfrechnen. Aber wenn man sich clever anstellt, kann man praktisch jede Aufgabe irgendwie vereinfachen.

Folgenden Trick kann man zwar praktisch nie anwenden, aber er gefällt mir.
Mit ihm kann man Zahlen, die auf 5 enden sehr schnell quadrieren.

bspw. 3535:
Das Resultat endet bei solchen Zahlen immer auf 25.
Die vorderen Zahlen bekommt man, in dem man die Zehnerzahl mit dem Nachfolger multipliziert.
Also: 35
35 = .. 25 | .. = 3 * 4 = 12
also: 25² = 1225.

Das kann man bei anderen Zahlen sehr gut anwenden, zum beispiel 33 * 37 = 35² - 2² = 1225 - 4 = 1229.
Das ist wieder ein anderer Trick.

a * b = ((a + b) / 2)² - |a - b|².

Jetzt rein aus dem Kopf.

Aber mit solchen Tricks kann man sich das Kopfrechnen sehr gut vereinfachen.

mfg
SeeQuark

14.04.2009 - 16:11 Uhr

Leider nichts gefunden.

Glaub ich nicht.
Shutdown Manager
Shutdown Timer
Nicht noch ein Sleep Timer! (diesmal aber anders)

um nur 3 von den Treffern zu nennen.

mfg
SeeQuark

14.04.2009 - 14:14 Uhr

Schau dir mal das Interface IcollectionView an.
Du könntest dein Problem dann mit CurrentItem lösen.
Wichtig ist dann aber, dass deine ListBox die IsSyncronizedWithCurrentItem (oder so) auf true hast.

mfg
SeeQuark

10.04.2009 - 17:01 Uhr

Für Testzwecke/Vergleiche kannst du auch ein paar KI's aus Vier gewinnt mit Ki! verwenden.
Die sind auf jeden Fall schlagbar.

mfg
SeeQuark

10.04.2009 - 14:07 Uhr

wenn er fehlerfreien Code abliefert.

Was soll das denn heissen?
Ich konnte keinen Fehler entdecken.
Andererseits ist auch meine Variante sicher noch nicht die Beste, schlagbar ist sie sicher.
Einen Fehler im Code dürfte sie aber nicht erzeugen.

Könntest du dich etwas präzisieren?

mfg
SeeQuark

10.04.2009 - 13:56 Uhr

Die Windows Controls kann man, zumindest im normalen Framework, nicht einfach übermalen.
Das geht nur, wenn man ein eine zusätzliche Property setzt, dann muss man den Button aber komplett selber zeichnen.

Vielleicht kannst du das Snippet Darstellung von windowseigenen Controls ändern verwenden (+ konvertieren).

Alternativ musst du den Button selber zeichnen (ButtonRenderer, ...) oder einfach ein Image "drüberlegen".

mfg
SeeQuark

10.04.2009 - 13:22 Uhr

Gib in Application.Run() einfach keinen Parameter an.

Eine Vorlage findest du bei
[Snippet] Vorlage für Tray-/NotifyIcon-Anwendung

Ein ganzer Artikel ist sogar da:
[Artikel] Windows Tray Applikationen (NotifyIcon)

Dir auch Frohe Ostern =)

mfg
SeeQuark

10.04.2009 - 12:51 Uhr

Du musst die ShowDialog-Methode ja nicht nachproggen.

Theoretisch reicht ja auch ein Aufruf derselben.

Pseudocodemässig (rasch zusammengetippt):


public MyDialog()
{
    OkButton.Click      += (s, e) => { result = MyDialogResult.OK;      Close(); };
    CancelButton.Click  += (s, e) => { result = MyDialogResult.Cancel;  Close(); };
    SpecialButton.Click += (s, e) => { result = MyDialogResult.Special; Close(); };
}

public MyDialogResult MyShowDialog(Form owner)
{
    ShowDialog(owner);
    return result;
}
MyDialogResult result;

mfg
SeeQuark

10.04.2009 - 11:50 Uhr

Nein, die kann man nicht so einfach ändern. Sie sind nur zu Debug-Zwecken vorhanden.

Durch die Aktivierung von Rasterlinien werden um sämtliche Elemente in einem Grid gepunktete Linien angezeigt. Es sind ausschließlich gepunktete Linien verfügbar, da diese Eigenschaft als Entwicklungstool für das Debuggen von Layoutproblemen vorgesehen ist, nicht für die Verwendung in Code für die Produktionsumgebung. Wenn Sie in einem Grid Linien anzeigen möchten, formatieren Sie die Elemente innerhalb des Grid mit Rahmen.

((aus Grid.ShowGridLines-Eigenschaft, Abschnitt Hinweise)){gray}
Die Lösung wurde auch genannt, die ist genau das, was Mr Evil vorgeschlagen hat.

mfg
SeeQuark

10.04.2009 - 11:17 Uhr

Meine Variante...

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>Event</Title>
      <Shortcut>event</Shortcut>
      <Description>Codeausschnitt für einen eigenen Event</Description>
      <Author>myCSHARP.de</Author>
      <SnippetTypes>
        <SnippetType>SurroundsWith</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>name</ID>
          <ToolTip>Der Name des Events</ToolTip>
          <Default>MyEvent</Default>
        </Literal>
        <Literal>
          <ID>args</ID>
          <ToolTip>EventArgs zum Event</ToolTip>
          <Function>SimpleTypeName(global::System.EventArgs)</Function>
        </Literal>
        <Literal Editable="false">
          <ID>SystemEventHandler</ID>
          <Function>SimpleTypeName(global::System.EventHandler)</Function>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[public event $SystemEventHandler$<$args$> $name$;

protected virtual void On$name$($args$ e)
{
  var temp = $name$;
  if (temp != null)
      temp (this, e);
$end$
}]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Ausgabe:

public event EventHandler<EventArgs> MyEvent;

protected virtual void OnMyEvent(EventArgs e)
{
    var temp = MyEvent;
    if (temp != null)
        temp(this, e);
    // <== Hier ist dann der Cursor
}

Er verwendet bei nicht vorhandenem using System; sogar System.EventHandler bzw. System.EventArgs =)

mfg
SeeQuark

09.04.2009 - 21:46 Uhr

Du kannst am einfachsten die .exe aus dem Ordner bin/Debug kopieren.
Sollten da noch andere dll's drin enthalten sein, kommen diese auch noch hinzu.

Besser ist es aber, eine sogenannte Clickonce zu erstellen. (Projekt -> Eigenschaften -> Veröffentlichen: Ausgabedateipfad eingeben, auf "Jetzt veröffentlichen" klicken.
Dann kannst du den Ordner (bspw. als .zip) weitergeben.

Falls du einen "richtigen" Setup benötigen solltest, müsstest du zum Beispiel InnoSetup verwenden.

Wenn deine Frage jetzt immer noch nicht gelöst ist, müsstest du diese vielleicht etwas präzisieren.

mfg
SeeQuark

09.04.2009 - 21:30 Uhr

es gibt ein (Standard-)Snippet namens "invoke".

Das creiert zwar keine eigene Methode, sollte aber genau das bewirken.

mfg
SeeQuark

08.04.2009 - 18:08 Uhr

Droppe einfach ein Programm bzw. eine Verknüpfung des Programms auf das Gadget =).

mfg
SeeQuark

08.04.2009 - 18:01 Uhr

Hallo

Es gibt ein Gadget namens App Launcher.

Mit dem kostenlosen App Launcher startet man in Windows Vista beliebige Anwendungen mit nur einem Klick. Das so genannte Gadget nistet sich auf dem Desktop oder in der Sidebar ein. [...]

((Zitat von Frank Martin Lauterwein aus app-launcher.softonic.de)){gray}

War es das, was du gesucht hast?

mfg
SeeQuark

07.04.2009 - 17:25 Uhr

Normalerweise kannst du dann einen relativen Pfad angeben (meistens).

Den Pfad deiner Application kannst du aber mit [FAQ] Pfad zur eigenen Anwendung (EXE) ermitteln ermitten.

Trotzdem noch was:

Da ich noch mit datein arbeite

Ein Programm sollte nicht ins "Programme"-Verzeichnis schreiben. Ab Vista ist es dann nicht mehr lauffähig. Daher sollte lieber ins %appdata% geschrieben werden.

Siehe auch [Tutorial] Das neue Konfigurationsmodell im .NET Framework 2.0

mfg
SeeQuark