Laden...
M
MrLeeh myCSharp.de - Member
Dipl.- Ing. (FH) Deutschland Dabei seit 19.02.2008 194 Beiträge
Benutzerbeschreibung

Forenbeiträge von MrLeeh Ingesamt 194 Beiträge

07.12.2008 - 18:11 Uhr

Wie wäre es mit

DateTime.Now;

???

28.11.2008 - 08:26 Uhr

Sollte man auch beachten wenn man einen Vergleich von zwei Double-Zahlen macht, die auf unterschiedliche Weise berechnet wurden. Da kann es nämlich schnell durch die Rundungsfehler dazukommen, dass sie nicht gleich groß sind, obwohl das laut Mathematik so sein müsste. Für solche Fälle setze ich ein Delta ein, das einen gewissen Rundungsfehler erlaubt.

bool IstGleich (double dZahl1, double dZahl2)
{
  bool bRetVal = false;
  double dDelta = 0.000001; //erlaubte Abweichung
  if ((dZahl1 >= dZahl2 - dDelta) && (dZahl1 <= dZahl2 + dDelta))
  {
    bRetVal = true;
  }
  return bRetVal;
}
26.11.2008 - 10:25 Uhr

So weit ich weiß musst du StringBuilder verwenden wenn du die Parameter, die du der Funktion übergibst wieder auswerten möchtest.

In bestimmten Situationen müssen Zeichenpuffer mit fester Länge zur Bearbeitung an nicht verwalteten Code übergeben werden. In diesem Fall ist es nicht möglich, die Zeichenfolge einfach zu übergeben, da der Aufgerufene den Inhalt des übergebenen Puffers nicht ändern kann. Selbst wenn die Zeichenfolge durch einen Verweis übergeben wird, kann der Puffer nicht für eine gegebene Größe initialisiert werden.

Die Lösung besteht darin, anstelle einer Zeichenfolge einen StringBuilder-Puffer als Argument zu übergeben. Ein StringBuilder kann durch den Anrufer dereferenziert und geändert werden, sofern er die Kapazität von StringBuilder nicht überschreitet. Sie können auch für eine feste Länge initialisiert werden. Wenn Sie beispielsweise einen StringBuilder-Puffer mit einer Kapazität N initialisieren, stellt der Marshaller einen Puffer mit einer Größe von (N+1) Zeichen zur Verfügung. Durch +1 wird der Tatsache Rechnung getragen, dass die nicht verwaltete Zeichenfolge, im Gegensatz zu StringBuilder, über einen Nullterminator verfügt.

Ja, wie das dann mit den Array funktioniert kann ich dir aber auch nicht sagen.

26.11.2008 - 09:21 Uhr

Naja, string in C# enthält Unicode zeichen (2Byte). Wenn die Funktion die du aufrufst aber ANSI (1Byte) Zeichen verarbeitet kann es zu Problemen kommen.

26.11.2008 - 09:11 Uhr

Hallo Schnuki,
ich könnte mir vorstellen, dass das auch an dem verwendeten CharSet liegen könnte.

Ich habe aber gleich noch eine andere Frage:
Ich biete eine Funktion per COM an, die ein char* übergeben bekommt, welches ich mit StringBuilder marshal:

public void GetDataItemName (int iID, [Out] StringBuilder sbItemName)

Zurückgeben muss ich den Namen eines Elements. Der Aufruf der Funktion aus C++ sieht in etwa so aus:

char cName[64];
GetDataItemName(iBlockId, cName);

Und jetzt kommt der Witz: Da das char-Array nicht vorinitialisiert ist, kann es vorkommen, dass der StringBuilder nur die MaxCapacity von z.B. 5 hat während ich aber viel mehr Zeichen ausgeben will. Gibt es eine Möglichkeit, die Kapazität nachträglich zu erhöhen? Per new Erzeugen bringt ja nichts, weil dann meine Referenz zerstört ist.

25.11.2008 - 17:11 Uhr

Nach ein bißchen Recherche ....

So funktioniert' s einwandfrei:


Assembly.LoadFrom(System.IO.Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "System.Windows.Forms.dll"));

25.11.2008 - 16:44 Uhr

@Kleines_Eichhörnchen: Danke für den Tipp

Also mit

Assembly.LoadFrom(Pfad_zu_System.Windows.Forms);

