Laden...

Profil von #coder

myCSharp.de - Member Mitglied seit

Alle Beiträge

Vielen Dank für die Antworten.

das ganze dürfte recht leicht durchzuführen sein. du erstellst eine liste mit rectangles und die liste gehst du mit nem foreach durch und überprüfst ob das rechteck ein anderes rechteck schneidet Das finden der Kollisionen habe ich bisher so ähnlich gelöst mit zwei verschachtelten for Schleifen.

Die Idee von herbivore mit der mittigsten Karte zu beginnen finde ich gut und werde ich gleich mal versuchen zu implementieren.

Mit möglichst nah meinte ich, dass es schön wäre, wenn es ungefähre gelänge jede Karte nur minimal zu verschieben. Wenn dies nur annäherungsweise geschiet ist es nicht schlimm.

Hallo,

ich suche einen Algorithmus zum Anordnen von Rechteckigen-Objekten. Konkret geht es um Elemente aus einem Diagramm.

Mein Problem kann man auch mit Spielkarten veranschaulichen, die durch Vermengen wilddurcheinander auf einem Tisch liegen.
Die Aufgabe ist nun diese so anzuordnen, dass keine Karte eine andere überschneidet. Jede Karte soll danach möglichst nah an dem Punkt liegen, an dem sie zuvor lag. Optimal wäre es, wenn auch möglichst wenig leerer Platz zwischen den Karten bleibt.

Das Problem bei dieser Sache ist weniger das finden von Kollisionen, sondern eben das Auflösen dieser.

Ich bin für jede Hilfe dankbar.

Mit reader.IsDBNull(index) kannst du abfragen ob der Wert null ist.

06.02.2006 - 15:10 Uhr

Vielen Dank euch beiden!

Der white-space:nowrap Style ist die Lösung meines Problems.

Div Kontainer habe ich nicht verwendet, weil es sich um ein Formular mit mehreren tabellarischangeordneten Feldern handelt und das <hr /> Tag auf jeden Fall einen Zeilenumbruch erzwingt.

05.02.2006 - 10:19 Uhr

Hallo,

ich möchte in HTML eine geschachtelte Tabelle (width=100%) mit 2 Spalten erstellen. Die erste Spalte soll nur so breit sein wie der darin enthaltene Text, dieser soll aber auf keinen Fall umbrechen. Die rechte Spalte soll den Rest der Tabelle ausfüllen.


<table> <!-- äußere Tabelle -->
<!-- ... -->
    <tr>
        <td>

            <table width="100%"> <!-- innere Tabelle -->
                <tr>
                    <td> <!-- diese Spalte soll nur so Breit sein wie der Text -->
                        <asp:Label ID="Label1" runat="server" Text="Test Label:"></asp:Label>
                    </td>
                    <td><!-- diese Spalte soll den Rest der inneren Tabelle ausfüllen -->
                        <hr />
                    </td>
                </tr>
            </table>

        </td>
    </tr>
<!-- ... -->
</table>

Ich habe es mit width:100% für die rechte Spalte versucht, dann wird der Text der linken Spalte umgebrochen.
Es funktioniert nur wenn ich die leerzeichen durch &nbsp; ersetze, das ist mir aber zu unkomfortabel.

Gibt es eine bessere Lösung?

05.02.2006 - 10:02 Uhr

Vielleicht ist der der Wert den du mit dr["Zuname"] bekommst null.
Probiers doch mal mit dr.GetString(dr.GetOrdinal("Zuname"));

05.02.2006 - 09:55 Uhr

Du hast vergessen die x-Koordinate deiner Punkte anzupassen:

for (int i = 1; i < 100; i++)
{
    punkte[i].x--; // jeden Punkt um einen Pixel nach links verschieben

    punkte[i - 1] = punkte[i];
}
04.02.2006 - 18:11 Uhr

