Ist jetzt nicht schön, sollte aber funktionieren.
Das Zauberwort dabei ist Rekursion.
static List<string> ausgabestring(string prefix, int startindex, List<string> obst)
{
List<string> weniger_obst=new List<string>(obst);
List<string> output=new List<string>();
if (obst.Count > 0)
{
weniger_obst.RemoveAt(0);
for (int i = startindex; i <= 2; i++)
{
output.AddRange(ausgabestring(prefix + " " + obst[0] + " " + i, i, weniger_obst));
}
}
else
output.Add(prefix);
return output;
}
Gruß Gwinn
Hi diana,
wenn du den string f nicht weiter benötigst, könntest du es mit:
if (e.Index == -1) return;
e.DrawBackground();
Brush brush;
string text = ((ComboBox)sender).Items[e.Index].ToString();
if (text.IndexOf((char)185)>=0)
brush = Brushes.Red;
else
brush = Brushes.Black;
e.Graphics.DrawString( text, ((Control)sender).Font, brush, e.Bounds.X, e.Bounds.Y);
probieren.
Ansonsten hilft dir vielleich tein Blick in [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)
und den darin verlinkten Artikeln.
Hi Tactive,
probiers mal mit
<Trigger Property="IsMouseOver" Value="True">
Gruß Gwinn
Hi Coffeebean,
das Sortiern der Liste A ist - glaub ich - nicht das Problem für cDAG, sondern, dass in den anderen Listen dieselbe 'Reihenfolgeveränderung' durchgeführt werden soll.
Offensichtlich stehen die Daten in den Listen in einem inhaltlichen Zusammenhang. Spricht denn etwas dagegen, einfach eine Klasse zu definieren, die die Daten zusammenfasst und diese zu sortieren?
Gruß Gwinn
Hi und willkommen im Forum.
ich nehme an, dass du diese Stelle meinst:
if (((AkP < 2) || (AkP == 0)) && (Double_Tripple != 1))
setze an der Stelle einen Haltepunkt, lass dir die Werte deiner Variaben anzeigen (überwachen) und führe das Programm schrittweise weiter aus.
Dann weißt du, was dein Programm macht und warum es das tut.
Im übrigen ergibt die Bedingung:
((AkP < 2) || (AkP == 0))
keinen Sinn, weil AkP==0 immer erfüllt ist, wenn AkP<2 wahr ist.
Im Übrigen ist es für uns schwer einen logischen Fehler zu finden, ohne zu wissen, was das Programm überhaupt machen soll.
Gruß Gwinn
Hi camelord,
warum machst du keinen Export deiner ModuleBase, wenn du deren Implementation benötigst?
[Export(typeof(Contracts.ModuleBase))]
public class ModuleTouchdata : Contracts.ModuleBase
{
[...]
}
Gruß Gwinn
Hi Community,
ich bin leider erst mit etwas Verzögerung dazu gekommen, mir die Lösungen anzusehen.
Funktionieren tun beide. Die Lösung von D4rkScr43m läuft dabei wesentlich performanter ab (auch als meine Lösung).
Da seine Lösung zudem etwas schneller kam, erhält er den Zuschlag für die nächste Aufgabe.
Gruß Gwinn
Hallo Community,
da wir zuvor schon bei einer Springeraufgabe waren, hier meine Aufgabe:
Gesucht ist eine Funktion, die einen Lösungsweg für das Springerproblem für ein 8x8 Feld liefert.
Als Parameter soll die Funktion die Koordinaten des Startfeldes empfangen.
Viel Spaß
Gwinn
Edit: Um die Laufzeit nicht zu sehr in die Höhe zu treiben soll es genügen, wenn als Startpunkt eine Ecke vorgegeben wird.
Hi herbivore,
ich hoffe ich habe keine Fehlerquellen übersehen.
Ungültige Argumente führen in meiner Version zu einer entsprechenden Exception.
Die Funktion nimmt als Argumente nichtnegative Zahlen und Basen von 2 bis 62.
Statt einer Exception könnte man auch den Ausgabestring entsprechend ändern. In Hinblick auf eine Anwendung gehe ich jedoch davon aus, dass man zuerst an dem Ergebniss der Berechnung interessiert ist. Deshalb habe ich als Rückgabewert die Quersumme gewählt und schreibe den Ausgabestring in den Parameter str.
public static int Quersumme(Int32 zahl, Int32 basis, out String str)
{
Int32 quersumme = 0;
Int32 ziffer;
StringBuilder strbuilder = new StringBuilder();
Int32 restzahl = zahl;
if ((basis > 62) || (basis < 2))
throw new ArgumentOutOfRangeException("Die Basis muss zwischen 2 und 62 liegen.");
if (zahl < 0)
throw new ArgumentOutOfRangeException("Die Quersumme ist nur für natürliche Zahlen definiert.");
while (restzahl > 0)
{
ziffer = restzahl % basis;
quersumme += ziffer;
if (ziffer < 10)
strbuilder.Insert(0, ziffer);
else
if (ziffer > 35)
strbuilder.Insert(0, (char)(ziffer + 61));
else
strbuilder.Insert(0, (char)(ziffer + 55));
restzahl = (restzahl - ziffer) / basis;
}
str = zahl.ToString() + "= " + strbuilder.ToString() + " base " + basis.ToString() + " -> Quersumme " + quersumme.ToString();
return quersumme;
}
Gruß Gwinn
Da ich bis jetz noch keine 'schöne' neue Aufgabe habe, gebe ich die Aufgabenstellung einfach mal frei.
Wer also eine neue Aufgabe stellen möchte, sei herzlich dazu eingeladen, das zu tun.
Gruß Gwinn
Also,
public static DateTime EndOfDay(this DateTime day)
{
return (day.AddDays(1)).Date;
}
public static TimeSpan SubtractEx( DateTime start, DateTime end, Dictionary<DayOfWeek, IList<TimeSpan>> timelist)
{
bool negativ = false;
if (end < start)
{
DateTime tmp = start;
start = end;
end = tmp;
negativ = true;
}
IList<TimeSpan> todaysList;
Dictionary<DayOfWeek, TimeSpan> timespanPerDay = new Dictionary<DayOfWeek, TimeSpan>();
TimeSpan helperTimeSpan;
TimeSpan timespanPerWeek=new TimeSpan();
foreach (DayOfWeek dayofweek in Enum.GetValues(typeof(DayOfWeek)))
{
timelist.TryGetValue(dayofweek,out todaysList);
helperTimeSpan = new TimeSpan();
if (todaysList != null)
{
for (int i = 0; i < todaysList.Count; i += 2)
{
helperTimeSpan += todaysList[i + 1] - todaysList[i];
}
timespanPerDay.Add(dayofweek, helperTimeSpan);
timespanPerWeek += helperTimeSpan;
}
}
int fulldays=(end.Date - start.EndOfDay()).Days;
int fullweeks = (int)Math.Floor(fulldays / 7.0);
TimeSpan result = new TimeSpan(fullweeks*timespanPerWeek.Ticks);
DateTime calcend = end.Subtract(new TimeSpan(fullweeks*7,0,0,0));
DateTime time = start;
timelist.TryGetValue(time.DayOfWeek,out todaysList);
if (todaysList != null)
{
for (int i = 0; i < todaysList.Count; i += 2)
{
if (time.TimeOfDay<=todaysList[i])
result+=(todaysList[i+1]-todaysList[i]);
else
if (time.TimeOfDay<todaysList[i+1])
result+=(todaysList[i+1]-time.TimeOfDay);
}
}
time = time.AddDays(1);
while (time.Date < calcend.Date)
{
if (timespanPerDay.TryGetValue(time.DayOfWeek, out helperTimeSpan));
result += helperTimeSpan;
time = time.AddDays(1);
}
time=calcend;
timelist.TryGetValue(time.DayOfWeek, out todaysList);
if (todaysList != null)
{
for (int i = 0; i < todaysList.Count; i += 2)
{
if (todaysList[i+1]<calcend.TimeOfDay)
result+=(todaysList[i+1]-todaysList[i]);
else
if (todaysList[i]<calcend.TimeOfDay)
result +=(calcend.TimeOfDay - todaysList[i]);
}
}
if (negativ)
result = -result;
return result;
}
Das liefert jetz mit einer Ausnahme deine Testergebnisse zurück.
DateTime.Substract liefert nämlich nicht 0, sondern einen negativen Wert, falls das Enddatum vor dem Startdatum liegt.
Gruß Gwinn
Hallo,
ich hab mal an der Performance gearbeitet...
public static DateTime EndOfDay(this DateTime day)
{
return (day.AddDays(1)).Date;
}
public static TimeSpan SubtractEx( DateTime start, DateTime end, Dictionary<DayOfWeek, IList<TimeSpan>> timelist)
{
if (end < start)
throw new ArgumentException("Das Enddatum muss nach dem Startdatum liegen.");
IList<TimeSpan> todaysList;
Dictionary<DayOfWeek, TimeSpan> timespanPerDay = new Dictionary<DayOfWeek, TimeSpan>();
TimeSpan helperTimeSpan;
TimeSpan timespanPerWeek=new TimeSpan();
foreach (DayOfWeek dayofweek in Enum.GetValues(typeof(DayOfWeek)))
{
try
{
todaysList = timelist[dayofweek];
}
catch (KeyNotFoundException)
{
todaysList = null;
}
helperTimeSpan = new TimeSpan();
if (todaysList != null)
{
for (int i = 0; i < todaysList.Count; i += 2)
{
helperTimeSpan += todaysList[i + 1] - todaysList[i];
}
timespanPerDay.Add(dayofweek, helperTimeSpan);
timespanPerWeek += helperTimeSpan;
}
}
int fulldays=(end.Date - start.EndOfDay()).Days;
int fullweeks = (int)Math.Floor(fulldays / 7.0);
TimeSpan result = new TimeSpan(fullweeks*timespanPerWeek.Ticks);
DateTime calcend = end.Subtract(new TimeSpan(fullweeks*7,0,0,0));
DateTime time = start;
try
{
todaysList = timelist[time.DayOfWeek];
}
catch (KeyNotFoundException)
{
todaysList = null;
}
if (todaysList != null)
{
for (int i = 0; i < todaysList.Count; i += 2)
{
if (time.TimeOfDay<=todaysList[i])
result+=(todaysList[i+1]-todaysList[i]);
else
if (time.TimeOfDay<todaysList[i+1])
result+=(todaysList[i+1]-time.TimeOfDay);
}
}
time = time.AddDays(1);
while (time.Date < calcend.Date)
{
result += timespanPerDay[time.DayOfWeek];
time = time.AddDays(1);
}
time=calcend;
try
{
todaysList = timelist[time.DayOfWeek];
}
catch (KeyNotFoundException)
{
todaysList = null;
}
if (todaysList != null)
{
for (int i = 0; i < todaysList.Count; i += 2)
{
if (todaysList[i+1]<calcend.TimeOfDay)
result+=(todaysList[i+1]-todaysList[i]);
else
if (todaysList[i]<calcend.TimeOfDay)
result +=(calcend.TimeOfDay - todaysList[i]);
}
}
return result;
}
}
Ich hoffe das genügt jetzt deiner Aufgabenstellung...
Gruß Gwinn
Oups,
da hatte ich mich an die Bearbeitung gemacht, bevor ich alles gelesen hatte. Ich werd mich später am Tag damit nochmal befassen...
Gruß Gwinn
Hi,
folgender Ansatz ist zumindest durch meine Tests gelaufen:
public static TimeSpan SubtractEx( DateTime start, DateTime end, Dictionary<DayOfWeek, IList<TimeSpan>> timelist)
{
if (end < start)
throw new ArgumentException("Das Enddatum muss nach dem Startdatum liegen.");
DateTime time = start;
TimeSpan result = new TimeSpan();
IList<TimeSpan> todaysList;
DateTime endofday;
bool lastday = false;
bool firstday = true;
while (time < end)
{
todaysList = timelist[time.DayOfWeek];
endofday = new DateTime(time.Year, time.Month, time.Day + 1);
if (endofday > end)
lastday = true;
if (todaysList != null)
{
for (int i = 0; i < todaysList.Count; i += 2)
{
if (firstday)
{
if (time.TimeOfDay >= todaysList[i])
{
time = time.Subtract(todaysList[i]);
firstday = false;
}
else
if (time.TimeOfDay<todaysList[i+1])
time = time.Subtract(time.TimeOfDay);
}
time = time.Add(todaysList[i]);
if (!lastday)
{
result = result.Add(todaysList[i + 1] - time.TimeOfDay);
}
else
{
if (time > end)
break;
result = result.Add(((todaysList[i + 1] < end.TimeOfDay) ? todaysList[i + 1] : end.TimeOfDay) - time.TimeOfDay);
}
time = time.Subtract(time.TimeOfDay);
}
}
time = endofday;
firstday = false;
}
return result;
}
Gruß Gwinn
Hi MorphieX,
spendier deinem EventHandler noch ein
e.Handled=true;
Dann sollte es auch klappen.
private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
AddTabItem();
e.Handled = true;
}
Gruß Gwinn
Hi gijoe222,
eine halbe Lösung wäre es, das ganze nicht als Währung zu formatieren sondern als Zahl mit vorgestelltem Dollarzeichen.
$ #.##0,00
Eine halbe Lösung ist es deswegen, weil du dann noch immer einen Tausenderpunkt und ein Dezimalkomma hast und nicht andersherum, wie es in den USA richtig wäre.
Gruß Gwinn
Hi Blogger,
dein Fehler steckt in diesem Block:
for (uint x = 1; x <= y; x++)
{
facy = fack * x; // Fakultät von (n-i) wird berechnet.
}
Es müsste heißen:
for (uint x = 1; x <= y; x++)
{
facy = facy * x; // Fakultät von (n-i) wird berechnet.
}
Dann funktioniert es auch mit deinem Quellcode. Das hättest du mit Hilfe von ein paar Haltepunkten und dem Debugger auch herausfinden können.
Darüber hinaus wirst du bei größerem n auf Grenzen stoßen, weil die Fakultäten die du berechnest schnell zu einem Speicherüberlauf führen werden. Für den Binomialkoeffizienten brauchst du auch gar nicht die ganze Fakultät, sondern nur das produkt der ersten (oder letzten, je nach dem ob man mit 1 oder mit n zu multiplizieren beginnt) i Glieder. Da darfst du dir aber selbst mal Gedanken machen...
Gruß Gwinn
Hi spike1302,
das was du beschreibst könnte ggf. die Folge eines Gimbal Lock sein.
Vermeiden kannst du das, indem du die Rotation statt mit einer 3D-Rotationsmatrix mit einem Quaternion berechnest.
Eine Anleitung dazu findest du z.B. im Quaternion Tutorial.
Auch wenn es dort um die Rotation des Objekts und nicht der Kamera geht...
Gruß Gwinn
Hi SHaThaL,
bist du sicher, dass du die rictige Funktion benutzt?
spline2dbuildbicubic ist gedacht für Splines in zwei Veränderlichen (Ordinaten x und y) So wie es mir aber scheint, möchtest du aber auf eine Funktion in einer Veränderlichen fitten und müsstest dafür
spline1dbuildcubic benutzen.
Gruß Gwinn
Hi 1nf1n1ty,
dieser Code erstellt ein leeres Worksheet, in dem die erste Zeile eingefroren ist.
Der Knackpunkt dabei ist die Pane, die in die SheetView eingefügt wird.
Worksheet worksheet1 = new Worksheet() { MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = "x14ac" } };
worksheet1.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
worksheet1.AddNamespaceDeclaration("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
worksheet1.AddNamespaceDeclaration("x14ac", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac");
SheetDimension sheetDimension1 = new SheetDimension() { Reference = "A1" };
SheetViews sheetViews1 = new SheetViews();
SheetView sheetView1 = new SheetView() { TabSelected = true, WorkbookViewId = (UInt32Value)0U };
Pane pane1 = new Pane() { VerticalSplit = 1D, TopLeftCell = "A2", ActivePane = PaneValues.BottomLeft, State = PaneStateValues.Frozen };
Selection selection1 = new Selection() { Pane = PaneValues.BottomLeft, ActiveCell = "F8", SequenceOfReferences = new ListValue<StringValue>() { InnerText = "F8" } };
sheetView1.Append(pane1);
sheetView1.Append(selection1);
sheetViews1.Append(sheetView1);
SheetFormatProperties sheetFormatProperties1 = new SheetFormatProperties() { BaseColumnWidth = (UInt32Value)10U, DefaultRowHeight = 12.75D, DyDescent = 0.2D };
SheetData sheetData1 = new SheetData();
worksheet1.Append(sheetDimension1);
worksheet1.Append(sheetViews1);
worksheet1.Append(sheetFormatProperties1);
worksheet1.Append(sheetData1);
worksheetPart1.Worksheet = worksheet1;
Um auf diesen Code zu kommen, kannst du dir einfach ein Excel-Dokument erstellen, das die von dir gewünschte Form hat, und dann mit dem Open XML SDK Productivity Tool den Code dazu erstellen lassen (Reflect Code).
Gruß Gwinn
Hi Disaster2k,
Ich hab das Probiert mit lauter rectangles. Allerdings können das sehr viele Quadrate werden und dann läuft das nicht mehr flüssig.
Ich sehe da das Problem nicht, wenn du bei Rectangles die Ereignisse MouseEnter und MouseLeave abfängst und jeweils die Füllung änderst.
Color lastcol;
private void Rectangle_MouseEnter(object sender, MouseEventArgs e)
{
Rectangle rect = sender as Rectangle;
SolidColorBrush brush=rect.Fill as SolidColorBrush;
lastcol = brush.Color;
brush.Color=Color.Multiply(lastcol,2f);
}
private void Rectangle_MouseLeave(object sender, MouseEventArgs e)
{
Rectangle rect = sender as Rectangle;
rect.Fill = new SolidColorBrush(lastcol);
}
Du musst ja nicht alle Felder neuzeichnen, sondern nur die Felder, die du mit der Maus überfährst.
Gruß Gwinn
Hi X1C3,
da steckt garkein Vodoo hinter. Setz doch einfach mal einen Haltepunkt in die Zeile, die den Fehler auswirft und lass den Debugger starten.
Die ersten beiden Ebenen laufen ohne weiteres durch, doch dann kommst du in der dritten Ebene auf author:
author hat ein Child, nämlich "Gambardella, Matthew". Das Progemm läuft also in den Block der If-Bedingung und versucht dort auf das erste Element der Attributes-Liste zuzugreifen. author hat aber gar keine Attribute. Deshalb liefert Attributes null zurück und der Zugriff auf Attributes[0] schlägt fehl, was dir der Debugger mit> Fehlermeldung:
System.NullReferenceException: Object reference not set to an instance of an object.
um die Ohren haut.
Bevor du also um Hilfe schreist, was denn falsch gelaufen sein könnte, bemüh doch erst einmal die Bordmittel von VisualStudio.
Gruß Gwinn
(Edith ist heute einfach zu müde...)
Hi Bi0logiCaL,
zunächst einmal funktioniert es bei mir, wenn ich HideSelection auf false setze.
Wenn das bei dir aber absolut nicht will (warum auch immer) hätte ich sonst noch einen Workaround für dich.
Du setzt einfach bei jeder Änderung der Auswahl manuell die Farben:
private TreeNode _selected = null;
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
if (_selected != null)
{
_selected.ForeColor = SystemColors.ControlText;
_selected.BackColor = treeView1.BackColor;
}
_selected=treeView1.SelectedNode;
_selected.ForeColor = SystemColors.HighlightText;
_selected.BackColor = SystemColors.Highlight;
}
Gruß Gwinn
[Edith schreibt] Alternativ kann man natürlich auch den Code auf das Leave und das Enter Ereignis aufteilen, dann wird der Farbwechsel nur durchgeführt, wenn das TreView den Fokus erhält bzw verliert.
Hi,
zu Canoonet hab ich folgendes in den AGBs gefunden:
Urheberrecht
Sämtliche Rechte an der im Rahmen dieses Online-Angebots entwickelten Software, den zugrunde liegenden Datenbanken und sonstigen Inhalten liegen bei der Canoo Engineering AG, soweit nicht ausdrücklich ein anderer Urheber oder Rechtsinhaber genannt wird. Die Rechte der Inhalte des Bedeutungswörterbuchs liegen bei der Universität Tübingen. Jede Verwendung der Software, der Daten oder der sonstigen Inhalte außer in der Form, wie sie unter
> angeboten und ermöglicht wird, ist nicht erlaubt. Es ist insbesondere nicht gestattet, jedwede Art von Inhalten per Script oder auf andere Weise automatisiert abzufragen.
Eine Scriptabfrage ist also ausdrücklich nicht erlaubt.
Gruß Gwinn
Hi Bernd23,
ich hab mal nen kleinen Workaround dafür geschrieben.
Die Idee ist, im Hauptfenster für den MenuStrip das ItemAdded Ereignis abzufangen und das hinzugefügte Item unsichtbar zu machen.
Damit man überhaupt noch Items hinzufügen kann, hab ich noch ein Steuer-Flag spendiert.
public partial class Form1 : Form
{
private int counter = 0;
private bool canAddItem = true;
public Form1()
{
InitializeComponent();
canAddItem = false;
}
private void menuStrip1_ItemAdded(object sender, ToolStripItemEventArgs e)
{
if (!canAddItem)
e.Item.Visible = false;
}
}
Ich hoffe, du kannst damit etwas anfangen.
Gruß Gwinn
Hi hfb11,
bevor dieser Thread mit Hinweis auf die Forenregeln geschlossen wird, möchte ich dir schnell noch das richtige Stichwort entgegenwerfen:
Das was du suchst, ist die SpecialFolders-Aufzählung.
Gruß Gwinn
Hi VanKurt,
leider scheint es so, dass sich die ListView bei der Verwendung von Gruppen nicht wie erwartet verhält.
Die Items werden nämlich grundsätzlich in der Reihenfolge dargestellt, in der sie der Gruppe hinzugefügt werden und nicht nach der Reihenfolge in der sie in der Items-Auflistung stehen.
Im Übrigen fügt dein Codebeispiel das Item zweimal in die Groups[0] ein. Das erste mal bei der Erstellung und danach noch einmal mit Insert.
Ein Workaround für das Problem wäre, die Gruppe für alle Elemente aus Groups[0] erst auf null zu setzen und danach wieder (in der richtigen Reihenfolge) auf Group[0].
ListViewItem lvi = new ListViewItem("Item 0");
listView1.Items.Insert(0, lvi);
listView1.Groups[0].Items.Insert(0, lvi);
foreach (ListViewItem item in listView1.Items)
{
item.Group = null;
item.Group = listView1.Groups[0];
}
@herbivore
Der Code funktioniert bei mir auch, wenn ich ihn im Konstruktor verwende. Wenn ich ihn in eine Funktion schreibe, die später ausgeführt wird, funktioniert es nicht mehr.
Wenn ListView.View auf List gesetzt ist, dann funktioniert der Code auch wie erwartet, doch dann ist ja gerade die Gruppierungsfunktion wieder weg.
Hi Nightmare,
wär es vielleicht eine Möglichkeit, eine eigene Uhrzeitklasse zu schreiben, die bei Programmstart die NTP-Zeit bekommt und eine Stopwatch startet.
Aus der Startzeit und der Stopwatch.Elapsed errechtnet eine Funktion dann die 'richtige' Zeit ohne auf die Systemzeit angewiesen zu sein.
Gruß
Gwinn
Hi Tornado,
ergaänze einfach ein
Points = new List<Point>();
im OnMouseDown Ereignis.
total spiechert nur einen Verweis auf das jeweilige Points-Object, das ihm übergeben wird. deshalb musst du für Points immer eine neue Liste erstellen, wenn du eine neue Linie zeichnen möchtest.
Gruß Gwinn
Hi todo,
ich glaub ich hab erraten, was du suchst.
Du suchst das Ziel eines (Web-)Verweises (im Beispiel test.url) der in einem bestimmten Ordner (d:) liegt. Ist das richtig?
Shell32.Shell Shell = new Shell32.Shell();
Shell32.Folder Ordner = Shell.NameSpace(@"d:\");
Shell32.FolderItem Datei = Ordner.Items().Item("test.url");
Shell32.ShellLinkObject Verk = (Shell32.ShellLinkObject)Datei.GetLink;
string Link_Path = Verk.Path;
Alternativ kannst du die Datei (nichts anderes ist es) auch öffnen und den Inhalt auslesen.
Gruß Gwinn
Hallo Xeres,
bist du sicher, dass du mit Tables auf eingebettete Exelobjekte zugreifst?
Ich hab das grad mal ausprobiert und bei mir gibt er nur die Word-Tabellen an.
Auf eingebettete Exceltabellen müsstest du mit InlineShapes zugreifen können.
Gruß Gwinn
Sieh dir den zweiten Link nochmal genau an.
In dem Projekt wird nämlich genau das gemacht.
Den ersten Link hab ich dir nur mit aufgegeben, weil der (über Umwege) zu dem zweiten Beitrag führt.
Gruß Gwinn
Hi Mystique,
das kommt davon, wenn man erst noch ein Beispielprojekt bastelt...
Gruß Gwinn
Hi Levitas,
PS: SuFu und Google natürlich schon benutzt! Hab aber nur Möglichkeiten gefunden, mit DirectSound vom Mikro aufzunehmen. Mehr aber leider auch nicht.
hilfe: directsound aufnehmen durch mikrofon und speichern
und
Sound visualizer in C#
hab ich auf die schnelle gefunden...
Gruß Gwinn
Hi words_sourcecode,
vielleicht hilft dir ja dieses Codesnippet weiter:
http://en.csharp-online.net/HTTP_Post
Gruß Gwinn
Hi Nonsense,
ich würd dir zu 'nem ähnlichen Ansatz raten, wie winSharp ihn schon gemacht hat.
Du hast ja eh schon vor, die Vokabeln mit einem 'Gewicht' (Wert zwischen 0 und 1)zu belegen.
Wenn du dir eine Liste bastelst, in der die Vokabeln hintereinander liegen und bei der die Summe aller Gewichte bis zu dieser Vokabel mit abgespeichert ist, dann kannst du einfach das eine Zufallszahl zwischen 0 und dem Gesamtgewicht ermitteln und nach der entsprechenden Vokabel in der Liste nachschlagen.
Du müsstest dann nur die Bedeutung von 0 und 1 umdrehen zu 0 braucht garnicht mehr geübt zu werden und 1 muss besonders intensiv geübt werden.
Vielleicht hilfts..
Gruß Gwinn
[Edith verschreibt sich gerne mal...]
Hi Red-Sh4nks,
ändere mal Button1.BackgroundImage statt .Image
Das sollte helfen.
Gruß Gwinn
Edit zur Ergänzung:
BackgroundImageLayout bezieht sich, wie der Name schon sagt nur auf das BackgroundImage.
Wenn du unbedingt mit dem Image des Buttons arbeiten willst, dann kannst du auch manuell das Originalbild auf die Größe des Buttons ziehen und zuweisen.
Hi words_sourcecode,
ich hab mir deinen Code jetzt einmal angetan.
Der Hauptfehler ist, dass du beim Rückschritt in der Rekursion die alten Werte nciht zurückschreibst.
Das liegt daran, dass du vorne mit
int[,] new_values = values;
nicht die Werte, sondern nur den Verweis auf values kopierst und deshalb alle Änderungen genauso auch in values vorgenommen werden.
Verzichte deshalb lieber auf die Kopie und schreib jeweils values[p.X,p.Y] auf 0 zurück.
Als zweites kannst du vollständig auf die äußere Schleife verzichten. Das durchsuchen aller freien Zellen erledigt ja schließlich die Rekursion. Entsprechende ist es auch nicht nötig, die Zellen ++und ++die Zahlen zu mischen und du benötigst nicht in jedem Rekursionsschritt alle freien Felder.
Du solltest ferner darauf verzichten, innerhalb von Schleifen Variablen zu erstellen.
Ich hab mal ein paar Änderungen in deinen Code eingepflegt und mit Kommentaren versehen.
Der Code kann weiter optimiert werden. Z.B. kann du values jetzt als Verweis übergeben und result zum Rückgabewert der Funktion machen, aber das lass ich dir mal noch...
private int[,] Rekursiv(int[,] values, out bool result)
{
// Ergebnis Array
//int[,] new_values = values; entfernt, da unnötig
// Freies Feld finden
Position p=default(Position);
bool p_found = false;
// List<Position> free_fields = new List<Position>();
for (int x = 0; (x < 9)&&!p_found; x++)
for (int y = 0; y < 9; y++)
if (values[x, y] == 0)
{
p = new Position(x, y);
p_found = true;
break;
}
// Abbruchbedingung
if (!p_found)
{
result = true;
return values;
}
// Mische Liste
Random r = new Random();
//Block entfernt, da 'doppelter Zufall' überflüssig ist
/* for (int i = 0; i < free_fields.Count; i++)
{
Position p = free_fields[i];
int index = r.Next(0, free_fields.Count - 1);
free_fields[i] = free_fields[index];
free_fields[index] = p;
}*/
// Probiere jede Stelle
result = false;
// Äußere Schleife entfernt
// foreach (Position p in free_fields)
// Erstelle Zahlen-Array aus 1 bis 9
int[] free_values = new int[9];
for (int j = 1; j <= 9; j++)
free_values[j - 1] = j;
// Mische Zahlen
// Variablendefinition aus der Schleife genommen
int v,index;
for (int j = 0; j < free_values.Length; j++)
{
v = free_values[j];
index = r.Next(0, free_values.Length - 1);
free_values[j] = free_values[index];
free_values[index] = v;
}
// Probiere jede Zahl
bool tmp_result;
foreach (int value in free_values)
{
bool okay = Check(values, p, value);
if (okay)
{
// Hier direkt values beschreiben
values[p.X, p.Y] = value;
// Rekursiver Aufruf
values = Rekursiv(values, out tmp_result);
// Alles geklappt? Nein: Nächste Zahl/Nächste Stelle Ja: Abbrechen
if (!tmp_result)
// Hier values zurücksetzen, falls keine Lösung gefunden wurde
values[p.X,p.Y]=0;
else
{
result = true;
break;
}
}
// entfällt, da die Schleife entfernt wurde
// if (result)
// break;
}
// Gebe Ergebnis zurück
return values;
}
Hi words_sourcecode,
ich würde einen anderen Ansatz bei der Generierung wählen:
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
9 1 2 3 4 5 6 7 8
6 7 8 9 1 2 3 4 5
3 4 5 6 7 8 9 1 2
8 9 1 2 3 4 5 6 7
5 6 7 8 9 1 2 3 4
2 3 4 5 6 7 8 9 1
Die s ist ein gültiges Sudoku.
Mit dem Ansatz brauchst du nicht 'herumszuprobieren'.
Vielleicht hilfts
Gwinn
Hi AllForOne,
ich habe mal versucht, dein Listing durchzusehen.
In der Sprite.UpdatePosition() erstellst du ein neues Game1-Objekt und rufst dessen Reset() auf.
Ich kann mir nicht vorstellen, dass das so gewollt ist.
Gruß Gwinn
Hallo Christel,
probier mal
tsb.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
tsb.TextImageRelation = TextImageRelation.TextAboveImage;
zu setzen. Bei mir funktioniert es so.
Gruß Gwinn
Hi moelski,
die meldung kommt von ReSharper.
In deinem Beispiel wird test ausschließlich im Scope der Schleife benutzt - daher der Hinweis auf den inner scope.
Ob dies tatsächlich zu einem Leistungsverlust führt, hängt davon ab, wie der Conpiler bzw. der Jitter den Code optimieren.
Gruß Gwinn
[Edit: typo]
Ich bin nicht ganz sicher, ob ich dein problem richtig verstanden habe:
Du möchtest die Funktion Get<T> aus dem Interface sowohl in einer Klasse Test1<T> mit demselben T aufrufen, als auch in anderen Klasse mit (beliebeigem) anderen T. Ist das so?
Dann benutz doch den Ansatz von Khalid und spendier der Klasse Test1 noch eine parameterlose Funktion Get:
interface Test
{
T2 Get<T2>();
}
public class Test1<T> : Test
{
public T2 Get<T2>()
{
return default(T2);
}
public T Get()
{
return Get<T>();
}
}
Vielleicht hilft's ja.
Gruß Gwinn
Leite deine Struktur von IComparable<licenceinfo> ab und benutze die Sort-Funktion:
public struct licenseinfo:IComparable<licenseinfo>
{
public string name;
public string value;
public int CompareTo(licenseinfo info)
{
return name.CompareTo(info.name);
}
}
static void Main(string[] args)
{
List<licenseinfo> licenseinfos=new List<licenseinfo>();
licenseinfos.Add(new licenseinfo() { name = "Peter", value = "III" });
licenseinfos.Add(new licenseinfo() { name = "Anne", value = "I" });
licenseinfos.Add(new licenseinfo() { name = "Linda", value = "II" });
licenseinfos.Sort();
foreach (licenseinfo info in licenseinfos)
{
Console.WriteLine(info.name + ": " + info.value);
}
Console.ReadKey();
}
Gruß Gwinn
Edith meint noch:
Solltest du je nach Fall nach verschiedenen Eigenschaften sortieren wollen empfielt es sich stattdessen für jede Eigenschaft einen Comparison Delegaten zu schreiben.
Sieh dazu mal in List(Of T).Sort Method (Comparison(Of T)) nach.
Meinst du soetwas?
http://www.codeguru.com/csharp/csharp/cs_controls/custom/article.php/c15447/Notifier-Outlook-Like-Notifier.htm
Gruß Gwinn
MyControl= "tbx" + i; foreach (Control ctl in Controls) { if (ctl.Name== MyControl) { ((TextBox)ctl).Text = sArray; } }
MyNickname
Eigentlich sollte das so funktionieren, vorausgesetzt MyControl ist ein String und die Textboxen heißen bei dir tatsächlich tbx1, tbx2, ...
Probier doch sonst einfach mal
str = "tbx"+i;
Control[] ctrs = Controls.Find(str, false);
foreach (Control textbox in ctrs)
{
if (textbox is TextBox)
textbox.Text = sArray;
}
Gibt es einen Grund dafür, dass du das KeyUp Event benutzt.
Mit KeyDown hast du das Problem nicht.
Gruß Gwinn