funktioniert es schonmal. Ich stelle mir jetzt nur die Frage, wie ich den genauen Pfad zu der aktuellen DLL, sprich zum aktuellen .NET Framework bekomme. Der ist ja nicht immer gleich, schon gar nicht auf anderen Rechnern.

25.11.2008 - 15:46 Uhr

Hallo Leute,

ich habe eine DLL geschrieben, die aus Kompatibilitätsgründen zu C++ über COM angesprochen wird. Sie verfügt über eine Funktion, die einen Konfigurationsdialog in Form eines Formulars öffnet. Und hier kommt das Problem: Das erste Öffnen dieses Formulars dauert viel zu lange. Ich nehme an das liegt daran, dass zuerst die .NET Ressourcen für die GUI Darstellung (System.Windows.Forms) geladen werden müssen. Wenn ich das Formular schließe und wieder öffne, geht das ganz fix. Deshalb meine Frage: Gibt es eine Möglichkeit, die Ressourcen schon vorher zu laden (z.B. beim Initialisieren der DLL)? Bin für jeden Tipp dankbar.

Grüße

25.11.2008 - 08:35 Uhr

Wie ist das eigentlich beim Stringbuilder mit der Problematik, dass in C++ char nur 1 Byte groß ist, während es in C# 2 Byte Unicode ist? Erfolgt die Umwandlung automatisch?

Grüße

24.11.2008 - 19:48 Uhr

Ich denke mit der WINAPI fährst du da am besten. Folgende Seite sollte dir weiterhelfen:

http://pinvoke.net/default.aspx/user32/GetKeyboardState.html

24.11.2008 - 08:13 Uhr

Ja, eine List ist da sicher die bessere Variante, da du dort nachträglich Elemente hinzufügen kannst.

array.length = iZahl geht nicht

ist klar, weil array.length eine readonly Eigenschaft ist. Der kannst du nichts zuweisen.

20.11.2008 - 20:59 Uhr

Man kann es übrigens auch so machen, wenn wir schon bei verschiedenen Möglichkeiten sind 😄:


     ListViewHitTestInfo htInfo=  listView1.HitTest(MousePosition.X, MousePosition.Y);
     if (htInfo != null)
     {
           ListViewItem myItem = htInfo.Item;
     }

20.11.2008 - 20:56 Uhr

ABer habs jetzt so gemacht.

naja, ist etwas unübersichtlich oder? wie gesagt es geht auch in einer Zeile

20.11.2008 - 20:51 Uhr

Ja, pardon hab ich auch gerade gesehen. Für' s ListView wäre es dann:

 ListViewItem item = lv.GetItemAt(lv.PointToClient(MousePosition).X, lv.PointToClient(MousePosition).Y);
20.11.2008 - 20:45 Uhr

Schon mal das probiert:

TreeNode n = treeView1.GetNodeAt(treeView1.PointToClient(MousePosition));

Das sollte es eigentlich tun.
Grüße

19.11.2008 - 11:02 Uhr

Warum einfach wenn' s auch kompliziert geht 😁 Sieht auf jeden Fall interessant aus.

19.11.2008 - 09:58 Uhr

Dann kannste ja den Thread mit [gelöst] markieren 🙂
Grüße

19.11.2008 - 09:51 Uhr
DateTime dt = new DateTime(2008, 11, 19);
dt = dt.AddDays(-1);

siehe Hilfe 🙂

18.11.2008 - 22:12 Uhr

Hab ich gleich mal auf meiner Website verlinkt 🙂

18.11.2008 - 11:12 Uhr

Ja, genau das isses. Danke dir für den Denkanstoß. Ich habe jetzt mal das char[] durch byte[] ersetzt und so funktioniert es:

public void GetDataItemName (IntPtr pItemName)
{
    string sItemName = (iReadWrite==0) ? "Eingang": "A";

    char[] c = sItemName.ToCharArray();
    byte[] b = new byte[c.Length + 1];

    for (int i = 0; i < c.Length; i++ )
    {
        b[i] = (byte) c[i];
    }

    b[c.Length] = (byte) '\0';
    
    Marshal.Copy(b, 0, pItemName, b.Length);
}

Gibt es da noch eine elegantere Variante, das char-Array in ein Byte-Array zu wandeln?

18.11.2008 - 10:53 Uhr

char ist nicht 1 byte groß