Mit IDictionaryEnumerator.Key kommst du an den Key in der HashTable.
Mit HashTable[key] kommst du dann an den Wert der für den key abgespeichert ist.

04.02.2006 - 18:04 Uhr

Welches DBMS benutzt du?
Vielleicht muss das Datum ein bestimmtes Format haben.
DateTime.ToString() gibt standardmäßig die Zeit mit aus (dd.MM.yyyy HH.mm.ss).
Du kannst es ja mal mit DateTime.ToString("dd.MM.yyyy") versuchen.

So eine maskierte Textbox gibt es leider nicht.
Du könntest aber mit einem RegularExpressionValidator die Eingabe überprüfen.
Oder du benutzt mehrere Textboxen also z.B. <TextBoxVorname>.<TextBoxNachname>@<TextBoxDomain>.
Mit Javascript könntest du dann jeweils anhand der Auswahl in der DropdownBox festlegen welche Textboxen angezeigt werden und welche nicht.

04.02.2006 - 10:26 Uhr

Deine SQL Abfrage ist noch nicht optimal. Ein Join wäre angebrachter und schneller als eine geschachtelte Anfrage mit dem 'IN' Operator.


Select * From kunden INNER JOIN bestellungen ON kunde.kundennr = rechnung.kundennr
WHERE Rechnung.Datum BETWEEN datum1 AND datum2

Zu den Schichten: den SQL text würde ich, wie DeveloperX schon sagte, komplett aus der GUI entfernen. In einer weiteren Klasse wäre der besser aufgehoben.
In dieser Klasse hast du nur Methoden die SQL Anfragen stellen und die Ergebnisse zurückliefern. Die Datenbankverbindung bekommen diese Methoden von deiner DB Klasse.
Deine GUI benutzt dann nicht mehr die DB Klasse.

Am besten arbeitest du zusätzlich nur mit Interfaces (IDbConnection, IDataReader etc), dann sind am wenigsten änderungen nötig, falls du z.B. den ODBC Treiber oder das DBMS wechselst.

Schau mal in der Dokumentation nach IDbCommand, IDataReader und IDataRecord. Dort ist das ausführlich erklärt, deshalb hier nur ein kleines Beispiel:


IDbCommand command;
IDataReader reader = command.ExecuteReader();

while (reader.Read()) // gehe zum nächsten Tupel solange vorhanden
{
    string name = reader.GetString(0); // hole Wert aus 1. Spalte
    double betrag = reader.GetDouble(1); // hole Wert aus 2. Spalte
}

25.01.2006 - 22:29 Uhr

So bekommst du alle Tupel in der Relation mit den Detail Daten für den Kunden mit der Nr 1:

SELECT * FROM Kunde_Detail
WHERE KuNr=1

mit dem Join kannst du auch die Daten beider Relationen zusammenfassen (vorsicht kann "teure" Anfrage sein, da Kartesisches Produkt!):
SELECT * FROM Kunde JOIN Kunde_Detail ON Kunde.KundenNr = Kunde_Detail.KuNr
WHERE KuNr=1

Die Syntax kann je nach DBMS unterschiedlich sein.

Ich hoffe ich konnte dir helfen, ansonsten wäre es hilfreich zu wissen, was denn genau schief geht.

25.01.2006 - 17:38 Uhr

Verstehe ich dich richtig, dass die Collection die mit dem Editor bearbeitet wird eine Parent Eigenschaft hat, die du dem neuen Collectionitem übergeben willst? Dann kannst du doch die Collection in einer Variable im Editor abspeichern und in der Factory Methode darauf zugreifen, also z.B. so:

MyClass x = new MyClass(this.EditValue.Parent);

Wenn du dass so beabsichtigt hast wäre es vielleicht besser die Parent Eigenschaft des Collectionitems beim hinzufügen in die Collection zu setzen (z.B. eine OnAdd Methode in der Collection).

25.01.2006 - 14:06 Uhr

Du musst die CreateInstance(Type itemType) Methode überschreiben:


