Laden...

Forenbeiträge von steffen_dec Ingesamt 322 Beiträge

12.07.2018 - 14:40 Uhr

Hallo, solche Fehler findest Du am besten heraus wenn du den Debugger verwendest, siehe [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Ich vermute dass in der CSV-Datei eine leere Zeile existiert...

07.06.2018 - 08:24 Uhr

Hi,

meinst Du das PropertyGrid?

05.06.2018 - 07:14 Uhr

Hi,

versuchs mal mit dem Attribut DesignerSerializationVisibility


    public class TestTextBox : TextBox
    {
        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public override bool AutoSize
        {
            get
            {
                return base.AutoSize;
            }

            set
            {
                base.AutoSize = value;
            }
        }
    }
15.12.2016 - 11:46 Uhr

Hallo,

manchmal reicht es wenn man bei dem jeweiligen Verweis "Specific Version" auf "False" setzt (siehe Properties).
Vielleicht hilft es schon!?

Gruß
Steffen

06.12.2016 - 16:40 Uhr

Hallo,

so geht es:



        private void textBox1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop) || e.Data.GetDataPresent(DataFormats.Text))
            {
                e.Effect = DragDropEffects.Copy;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }

        private void textBox1_DragDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.Text))
            {
                textBox1.Text = e.Data.GetData(DataFormats.Text).ToString();
            }
            else if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                textBox1.Text = System.IO.File.ReadAllText(files[0]);
            }
        }

27.09.2016 - 18:35 Uhr

Musst deine externe IP-Adresse verwenden siehe z.b.
https://www.whatismyip.com/de/

dann den benutzen Port im Router weiterleiten (Port forwarding) an deinen lokalen Rechner

28.08.2016 - 09:06 Uhr

Hallo,

hier noch ein Beispiel mit Parallel.For:


internal class Program
    {
        private static int[,] matrix;

        private static void Main(string[] args)
        {
            Stopwatch watch = Stopwatch.StartNew();
            matrix = new int[1000, 1000];

            Parallel.For(0, 1000, y =>
            {
                CalcRow(y);
            });

            Console.WriteLine("Fertig! nach " + watch.ElapsedMilliseconds.ToString("0 ms"));
            Console.ReadKey();
        }
        
        private static void CalcRow(int y)
        {
            Console.WriteLine("Bearbeite Zeile " + y);
            for (int x = 0; x < 1000; x++)
                matrix[x, y] = x * y;
        }
    }

22.06.2016 - 21:07 Uhr

noch eine schnellere Möglichkeit wäre mit Regex 😁 :


Regex reg = new Regex("stop this");
int count = reg.Matches(textBox2.Text).Count;

kurze Zeitmessung (builder.Length => 6.168.000):


static void Main(string[] args)
{
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < 1000; i++)
    {
        builder.Append(_testText);
    }

    Method1(builder.ToString());
    Method1(builder.ToString());
    Method1(builder.ToString());

    Console.WriteLine();

    Method2(builder.ToString());
    Method2(builder.ToString());
    Method2(builder.ToString());

    Console.WriteLine();

    Method3(builder.ToString());
    Method3(builder.ToString());
    Method3(builder.ToString());

    Console.ReadLine();
}

static void Method1(string text)
{
    Stopwatch watch = Stopwatch.StartNew();
    int count = (text.Length - text.Replace(_search, string.Empty).Length) / _search.Length;
    watch.Stop();
    Console.WriteLine("Method1 Count: {0} Duration: {1:0.0} ms", count, watch.ElapsedMilliseconds);
}

static void Method2(string text)
{
    Stopwatch watch = Stopwatch.StartNew();
    int count = text.Split(new string[] { _search }, StringSplitOptions.None).Length - 1;
    watch.Stop();
    Console.WriteLine("Method2 Count: {0} Duration: {1:0.0} ms", count, watch.ElapsedMilliseconds);
}