Beim Inkrementieren eines Pointers wird der aber um die Größe des Datentyps erhöht, also im Falle char * würde der um 2Byte erhöht werden. Aber ist ein interessanter Denkanstoß, denn die Hostanwendung ist mit Borland C++ geschrieben und dort ist char 1 Byte.

18.11.2008 - 10:33 Uhr

Hallo Leute,
ich bin am Verzweifeln. Ich habe eine Funktion geschrieben, die über COM einen char Pointer erhält. An diesen soll ein Name übergeben werden. Nur leider wird immer nur der erste Buchstabe übergeben, egal welche Kopfstände ich mache. Hier ist der Code:

public void GetDataItemName (char* pItemName)
{
    char[] c = new char[3] { 'E', '1', '\0' };
    char* p = pItemName;
    
    for (int i = 0; i < c.Length; i++ )
    {
        *p = c[i];
        p++;
    }
}

Den Aufruf der Funktion mache ich in C++ mit folgender Anweisung:

pDLLAccess->GetDataItemName(cpItemName);

Es wird jedoch nicht 'E1' wie erwartet zurückgegeben, sondern nur 'E'. Das kann ich mir nicht erklären. Zumal ich einen Nullterminator eingefügt habe. Ich habe es auch schon mit einem IntPtr ausprobiert, das hat leider das gleiche Ergebnis gebracht. Hat jemand von Euch eine Idee hierzu?

Danke und Grüße

15.11.2008 - 15:11 Uhr

Auf die Variable anzahlStudent kannst du eigentlich auch verzichten, die würde ich eher über studenten.Count abfragen.

15.11.2008 - 13:32 Uhr

Was ist mit der Funktion

Daten.Budget.Select

Kann es sein, dass die auch noch einmal das SelectedIndexChange-Event auslöst?

14.11.2008 - 20:40 Uhr

Der Fehler liegt hier:

studenten.Add(name);

name ist ein String, die Add Methode erwartet jedoch ein Objekt vom Typ Student, welches du mit new erzeugen musst.

14.11.2008 - 10:14 Uhr

k_VV [0.95 -> 3.0 kW/(m²K)]

Wie man sieht arbeit ich an der Hochschule 😁

13.11.2008 - 15:33 Uhr

Ja, die Wahrscheinlichkeit bestünde, aber die Forumsuche hat mich nicht auf die richtige Fährte gelockt 😭

13.11.2008 - 14:36 Uhr

@FZelle,
danke für die Info. Aber wieso "nocheinmal"? Mir deucht, du hattest hier bisher noch nicht dazu gepostet 😉

13.11.2008 - 11:52 Uhr

Also so wie das aussieht, ist diese Extension eher ein Addon für diese Workflow Foundation. Ich konnte es zumindest nicht bei mir installieren, weil mir die ebengenannte fehlte.

12.11.2008 - 17:19 Uhr

@Jack30Lena und MagixAndre
Danke für den Tipp. Habe gerade mal nach Extensions für VS 2005 gesucht und das hier gefunden:

**Visual Studio 2005 extensions for .NET Framework 3.0: **
http://www.microsoft.com/downloads/details.aspx?familyid=5D61409E-1FA3-48CF-8023-E8F38E709BA6&displaylang=en.

Ich werde das mal ausprobieren. Ist aber leider auch nicht .NET 3.5. Vielleicht hat ja jemd. noch eine Idee?

12.11.2008 - 16:48 Uhr

Hallo,

ich benutze Visual Studio 2005. Im Infodialog zeigt es mir an, dass ich mit .NET 2.0 SP1 arbeite. Gibt es eine Möglichkeit, eine neuere Version des .NET Frameworks in Visual Studio zu benutzen? Ich habe auch schon mal die SDK von .NET 3.5 installiert, aber das hat nichts gebracht. Wenn jemand damit Erfahrungen hat wäre ich für einen Tipp oder Hinweis dankbar.

Beste Grüße
MrLeeh

10.11.2008 - 13:54 Uhr

Also zum Compact Framework kann ich nichts sagen, normal geht es so:

            DriveInfo di = new DriveInfo("C");
            MessageBox.Show(@"Verfügbarer Speicherplatz auf C:\: " + di.TotalSize.ToString());

Aber wie Herbivore gesagt hat, gibt es wohl DriveInfo unter dem CompactFramework nicht. 🙁

10.11.2008 - 09:20 Uhr