protected override Object CreateInstance(Type itemType)
{
    return new Foo(1234);
}

_
Creates a new instance of the specified collection item type.

Parameters
itemType
The type of item to create.

Return Value
A new instance of the specified object. _

24.01.2006 - 11:48 Uhr

Hallo f.ritz,

vielleicht hilft dir das:


try
{
    Foo();
}
catch (System.Web.Services.Protocols.SoapException e)
{
    if (e.InnerException == typeof(System.UnauthorizedAccessException))
    {
        // deine exception behandlung
    }
    else
        throw e;
}

21.01.2006 - 18:11 Uhr

Hast du mal versucht den SelectedValue in der PageLoad Methode auszulesen?

19.01.2006 - 19:15 Uhr

Für den MembershipProvider gibt es, wie du vielleicht weist, beim codeproject eine Implementierung für MySQL, welche einen Roleprovider beinhaltet siehe hier.

Der Profile Provider scheint in der Tat etwas komlizierter zu sein. Ein Grund ist, dass er wegen der verschiedensten Profildaten (Adresse, Avatar etc) nicht so ohne weiteres universell Verwendet werden kann.
Eine frei verfügbare Implementation ist mir nicht bekannt.

19.01.2006 - 18:59 Uhr

Vielen Dank für eure Antworten.
Ich meinte das, wie Cord es verstanden hat.

Mein Control sieht nun ungefähr so aus:


public partial class MyControl : System.Web.UI.UserControl
{
    // ...

    private ITemplate _Content = null;
    [TemplateContainer(typeof(ContentTemplate))]
    public ITemplate Content
    {
        get
        {
            return _Content;
        }
        set
        {
            _Content = value;
        }
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        if (Content != null)
        {
            Content.InstantiateIn(this.ContentPlaceHolder);
        }
    }

    public class ContentTemplate : Control, INamingContainer
    {

    }
}

In der Zugehörigen .ascx Datei steht (auszugsweise):


<asp:placeholder runat="server" id="ContentPlaceHolder">
</asp:placeholder>

Das funktioniert nun zur Laufzeit.
Im Design Modus aber nicht ("Cannot switch views: Content is not allowed between the opening and closing tags for element 'MyControl'.").
Irgendwie muss dass doch funktionieren (beim CreateUserWizard z.B. gehts doch).

18.01.2006 - 17:01 Uhr

Hallo,

ich möchte für eine häufig verwendete Tabelle (mit einheitlicher Formatierung) ein Usercontrol erstellen. Der Inhalt soll dann in etwa wie bei einem ContentplaceHolder einer Masterpage bearbeitbar sein.

Das soll dann in etwa so aussehen:


<uc:MyControl ID="MyControl1" runat="server" Title="Foobar">
     <Content>
          <asp:Label ID="label1" runat="server">Test</asp:Label>
     </Content>
</uc:MyControl>

Das erstellen eines Usercontrols (System.Web.UI.UserControl) ist ja kein Problem, aber wie mache ich das mit dem Platzhalter für den Content?
Einen ContentPlaceHolder kann man nur in Masterpages verwenden und Placeholder funktioniert nicht.

07.12.2005 - 21:55 Uhr

Das ist "normal". Welchen Sinn das haben soll weiß ich aber auch nicht. Beim VScrollBar ist es genauso.

Weil ich mich ohnehin gerade mit dem Thema Floatingpoint Zahlen beschäftige, habe ich einen kleinen Algorithmus für Rationale Zahlen geschrieben (siehe Anhang).

Edit: kleine Änderung der Algorithmus ist nun in der lage zu kürzen.

kleines Bsp:

1/3 ist ungefähr 1431655765/4294967296 = 0.33333333325572312

Wegen herbivore's berechtigtem Einwand (Ursache sind die Rundungsfehler) würde ich mir einen anderen Algorithmus überlegen.