static void Method3(string text)
{
    Regex reg = new Regex(_search);
    Stopwatch watch = Stopwatch.StartNew();
    int count = reg.Matches(text).Count;
    watch.Stop();
    Console.WriteLine("Method3 Count: {0} Duration: {1:0.0} ms", count, watch.ElapsedMilliseconds);
}

Ausgabe bei mir (Release ohne Debugger):

Method1 Count: 9000 Duration: 36,0 ms
Method1 Count: 9000 Duration: 34,0 ms
Method1 Count: 9000 Duration: 35,0 ms

Method2 Count: 9000 Duration: 62,0 ms
Method2 Count: 9000 Duration: 75,0 ms
Method2 Count: 9000 Duration: 56,0 ms

Method3 Count: 9000 Duration: 8,0 ms
Method3 Count: 9000 Duration: 8,0 ms
Method3 Count: 9000 Duration: 14,0 ms

01.06.2016 - 19:46 Uhr

Hallo,

probier mal ob du mit der Timer-Komponente (Windows.Forms.Timer) zurecht kommst. (hier kleines Tutorial dazu http://www.c-sharpcorner.com/UploadFile/mahesh/C-Sharp-timer/)
Dieser löst immer ein Ereignis aus wenn die eingestellte Zeit abgelaufen ist.

Gruß
Steffen

17.02.2016 - 21:24 Uhr

Hier ein kleines Beispiel.

Zum Bearbeiten der Resourcen eignet sich z.b. ResX Resource Manager: http://resxresourcemanager.codeplex.com

04.02.2016 - 08:30 Uhr

Hallo,

ich glaube ihr habt ihn falsch verstanden.

@NervousElk: Willst du einen HIL-Simulator schreiben?

03.02.2016 - 10:13 Uhr

Hallo,

ich habe es mittlerweile gelöst.
Ich habe einfach das ganze ugedreht. Die Logik ist in eine eigene DLL-Assembly gewandert und wird von der Exe aufgerufen.
So funktioniert auch der Installer ohne Probleme.

Gruß
steffen

18.01.2016 - 10:31 Uhr

Hallo,

ich habe einen Windows-Dienst entwickelt. Dieser hat auch einen ProjectInstaller (mit ServiceInstaller und ServiceProcessInstaller).

Für die Installation habe ich ein Setup Projekt angelegt und als CustomAction die Assembly ausgewählt (als InstallerClass). So hat alles soweit funktioniert.

Ist es möglich den ProjectInstaller in eine extra dll auszulagern?
Nach dem ersten Test, installiert er einen Dienst und verweist auf diese DLL anstatt auf die EXE Datei.

Hat jemand eine Idee wie es gehen könnte?

Danke, Gruß
Steffen

15.01.2016 - 19:51 Uhr

Hallo,

du kannst auch die PictureBox in ein Panel reinlegen und dann hinausschieben...


private void button1_Click(object sender, EventArgs e)
{
    pictureBox1.Top -= 10;
}

private void button2_Click(object sender, EventArgs e)
{
    pictureBox1.Top += 10;
}

private void button3_Click(object sender, EventArgs e)
{
    pictureBox1.Left -= 10;
}

private void button4_Click(object sender, EventArgs e)
{
    pictureBox1.Left += 10;
}

Die Picturebox kannst dann auf "SizeMode=Autosize" stellen.
Dann kannst Du noch die Größe von dem Panel extra ändern (Width und Height). (D.h. der Bildausschnitt wird größer).

09.01.2016 - 12:47 Uhr

Hallo,

ich würde Dir raten eine abstrakte Klasse "Medium" zu implementieren.
siehe https://msdn.microsoft.com/de-de/library/sf985hc5.aspx

z.B:


    internal abstract class Medium : IMedium
    {
        public string Name { get; set; }

        public int Length { get; set; }

        public int ReleaseYear { get; set; }

        public IList<IAttribut> Attributs { get; }

        public Medium(string name, int length, int releaseYear)
        {
            Attributs = new List<IAttribut>();
            Name = name;
            Length = length;
            ReleaseYear = releaseYear;
        }
    }

CD/DVD-Klasse wäre dann viel schlanker:


       namespace CD_DVD_Libary
{
    internal class CD : Medium
    {
        public CD(string name, int length, int realeaseYear) : base(name, length, realeaseYear)
        {
        }

        public override string ToString()
        {
            return string.Format("CD Name={0} Length={1} ReleaseYear={2}", Name, Length, ReleaseYear);
        }
    }
}


namespace CD_DVD_Libary
{
    internal class DVD : Medium
    {
        public DVD(string name, int length, int releaseYear) : base(name, length, releaseYear)
        {
        }

        public override string ToString()
        {
            return string.Format("DVD Name={0} Length={1} ReleaseYear={2}", Name, Length, ReleaseYear);
        }
    }
}

Ich sehe im Moment noch nicht den Sinn und Zweck die CD/DVD-Klasse extra zu implementieren die identisch sind außer der Klassen-Name.
Man könnte in der Medium Klasse einfach noch einen "Typ" als Enum definieren (mit CD, DVD als EnumValues).

Sonst wird sicherlich noch einiges von den anderen kommen. (z.b. Trennung Logik und UI (Console)).

Gruß
Steffen

02.01.2016 - 22:49 Uhr

Hallo niesel,

ich denke dass es daran liegt dass Du in der Spalte "Preis" einen String ablegst und kein double/decimal... d.h. mach das ".ToString()" weg dann wird es vielleicht funktionieren.

Gruß
steffen

28.09.2015 - 20:11 Uhr

Hallo,

vielleicht kannst Du was von einem Splashscreen abschauen, hier ein Beispiel:
http://www.codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C

Grüße
Steffen

23.09.2015 - 18:25 Uhr

Hallo Marcel,

bei einer Async Methode werden im Falle eines Fehlers immer eine AggregateException geworfen. Die eigentliche Ursache steckt aber in der InnerException der AggregateException:

Beispiel ungetestet:


try
{
    loadFromDownloadDirToURL(...);
}
catch (AggregateException ex)
{
    MessageBox.Show(ex.InnerException);
}

D.h. schau mal in die InnerException ob du da mehr Infos rauslesen kannst...

Grüße
Steffen

10.09.2015 - 14:54 Uhr

Hallo,

wenn deine gelesenen Bytes einfache ASCII-Zeichen sind, dann so ausgeben:


Console.WriteLine(Encoding.ASCII.GetString(header));

Oder willst Du den Rest von fsSource nach dem Header anzeigen?

27.07.2015 - 15:13 Uhr

Hallo,


datatMiete.Rows.Add(row);

ist überflüssig, meiner Meinung nach, tut "DataRow row = datatMiete.NewRow();" bereits eine leere Row anlegen.

07.07.2015 - 07:57 Uhr

Hallo,

wieso gehst Du überhaupt den Umweg über einen Timer?
SerialPort hat doch ein Event "DataReceived" welches ausgelöst wird wenn neue Daten anliegen:
https://msdn.microsoft.com/de-de/library/system.io.ports.serialport.datareceived%28v=vs.110%29.aspx
Da gibt es auch ein Beispiel...

Viel Erfolg.

06.06.2015 - 11:34 Uhr

Hallo gigagames,

interessante Aufgabe.
Die Bilder können auch frei gedreht sein?

Ich würde so rangehen:

  • Kantenbild (binär) erstellen (z.B. mit Emgu-CV)
  • Von jedem Bild den Rand (oben, rechts, unten, links) jeweils als Byte-Array extrahieren
  • Nun die Ränder miteinander vergleichen und das best passende finden
  • Merke die Bilder die an zwei Seiten keinen Partner haben (Ecken)
  • Nun ein Eck-Bild an die erste stelle hinlegen und dann nacheinander alle passenden Bilder positionieren.

Es kann dann natürlich sein dass das zusammengesetzte Bild insgesamt verdreht ist, dass kann man nicht so einfach bestimmen wie rum das Bild gedreht gehört. Wenn aber die Bilder nicht verdreht sein können dann ist es noch einfacher.

Viel Erfolg dabei 😉

14.04.2015 - 19:19 Uhr

Hallo,

es gibt auch eine Möglichkeit den Index im Array abzufragen:


Label[] test = new Label[4];

for (int i = 0; i < test.Length; i++)
{
   test[i] = new Label();
}

int index = Array.IndexOf(test, test[2]);
09.04.2015 - 11:20 Uhr

Hallo, hier mein Vorschlag (nicht getestet!)


public static void read_grp()
{
    const string Filename = @"C:\tmp\test2.grp";
    string line;
    string newFilename = "test";

    using (StreamReader r = new StreamReader(Filename))
    {
        while (!r.EndOfStream)
        {
            try
            {
                line = r.ReadLine();

                if (string.IsNullOrWhiteSpace(line))
                {
                    // Leerzeile überspringen, nächste Zeile einlesen
                    continue;
                }

                if (line.StartsWith("[") && line.EndsWith("]"))
                {
                    // Gruppennamen als Dateiname verwenden (ohne eckige Klammer)
                    newFilename = line.Substring(1, line.Length - 2);

                    // Ausgabekontrolle neuer Filename
                    Console.WriteLine("Dateiname: " + newFilename);
                }
                else
                {
                    // Abschneiden Reststring nach '|'
                    line = line.Substring(0, line.IndexOf('|'));

                    // Abschneiden von 'Trackxxxx=' am Zeilenanfang // +1 damit auch das '=' gelöscht wird
                    line = line.Substring(line.IndexOf('=') + 1);

                    // Schreibe Zeile in neue Playlist
                    using (StreamWriter sw = File.AppendText(@"c:\tmp\" + newFilename + ".m3u"))
                    {
                        sw.WriteLine(line);
                    }

                    // Console.WriteLine("Dateiname: " + newfilename + Environment.NewLine + "Trackname: " + line); //Ausgabekontrolle
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
}
08.04.2015 - 07:52 Uhr

Hallo alexpj,

bitte beachte den Punkt 4 unter [Hinweis] Wie poste ich richtig?

Wo hängst Du den?

Eine Schleife hast Du doch schon (wo ReadLine aufgerufen wird). In dieser Schleife einfach vorher die Überschrift matchen, wenn zutreffend dann einen Dateinamen erstellen und gleich den streamwriter öffnen und bei der nächsten iteration die filenamen direkt reinschreiben.

06.04.2015 - 21:38 Uhr

Hallo,

hier ist es ganz gut beschrieben wie man an die Bild-Metadaten rankommt:
https://msdn.microsoft.com/de-de/library/xddt0dz7%28v=vs.110%29.aspx

Wenn das Erstell-Datum immer dem Aufnahmedatum entspricht dann kannst Du es auch nehmen. Dazu einfach eine Instanz von FileInfo erstellen und dann das Datum abfragen.

Viel Erfolg.

Kennst Du FreeFileSync?

06.04.2015 - 19:16 Uhr

Hallo alexpj und willkommen im Forum,

ich finde dass Regex hier fehl am Platz ist. Ein einfaches Substring wäre hier besser:


Console.WriteLine(line.Substring(0, line.IndexOf('|')));

Dein Pattern war schon richtig nur hast du die Falsche Methode verwendet:


line = Regex.Match(line, pattern).ToString();

Hier gibt es auch noch einen guten online Regex Tester: https://regex101.com

Gruß
Steffen

26.02.2015 - 18:07 Uhr

Hi,

mit Hilfe von diesen Properties solltest Du zum Ziel kommen:

https://msdn.microsoft.com/de-de/library/system.windows.forms.form.startposition%28v=vs.110%29.aspx
https://msdn.microsoft.com/de-de/library/ms159414%28v=vs.110%29.aspx

Es gibt leider keine Möglichkeit die StartPosition auf Random zu stellen... dies musst Du selbst implementieren.

Gruß
Steffen

04.01.2015 - 18:15 Uhr

Hallo Palin,

Ab dem Framework 4.5.1 gibt es die Möglichkeit den LOH Deffragmentieren zu lassen.

Hast Du vielleicht ein Link dazu?

Dies habe ich mich auch schon mal gefragt.

Gruß
Steffen

02.01.2015 - 00:56 Uhr

Hallo,

ich habe dieses hier schon mal verwendet:

Printing of DataGridView

Sicherheit ist unbekannt

05.12.2014 - 07:21 Uhr

Hallo herbivore,

vielen Dank damit hat es wunderbar geklappt. 👍

Kann es sein dass es bei Verknüpfungen auf dem Desktop ähnlich ist? Habe da auch die Vermutung dass das 32x32 Icon hochskaliert wird auf das große Symbol (48x48?).

Gruß
steffen_dec

04.12.2014 - 11:01 Uhr

Hallo,

ich habe ein Icon mit mehreren ImageTypes (16x16 8bit, 32x32 8bit, 48x48 8bit) angelegt und füge dieses in die ImageList eines Treeview ein:


treeView1.ImageList = new ImageList();
treeView1.ImageList.ImageSize = new System.Drawing.Size(16, 16);
treeView1.ImageList.Images.Add("Test", Properties.Resources.MyIcon);
treeView1.Nodes.Add("Test", "Test", "Test", "Test");

Das Treeview zeigt dann aber das Icon von 32x32 herunterskaliert auf 16x16.
Ich bin davon ausgegangen dass die Imagelist automatisch die richtige Größe verwendet!?

Hat jemand eine Idee wie man es lösen kann ohne jetzt ein eigenes kleines Icon erstellen zu müssen?

Danke! Gruß
Steffen

11.11.2014 - 21:29 Uhr

Hier habe ich damals noch mein Beispiel gepostet:

SharpZipLib - Multithreading Compress - Progress

10.11.2014 - 20:28 Uhr

Hallo,

hast Du dieses mal ausprobiert?

http://sevenzipsharp.codeplex.com/

Ich habe es schon mal erfolgreich einsetzen können.

26.10.2014 - 21:51 Uhr

Hallo spry64,

Du kannst doch über die CommandLine dann einen/mehrere Parameter übergeben:

ConsoleApplication.exe ipconfig IPv6

dann im Code entsprechend über die "args[]" zugreifen:


System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo(args[0]);
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;

p.Start();

string sOutput = p.StandardOutput.ReadToEnd();
p.WaitForExit();

string[] result = sOutput.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

foreach (string s in result)
{
    if (s.Contains(args[1]))
    {
        Console.WriteLine(s);
    }
}

// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();

wenn Du dann noch bestimmte CommandLine-Befehle implementieren willst dann empfehle ich dir einen CommandLine-Parser:
Parser für Kommandozeilenparameter (CommandLineArguments)

26.10.2014 - 15:28 Uhr

Hallo,

Hast Du es probiert eine Abhängigkeit beim Dienst einzustellen? Evtl. wird diese Abhängigkeit beim Herunterfahren ebenfalls berücksichtigt!?

Wie wäre es wenn du es als normale Applikation (Autostart) laufen lässt?

26.10.2014 - 14:43 Uhr

Hallo,

hast Du es mal mit einer Unterabfrage probiert?

sowas?


select * from triggers where OID not in (select Trigger_ID from trigger_done WHERE Username = "123")

26.10.2014 - 14:33 Uhr

Hallo,

ich habe Dir ein Beispiel geschrieben:



System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo("ipconfig", "/all");
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;

p.Start();

string sOutput = p.StandardOutput.ReadToEnd();
p.WaitForExit();

string[] result = sOutput.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

foreach (string s in result)
{
    if (s.Contains("IPv6"))
    {
        Console.WriteLine(s);
    }
}

// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();

Füge diesen code einfach in die Main-Funktion einer neuen ConsoleApplication.

23.10.2014 - 17:21 Uhr

Hallo,

Tust Du die Registry in einem Treeview anzeigen?

In einem Treeview musst Du nämlich nicht sofort alle Ebenen einfügen, ich würde da erst zwei Ebenen füllen und beim Öffnen einer Ebene dann die nächste Unterebene füllen...

Sonst mal mit treeview.BeginUpdate/EndUpdate testen

Oder mit einer Virtual Treeview testen:
Virtual Treeview Implementation

22.10.2014 - 17:34 Uhr

Hallo Programmierhans,

vielen Dank, Dein Hinweis hat mich zur Lösung geführt:


for (int i = dtCategories.Rows.Count - 1; i >= 0; i--)
{
       dtCategories.Rows[i].Delete();
}
NpAdapter.Update(dset, "categories");

Finde ich komisch dass mit Rows.Clear nicht funktioniert

Gruß
Steffen

22.10.2014 - 16:53 Uhr

verwendetes Datenbanksystem: PostgreSQL

Hallo Zusammen,

ich habe eine datengebundene Datagridview die eine Tabelle aus der Datenbank darstellt. Alle Änderungen (New, Edit und Delete) in der Datagridview werden schon korrekt in der Datenbank gespeichert.

Nun möchte ich eine Spezial-Funktion einbauen, diese muss vorher alle Datensätze aus der Tabelle löschen und dann neue Datensätze importieren. Import funktioniert schon, allerdings funktioniert das löschen noch nicht.

DGV wird so verbunden:


private NpgsqlDataAdapter NpAdapter;
private System.Data.DataSet dset = null;
private DataTable dtCategories = null;
private BindingSource bindingSource = new BindingSource();

dset = new DataSet("categories");
NpAdapter = new NpgsqlDataAdapter();

NpAdapter.SelectCommand = new NpgsqlCommand("Select * from categories ORDER BY cat_id", conn);
NpAdapter.Fill(dset, "categories");

dtCategories = dset.Tables["categories"];
bindingSource.DataSource = dtCategories;

dgvCat.DataSource = bindingSource;


das Löschen der Datensätze:


            //Alle vorher löschen
            dtCategories.Rows.Clear();
            bindingSource.ResetBindings(false);

            NpAdapter.Update(dset, "categories");

Die DGV erscheint dann leer, allerdings sind die Daten immer noch in der Datenbank. D.h. wenn ich das Formular schließe und erneut öffne sind die alten Daten immer noch da.

Was mache ich hier falsch?
Ich habe noch keine Erfahrung was das DataBinding angeht 🤔

Natürlich könnte ich auch ein SQL-Befehl zum löschen der Datensätze an die DB absetzen, ich wollte aber mit den bereits geöffneten DataAdapter/DataTable machen.

Danke für die Hilfe!
Steffen

09.10.2014 - 23:21 Uhr

hast Du da überhaupt reingeschaut?

This application demonstrates how a user can draw shapes and how hand writing recognition is performed in a XAML/C# Metro style app.

Es heißt doch nur dass es im Metro Style gemacht ist und WPF (XAML) verwendet wird... und Du willst doch in WPF dachte ich

Bei Codeproject gibt es sicherlich noch mehr ähnliches

08.10.2014 - 17:43 Uhr

Hallo,

hast Du schon mal danach gegoogelt?

Hier mein erster Treffer:
Metro Paint

24.09.2014 - 16:51 Uhr

vor paar Tagen gab es schon mal ein ähnliches Thema: Wie kann ich Button-BackgroundImages vergleichen?

24.09.2014 - 16:50 Uhr

Hallo,

ich mache es ähnlich wie Du mit der Übersetzung. Eine Rekursive Methode geht alle Controls durch und ändert das Control.Text auf die neue Sprache.

Bei mir gibt es keine nennenswerte Verzögerungen, wir haben auch recht viele Controls.
Es müsste also mit deinen Controls zu tun haben.

Du benutzt TableLayoutPanel mit Spalten die automatisch vergrößert werden? evtl. ist hier das Problem da bei jedem Resize von einem Control die Spalten neu angepasst werden. Wenn es wirklich so ist dann teste mal mit SuspendLayout/ResumeLayout von dem TableLayoutPanel.

Gruß
Steffen