Kleine Ergänzung noch: Du musst unbedingt drauf achten, dass deine Teile, die du im Ganzen kopierst nicht zu groß werden. Dann wird nämlich dein RAM zugeRAMmelt und irgendwann geht nichts mehr. Das habe ich in dem Beispiel noch nicht eingebaut, werde es aber demnächst tun.

Weiß jemand eigentlich warum es so viel länger dauert, wenn man die Blockgröße kleiner wählt. Ich kann mir das nur so erklären, dass er dann öfter zwischen Lesen und Schreiben wechselt und somit ständig auf der Platte hin und her springt. Die Frage ist jetzt, was ist die optimale Blockgröße? Vielleicht ein Vielfaches der Clustergröße?

Grüße

10.11.2008 - 08:41 Uhr

Das blocken der Anwendung kannst du mit Application.DoEvents() verhindern. Das habe ich aber eigentlich schon mit eingebaut. Es gilt natürlich das, was Herbivore sagt, dass die Dateieigenschaften nicht mit übertragen werden. Die musst du dann evtl. noch nachträglich angleichen.

Beste Grüße

08.11.2008 - 13:57 Uhr

Versuch dir doch mal klar zu werden, wie du die Aufgabe auf mathematischem Wege lösen würdest. Was musst du mathematisch machen, um auf die einzelnen Ziffernstellen zu kommen? Der Tipp von Herbivore ist dabei schon sehr gut: Modulo 🛈http://openbook.galileodesign.de/actionscript/actionscript_2_08_001.htm#Rxx22120800104003B841F04B1BA

08.11.2008 - 13:47 Uhr

dann verwende xml-serialisierung. das nimmt dir fast alle arbeit ab.

siehe oben 😁

08.11.2008 - 12:01 Uhr

@Kovu:
Ein Beispiel hab ich mal auf meiner Website reingestellt: http://mrleeh.de/mrleeh/archives/238-Dateien-mit-Fortschrittsleiste-kopieren.html
Vielleicht nutzt dir das ja was. Grüße

08.11.2008 - 10:33 Uhr

Schau mal nach dem Stichwort Deserialisierung, da wirst du bestimmt fündig. Ein recht anschauliches Beispiel findest du hier: http://weltnetz.dyndns.org/dcz/?p=779 oder auf Java2s.com: http://www.java2s.com/Code/CSharp/XML/Xml-Serialization.htm

03.11.2008 - 12:53 Uhr

Das müsste über Application.Sheets["Sheetname"] gehen.

24.10.2008 - 15:11 Uhr

Also ich habe eine schöne Lösung gefunden, funktioniert einwandfrei


using ZedGraph;
using System.Drawing;

private bool bMoveLegend = false;   //Flag Legende verschieben
private double dDeltaMouseX = 0.0;
private double dDeltaMouseY = 0.0;

private bool zedGraph_MouseDownEvent(ZedGraphControl sender, MouseEventArgs e)
{
    Legend legend = sender.GraphPane.Legend;
   
    //Herausfinden ob mit Maus über Legende
    if (e.X >= legend.Rect.X
        && e.X <= (legend.Rect.X + legend.Rect.Width)
        && e.Y >= legend.Rect.Y
        && e.Y <= (legend.Rect.Y + legend.Rect.Height))
    {
        //Zoom ausschalten
        sender.IsEnableHZoom = false;
        sender.IsEnableVZoom = false;
        sender.Cursor = Cursors.Hand;
       
        //relative Mauskoordinaten
        double dMouseX = e.X / sender.GraphPane.Rect.Width;
        double dMouseY = e.Y / sender.GraphPane.Rect.Height;

        //Abstand Maus zur linken oberen Ecke der Legende
        dDeltaMouseX = dMouseX - legend.Location.X;
        dDeltaMouseY = dMouseY - legend.Location.Y;

        //Flag setzen
        bMoveLegend = true;
    }
    return default(bool);
}

private bool zedGraph_MouseUpEvent(ZedGraphControl sender, MouseEventArgs e)
{
    //Bei MouseUp Flag zurücksetzen
    bMoveLegend = false;
    sender.Cursor = Cursors.Cross;
    sender.IsEnableHZoom = true;
    sender.IsEnableVZoom = true;
   
    return default(bool);
}