Schau dir doch mal genauer an, wie Gleitkommazahlen nach IEEE 754 berechnet werden.

Beispiel für single Zahlen:

10111101100000000000000000000000

Vorzeichen ist Negativ (da Bit 31 = 1)
Exzess e = 0b01111011 = 123
der Fractionanteil ist 0
die Zahl ist also:
z = -1,0 * 2^(e-127)
= -1,0 * 2^((123)-127)
= -1,0 * 2^(-4)
= -0,0625

es ist leicht zu erkennen, dass -0,0625 = -1/16 ist. Wie kommt man also auf den Bruch?

Dazu musst du dir die Rechnung binär anschauen:

z = -1 * 0b1 * 2^(-4)
= -1 *0b0,1 2^(-3)
= -1 *0b0,01 2^(-2)
= -1 *0b0,001 2^(-1)
= -1 *0b0,0001 2^(0)

aus dem Nachkommaanteil berechnest du den Bruch: 0*1/2 + 0*1/4 + 0*1/8 +1*1/16 + 0* 1/32 + 0* 1/64 + ... = 1/16

anderes Beispiel:

0 10000100 00101100000000000000000 ist also 75/2 = 37,5

Vz: positiv
e = 132
f = 00101100000000000000000

Ergebnis = 0b1,00101100000000000000000 * 2^(132-127)
= 0b1,001011 * 2^(5)
= 0b100101,1

0b100101 = 37

Nachkommastellen: 1 * 1/2

also 37+1/2 = 75/2

eine gleitkommazahl setzt sich folgendermaßen zusammen:

Zahl = mantisse * Basis ^ Exponent

Bei binärzahlen ist die Basis immer 2.

Eine single Zahl (32 Bit) setzt sich somit so zusammen (Das Bit 32 ist ganz links):
Bit 31: Sign, Bit 30-23 (8 Bit): Exponent (23 bit), Bit 22-0: Fraction

Bei double (64 Bit) ist der Exponent 11Bit und der Fractionanteil 53 Bit lang.

29.11.2005 - 13:34 Uhr

Folgendes steht in der Doku über die Stream.Read(byte[], int, int) Methode:

Parameters

buffer:
An array of bytes. When this method returns, the buffer contains the specified byte array with the values between offset and (offset + count - 1) replaced by the bytes read from the current source.
offset:
The zero-based byte offset in buffer at which to begin storing the data read from the current stream.
count:
The maximum number of bytes to be read from the current stream.

Du musst also von der Buffer-Länge die Position im Buffer subtrahieren:

LeseStream.Read(myByteBuffer, (int)LeseStream.Position, myByteBuffer.Length-(int)LeseStream.Position);

oder den offset auf 0 setzen:

LeseStream.Read(myByteBuffer, 0, myByteBuffer.Length);
29.11.2005 - 10:00 Uhr

Vielleicht hilft dir dieser Thread weiter?

05.11.2005 - 19:40 Uhr

Hallo Holgie,

Beim codeproject gibt es eine Artikel reihe die sich "C# does Shell" nennt.
Im zweiten Artikel gibt es u.A. eine Kopiermethode.
Diese Kopiermethode benutzt die Windows API, dass kopieren mit der ist wie beim Windows-Explorer.

Hallo LastGentleman,

du könntest eine Wrapper Klasse schreiben, die intern deine Collection hat.
Von außen kann die Liste dann nur noch über die Methoden des Wrappers geändert werden.

Das ist nicht legal, es sei denn du hast einen MSDNAA (MSDN-Academic-Alliance) Account der für Studenten (Informatik und ähnliche Studiengänge) kostenlos ist.
Die meisten Hochschule machen bei der MSDNAA mit.

Bei meiner Hochschule gibts derzeit leider immer noch nur die Beta 🙁

05.11.2005 - 01:32 Uhr