private bool zedGraph_MouseMoveEvent(ZedGraphControl sender, MouseEventArgs e)
{
    //wenn über Legende Handcursor anzeigen, sonst Kreuz
    Legend legend = sender.GraphPane.Legend;
    if (e.X >= legend.Rect.X
        && e.X <= (legend.Rect.X + legend.Rect.Width)
        && e.Y >= legend.Rect.Y
        && e.Y <= (legend.Rect.Y + legend.Rect.Height))
    {
        sender.Cursor = Cursors.Hand;
    }
    else
    {
        sender.Cursor = Cursors.Cross;
    }

    //wenn Flag gesetzt, dann Legende auf neue Position
    if (bMoveLegend)
    {
        double dMousePctX = e.X / sender.GraphPane.Rect.Width;
        double dMousePctY = e.Y / sender.GraphPane.Rect.Height;

        //neue Location für Legende
        sender.GraphPane.Legend.Location =
            new Location(dMousePctX - dDeltaMouseX, dMousePctY - dDeltaMouseY,
            CoordType.PaneFraction, AlignH.Right, AlignV.Top);
           
        //Zedgraph aktualisieren
        sender.Invalidate();
    }
    return default(bool);
}

private void zedGraph_CursorChanged(object sender, EventArgs e)
{
    //Da Cursor von ZedGraph immer automatisch auf Cross gesetzt
    //wird, hier nochmal auf Hand setzen
    Legend legend = zedGraph.GraphPane.Legend;
    Point p = zedGraph.PointToClient(MousePosition);
    if (p.X >= legend.Rect.X
        && p.X <= (legend.Rect.X + legend.Rect.Width)
        && p.Y >= legend.Rect.Y
        && p.Y <= (legend.Rect.Y + legend.Rect.Height))
    {
        zedGraph.Cursor = Cursors.Hand;
    }
}

24.10.2008 - 13:59 Uhr

Hallo Leute,
weiß jemand vielleicht wie ich im ZedGraph Control die Legende durch den Benutzer verschieben lassen kann? Ich habe keine Standardmöglichkeit dafür gefunden. Aber es ist ja doch eine Funktionalität, die öfters gebraucht wird. Meine sehr bescheidenen Anfänge sehen so aus:

        private bool zedGraph_MouseMoveEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            if (bMoveLegend)
            {
                PointF mousePt = new PointF(e.X, e.Y);
                double dX, dY;
                sender.GraphPane.ReverseTransform(mousePt, out dX, out dY);
                sender.GraphPane.Legend.Location = new Location(dX, dY, CoordType.AxisXYScale, AlignH.Right, AlignV.Top);
            }
            return default(bool);
        }

bMoveLegend wird gesetzt wenn der Nutzer über der Legende den Mausbutton gedrückt hält.

Danke für eure Hilfe

17.10.2008 - 12:52 Uhr

@ProGamer:
DirectX10 für XP, das ist mir neu. Gibt es einen Link dafür?

(wenn ich zuhause bin kann ich gerne die datei anhängen)

Bitte 🙂

17.10.2008 - 11:43 Uhr

Ich war anfangs sehr begeistert von Vista, weil es mal ein bißchen neuen Touch reinbringt. Aber leider musste ich schnell feststellen, dass es mein System doch etwas langsamer gemacht hat und mich dieses Klackern und Flackern schnell nervte. Deshalb arbeite ich jetzt wieder mit XP und bin sehr zufrieden.

02.10.2008 - 14:39 Uhr

Ja, hier ist die Lösung:
VScrollBar in das Formular einfügen, die am besten rechts andockt.

//Funktion für das Scrollevent
private void vscrollBar_Scroll(object sender, ScrollEventArgs e)
{
    GraphPane myPane = zedGraph.GraphPane;
    Scale myScale = null;
    if (rbScrollY1.Checked)
    {
        myScale = myPane.YAxisList[0].Scale;
    }
    else
    {
        myScale = myPane.YAxisList[1].Scale;
    }
    if (myScale != null)
    {
        double d = (myScale.Max - myScale.Min) / 2;
        myScale.Min = e.NewValue/1000 - d;
        myScale.Max = e.NewValue/1000 + d;
        zedGraph.Refresh();
    }
}