Das sieht so aus, als ob das Control nicht oder nicht ganz neu gezeichnet wurde.
Überprüf mal ob du Methoden überschrieben hast, so dass sie das Neuzeichnen verhindern.
Wenn du z.B. die OnSizeChanged Methode überschreibst und nicht base.OnSizeChanged aufrufst kann das so aussehen.

05.11.2005 - 01:01 Uhr

Ich hab mir den Code angesehen und keinen Fehler entdeckt.
Weitere Änderungen/Bindungen sollten nicht nötig sein.

Vielleicht hat die Eigenschaft entweder keinen getter oder setter?

Du kannst ja mal in die GetEditStyle Methode eine MessageBox einbauen, um zu sehen, dass die Methode überhaupt aufgerufen wird und edSvc nicht null ist (Breakpoint setzen geht ja nur zur Laufzeit).

25.10.2005 - 20:06 Uhr

Vorsicht: c# Generics != c++ Templates!
Generics sind so wie bei Java, falls du das kennst.

Die Templates bei c++ können im Gegensatz zu den Generics zu unglaublich großen Datenmengen führen, da für jeden Typ compiliert.

25.10.2005 - 19:59 Uhr

@herbivore:
Das CanFocus hilft ihm nicht es hat nur einen Getter und gibt Visible&Enabled zurück.

@Marcel:
Du kannst noch das ControlStyles.Selectable Flag setzen, es sollte aber auch ohne dieses funktionieren wenn Du erst nach dem hinzufügen zu einer Form den Focus übergibst. Das Focus() das bei Dir im Konstruktor steht hat keine Wirkung.

25.10.2005 - 18:59 Uhr

Du hast recht an DateTime.DayOfWeek hab ich gar nicht gedacht.

25.10.2005 - 18:50 Uhr

Wenn er aber erst die Montage, dann die Dienstage usw. sehen will funktioniert das auch dann nicht, wenn er die original Daten im Tag hat.

Bsp.: Di.18.10 < Mo 24.10. aber Mo < Di

25.10.2005 - 18:39 Uhr

warum Enums, Array und eigene Wochentagsdefinitionen verwenden, wenn es DateTime gibt?

weil er einen String in der Spalte hat. Wenn er DateTimes in die Spalte tun würde, wird das Datum in einer Standardformatierung (ToString()) ohne Wochentage angezeigt.

25.10.2005 - 17:32 Uhr

Ich wüßte nicht wie das per Reflection gehen soll?

Ich würde das anders machen und zwar so wie es ab .Net 2.0 implementiert ist mit einer HashTable, in die alle Controls der Form beim OnControlAdded hinzugefügt werden. Als schlüssel nimmst du den Namen des Controls.

25.10.2005 - 16:59 Uhr

Du musst auch die Combobox aus dem Konstrukor nehmen, damit sie in der gesamten Klasse sichtbar ist.

P.S. du hättest die Combobox auch mit dem Designer erstellen können, das spart etwas Schreibarbeit und man sieht gleich, wie es aussieht.

25.10.2005 - 16:51 Uhr

Alternativ kannst du dir auch eine eigene Collection nur mit lvlPictureBox bauen, ist aber relativ viel Schreibarbeit und daher nur zu empfehlen, wenn du noch andere spezielle Dinge mit der Collection machen willst.

25.10.2005 - 16:33 Uhr

EDIT 2:
Du kannst dem Control erst nachdem e zu einer Form hinzugefügt wurde den Focus übergeben

25.10.2005 - 10:51 Uhr

wie wärs mit


string wochentage [] = {"Montag", "Dienstag", /*...*/};
return Array.IndexOf(wochentage, spalte1).CompareTo(Array.IndexOf(wochentage, spalte2));

25.10.2005 - 10:27 Uhr

Ich würde folgendes machen: (geändert ab Zeile 39)