//ResizeVScrollBar wird aufgerufen, sobald ein LineItem hinzugefügt wurde oder
//sich der Scrollbereich verändert hat
private void ResizeVScrollBar(int iYAxisIndex)
{
    GraphPane myPane = zedGraph.GraphPane;
    Scale myScale = myPane.YAxisList[iYAxisIndex].Scale;
    if (myScale!=null)
    {
        int iMin = (int) zedGraph.YScrollRangeList[iYAxisIndex].Min;
        int iMax = (int) zedGraph.YScrollRangeList[iYAxisIndex].Max;

        try
        {
            vscrollBar.Minimum = 1000 * iMin;
            vscrollBar.Maximum = 1000 * iMax;
            vscrollBar.SmallChange = 1000 * (iMax - iMin) / 20;
            vscrollBar.LargeChange = 1000 * (iMax - iMin) / 5;
            vscrollBar.Value = 1000 * (int)(myScale.Max + myScale.Min) / 2;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

    }
}
02.10.2008 - 09:55 Uhr

Hallo Leute,
weiß jemd. wie man beim ZedGraph-Control eine 2.YAchse (YAxisList[1]) auf benutzerfreundliche Weise scrollen kann. Es gibt ja die Möglichkeit die controleigene VScrollBar dafür zu nutzen. Das habe ich über einen Radiobutton implementiert. Wenn er ausgewählt ist, dann wird YAxis1 gescrollt ansonsten YAxis2:

            ScrollRange srY1 = zedGraph.YScrollRangeList[0];
            ScrollRange srY2 = zedGraph.YScrollRangeList[1];

            if (rbScrollY1.Checked)
            {
                srY1.IsScrollable = true;
                srY2.IsScrollable = false;   
            }
            else
            {
                srY1.IsScrollable = false;
                srY2.IsScrollable = true;
            }

            // neu zuweisen, da Werttyp (Struct)
            zedGraph.YScrollRangeList[0] = srY1;
            zedGraph.YScrollRangeList[1] = srY2;

Diese Variante ist leider nicht zufriedenstellend, da sich die VScrollbar immer an der YAxis1 orientiert (Position, Min, Max) und nach einem Scrollevent auf die letzte Position zurückspringt. Kennt ihr eine andere Möglichkeit, um im ZedGraph verschiedene Y-Achsen eigenständig zu scrollen?

Danke für eure Hilfe

01.10.2008 - 11:33 Uhr

Control.PointToScreen und Control.PointToClient ist aber einfacher 🙂

17.09.2008 - 21:10 Uhr

Hallo Baesler,

es gibt Form_Closing und Form_Closed als Events. Form_Closing tritt auf bevor das Formular geschlossen wird und Form_Closed, nachdem das Formular geschlossen wurde. Mit denen müsstest du machen können, was du willst.

Beste Grüße

14.09.2008 - 12:42 Uhr

Vielleicht bringt dir ja der Einsat eines Excape-Zeichens etwas, z.b. \a, welches du anstatt dem @ schreibst. Das kannst du dann wieder interpretieren, wenn du die eingetragenen Daten auswertest.

13.09.2008 - 11:39 Uhr

Die einfachste Möglichkeit ist es, für verschiedene Controls (z.B. Buttons und Menüitems), die die gleiche Funktionalität besitzen einen einzige Ereignishandler zu benutzen, der die Click-Ereignisse aller dieser Controls behandelt. Das bedeutet, du schreibst eine Funktion, z.B.


private void AnyButton_Click (object sender, EventArgs e)
{
  button1.enabled = false;
  button2.visible = true;
  button7.enabled = true;
}

und abbonierst für die Klickereignisse der Buttons diese Funktion. Damit musst du den Code nur einmal schreiben und benutzt ihn für alle Controls, die die gleiche Funktionalität aufweisen. Wenn du es noch feiner machen willst, kannst du auch schauen wer der Sender ist (also das Control, welches das Ereignis ausgelöst hat) und dann noch entsprechende Wenn-Dann Abfragen implementieren, mit denen du zusätzliche Funktionalität ereichst.

10.09.2008 - 11:01 Uhr

Nochmal zum Thema verwirrter Prof. Rößler. Das Kommitee für Elementarteilchenphysik hat einen Artikel rausgebracht, der Rößlers "Erde wird von schwarzem Loch verschlungen"- Theorie etwas auf den Boden zurückholt, anders gesagt: Sie wird rigoros widerlegt.

Wen' s interessiert: http://www.ketweb.de/stellungnahmen/20080730_Stellungnahme_zu_den_Behauptungen_von_Prof_Otto_Roessler.pdf