//
// Auszug aus dem Konstruktor:
//
                        ComboBox CB = new ComboBox();
			CB.Location = new System.Drawing.Point(216, 32);
			CB.Name = "comboBox1";
			CB.Size = new System.Drawing.Size(120, 21);
			CB.TabIndex = 2;
			//zeile gelöscht: CB.Text = "Deutsch";
			
			CB.DropDownStyle = ComboBoxStyle.DropDownList; // zeile hinzugefügt
	
			try
			{
				DirectoryInfo di = new DirectoryInfo(ordner);
				FileInfo[] files = di.GetFiles();
				
				for (int u=0; u<files.Length; u++)
				{
					string datei = files[u].Name;
					string listentext = datei.Substring(0,datei.Length - 4);
					CB.Items.Add(listentext);
				}
				
				this.Controls.Add(CB);
				//zeile gelöscht: box = Convert.ToString(CB.SelectedItem);
				
                                // zeilen hinzugefügt:
				if(CB.Contains("Deutsch"))
					CB.SelectedItem = "Deutsch";
				else
					CB.SelectedIndex = 0;
			}

			catch (IOException ex)
			{
				MessageBox.Show("Fehler beim Ermitteln der Dateien: {0}.", ex.Message);
			}

Die Variable Box ist überflüssig. Du kannst sie mit

(string)CB.SelectedItem

ersetzen

24.10.2005 - 13:45 Uhr

Ich vermute mal, dass du aus einer anderen Klasse auf die StreamReader und StreamWriter Felder zugreifen willst.
Dazu müssten die Variablen aber als access modifier public oder zumindest internal haben. Besser wäre es aber eine Eigenschaft zu wählen mit einem privaten Feld.

24.10.2005 - 13:33 Uhr

Box hast Du als lokale Variable im Konstruktor deklariert. Du kannst aber nicht aus einer Methode heraus lokale variablen die in einer anderen Methode oder einem Konstruktor deklariert werden auslesen.
Du musst sie also in die Klasse schreiben.

EDIT: da war wohl einer um ein paar Sekunden schneller 😁

Übrigens: In der Objektorientierung spricht man von Methoden und nicht von Funktionen. Konstruktoren sind keine Methode, auch wenn sie so aussehen.
Ich merke dass nur an, weil Peter15 noch kein Experte ist und nicht durch falsche Begriffe verwirrt werden soll.

24.10.2005 - 13:03 Uhr

hat jemand ne ideeworan das liegen kann? oder könnte sich jemand mal dieses problem ansehen?

Ich denke ohne den Code zu sehen kann man dazu nicht viel sagen.

Ich würde allerdings mal einige Breakpoints setzen oder das Programm in Einzelschritten ablaufen lassen und dann schauen, was in den Variablen steht.

Einen Bug im StreamWriter halte ich für unwarscheinlich.

Ich meine ab und zu den gleichen oder so einen ähnlichen Fehler gehabt zu haben.
Beim mir half es dann meist, die Entwicklungsumgebung neu zu starten.
Es könnte auch sein, dass vom VS automatisch erstellte Dateien oder Codeteile beschädigt sind.
Mehr fällt mir dazu leider auch nicht ein.

Ich glaube er meint eher das param xml-tag

<param name='name'>description</param>

24.10.2005 - 11:56 Uhr

Für mich sieht das nach einem Hash mit der länge von 256 Bits aus, da es sich offenbar um eine Hex zahl handelt und (64/2)*8=256.
Es könnte daher ein SH256 hash sein.

23.10.2005 - 20:57 Uhr
class FooBar : Form
{
    public FooBar()
    {
         this.KeyPreview = true;
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
         if (e.KeyData == Keys.Enter)
         {
              Foo(); // hier ruf die Methode auf die auch beim klicken auf den Button ausgeführt wird
              e.Handled = true;
          }

         base.OnKeyDown(e);
    }
}
23.10.2005 - 20:33 Uhr

Eine alternative wäre Form.KeyPreview auf true zu setzen und in der überschriebenen OnKeyDown Methode zu überprüfen, ob Enter gedrückt wurde.