Laden...

Forenbeiträge von roddy Ingesamt 42 Beiträge

06.08.2008 - 13:21 Uhr

Hallo,

ich habe es so probiert, wie hier beschrieben. Allerdings erhalte ich bei der Zeile mit dem CopyTo jedes Mal eine UnauthorizedAccessException ("Der Zugriff auf den Pfad \SERVER\ZEBRA" wurde verweigert). Der Benutzer der das Programm ausführt hat aber Zugriff auf den Printer.

Hab schon überlegt, ob ich die Adresse falsch angebe. Die beiden folgenden Codes führen zum gleichen Ergebnis:

tmpFile.CopyTo(@"\\SERVER\ZEBRA");
tmpFile.CopyTo("\\\\SERVER\\ZEBRA");

Wenn ich im Windows-Explorer (angemeldet als der Benutzer der auch das Programm ausführt) einfach \SERVER\ZEBRA eingebe, komme ich direkt zum Druckermonitor des Druckers, also denke ich eigentlich, dass die Freigabe funktioniert.

Hat jemand eine Idee, warum ich diese Exception bekomme?

03.03.2008 - 14:12 Uhr

verwendetes Datenbanksystem: MSSQL 2005

Hallo zusammen!

Ich muss innerhalb meines Programmes zwei Listen mithilfe von MSSQL vergleichen. Dabei habe ich eine Große-Mapping-Tabelle, in der in etwa so etwas drinsteht:


A_ID | B_ID
------------
1    | 1
1    | 2
2    | 1
2    | 2

In diesem Fall wären die Listen A=1 und B=2 identisch. Ich möchte nun identische Listen herausfinden. Mein erster Ansatz war anhand von CHECKSUM_AGG zu vergleichen:

SELECT A_ID, CHECKSUM_AGG(B_ID) AS ChkSum FROM BeispielTabelle GROUP BY A_ID

Dabei kommt nun in diesem trivialen Beispiel das folgende heraus:


A_ID | ChkSum
--------------
1    | 3
2    | 3

Ich habe also beide Listen verglichen und herausgefunden, dass beide gleich sind. Problem gelöst - könnte man meinen. Allerdings ist die CHECKSUM_AGG() Funktion nicht zuverlässig genug. Ich habe es (dummerweise) geschafft, zwei Listen zu erstellen, die unterschiedlich sind, aber identische Ergebnisse bei der CHECKSUM_AGG() Funktion haben.

Die MSSQL-Hilfe erklärt mir hierzu: "Wenn sich einer der Werte in der Liste mit Ausdrücken ändert, ändert sich gewöhnlich auch die Prüfsumme der Liste. Es besteht jedoch eine geringe Möglichkeit, dass sich die Prüfsumme nicht ändert. Aus diesem Grund wird nicht empfohlen, CHECKSUM für die Überprüfung auf geänderte Werte zu verwenden, außer es spielt für die Anwendung keine große Rolle, wenn gelegentlich eine Änderung nicht erkannt wird. Möglicherweise sollten Sie stattdessen HashBytes verwenden. Wenn ein MD5-Hashalgorithmus angegeben wird, ist die Wahrscheinlichkeit, dass HashBytes für zwei verschiedene Eingaben dasselbe Ergebnis zurückgibt, wesentlich geringer als bei CHECKSUM."

Soweit so gut, nun würde ich also gerne HashByte() anstelle von CHECKSUM() verwenden. Allerdings habe ich ja nicht genau einen Wert, sondern eine Liste von Werten. Also benötige ich eine Aggregatfunktion die für 2 verschiedene Listen sicher zwei verschiedene Ergebnisse herausbringt (eine Gödelisierung). Daher meine Fragen:

  • Kennt jemand eine Gödelisierungsfunktion die bereits in MSSQL enthalten ist?
  • Kennt jemand eine Stored Procedure die eine Gödelisierung in MSSQL vornimmt, die frei verwendbar ist?
  • Gibt es für HashByte() ebenfalls eine aggregierte Funktion? (so wie CHECKSUM_AGG() für CHECKSUM() - nur eben für HashByte())

Vielen Dank für eure Hilfe!

P.S.: Mir ist bewusst, dass dieses Forum sich eigentlich eher um C# als um MSSQL handelt. Kennt jemand ein vergleichbares Forum für MSSQL?

13.02.2008 - 16:20 Uhr

Identity_Insert geht immer nur auf einer Tabelle.

Ich kopier jetzt als Workaround alle Tabellen in neue Tabellen, dabei geht dann die Identity-Spezifikation verloren. Aber irgendwie wüsst ich doch gern, ob es nicht noch hübscher geht...

13.02.2008 - 15:58 Uhr

verwendetes Datenbanksystem: <MSSQL-Server 2005>

Hallo zusammen,

ich habe ein Problem auf das ich keine Lösung finde. Ich habe eine Tabelle mit IDENTITY auf der ID Spalte. Nun möchte ich die IDENTITY dauerhaft ausschalten, so dass in Zukunft die IDs wieder händisch mit eingegeben werden können.

Alles was ich dafür gefunden habe ist SET IDENTITY_INSERT OFF, aber das ist nur auf einer Tabelle gleichzeitig möglich, was mir nicht hilft, da ich das Problem auf mehreren Tabellen hab. Mit dem MSSQL Server Management Studio kann ich die Identity-Spezifikation ausschalten, aber ich würde es gerne per Skript lösen.

Hat jemand eine Idee, wie das gehen könnte?

13.02.2008 - 15:56 Uhr
  • sorry - wollte eigentlich einen Thread erstellen. Beitrag kann gelöscht werden
26.09.2007 - 15:43 Uhr

Alles klar, dankeschön!

26.09.2007 - 15:02 Uhr

Das verstehe ich nicht ganz. Wo soll ich "ISupportInitialize" implementieren? In meinem TreeView oder in dem Übergabewert, den der TreeView benötigt?

Und welchen Unterschied macht es ob ich sage

x = new x(y)

oder

x = new x()
x.y = y

?

Das kommt doch auf genau das selbe raus?

26.09.2007 - 14:56 Uhr

Hallo,

ich benutze eine abgeleitete TreeView-Klasse, deren Konstruktor einen Parameter übernimmt, der nicht null sein darf. In der InitializeComponentMethode steht dann in etwa so etwas:

this.treeView = new ModifiedTreeView(m_Object.Something);

Da "m_Object" nicht in InitializeComponent initialisiert wird führt das dazu, dass der GUI-Designer die Klasse nicht mehr öffnen kann. ("One or more errors encountered while loading the designer. The errors are listed below. Some errors can be fixed by rebuilding your project, while others may require code changes. The variable 'm_Object' is either undeclared or was never assigned.")

Da ich den GUI-Designer benötige ist das natürlich etwas unschön. Ich hätte es jetzt gerne, dass er unterscheidet zwischen Programmablauf und Designeraufruf. Ich habe es wie folgt probiert:


if(m_Object!=null){
    this.treeView = new ModifiedTreeView(m_Object.Something);
}
else{
    this.treeView = new ModifiedTreeView(null);
}

aber das akzeptiert der GUI-Designer auch nicht.

Eine Möglichkeit das zu umgehen wäre wenn ich in InitializeComponent irgendeinen "Dummy-Tree" initialisiere und diesen dann später überschreibe (nach der InitializeComponent Methode, so dass es nicht vom GUI-Designer aufgerufen wird). Das finde ich aber nicht besonders elegant.

Kennt jemand von euch eine Lösung für dieses Problem?

18.04.2007 - 18:27 Uhr

Jepp, das meinte ich mit "wertvolle Information". Wieder was gelernt...

18.04.2007 - 18:18 Uhr

Ui, wertvolle Information, danke! Was hab ich mich gewundert, dass Hashtables in C# im Gegensatz zu JAVA nicht generisch sind...

18.04.2007 - 18:09 Uhr

Mein Objekt ist einfach eine List<myClass>. Da ich nicht nur per Index drauf zugreifen will, sondern auch mit Strings hab ich den Thread hier gestartet. So wie es aussieht, muss ich dann wohl die List extenden und mit dieser Funktionalität versehen.

Danke für eure Beiträge!

18.04.2007 - 17:49 Uhr

Geht das nur mit this?

Ich hätte gerne sowas wie

String Names[int index]{ get; }

Aber wenn ich den Code wie oben schreibe, erhalte ich beim kompilieren den Fehler:

"Syntax error, bad array declarator. To declare a managed array the rank specifier precedes the variable's identifier. To declare a fixed size buffer field, use the fixed keyword before the field type."

18.04.2007 - 14:14 Uhr

Hallo,

ich fange direkt mit einem Beispiel an, was ich will:

Bei einer DataTable kann man z.B. mit

myDataTable.DataRows[0] auf eine besteimmte DataRow zugreifen. So ein Feld wie "DataRow" möchte ich nun auch implementieren, am besten in einem Interface.

Kann mir jemand sagen, wie das geht?

13.04.2007 - 14:12 Uhr

Erstmal danke für die Antwort!

Wie du das mit der Binding-Source meinst verstehe ich allerdings nicht ganz. Ich hatte dich so verstanden, dass ich über

myDataGridView.DataSource.Position die Position der DataGridView herausfinde. Aber es gibt keine Position unter DataSource. Und den Event finde ich auch nicht bei der DataGridView.

Kannst du mir da nochmal helfen?

12.04.2007 - 14:53 Uhr

Hallo,

ich hab ein kleines Problem. Ich habe zwei DataGridView's, die Synchron gehalten werden sollen. Wenn also in DGV1 eine Reihe ausgewählt wird, soll diese auch im DGV2 ausgewählt sein. Ist soweit kein Problem, ich geh einfach im zweiten die DataGridViewRows durch und setze Selected auf true oder false. Funktioniert auch soweit. Mein Problem ist nur, dass der kleine Pfeil im Rowheader nicht "mitwandert". Weiss jemand wie ich den manipulieren kann?

Darüberhinaus würde ich gerne automatisch zur ausgewählten Zeile scrollen. Weiss jemand, wie das geht?

26.03.2007 - 15:18 Uhr

Ah dankeschön. Das Thema hab ich gesehen, aber ich dachte damit wären die Avatare der Forenuser gemeint und hab gar nicht riengeschaut. Sorry 🙁

26.03.2007 - 10:53 Uhr

Original von Kabelsalat
Mit Visualstudio wird eine ziemlich umfangreiche Icon-Library mitgeliefert. Das ganze findet sich irgendwo im Visual Studio Installationsordner und ist als ZIP gepackt - der Dateiname ist mir leider entfallen.

Ich hatte die auch mal in den Fingern, erinner mich aber auch nicht mehr, wo dieses ZIP war. Kann da jemand helfen?

15.03.2007 - 19:43 Uhr

Vielen Dank!

15.03.2007 - 19:20 Uhr

Hallo,

ich möchte es möglich machen eine Farbe (die später im Programm dann aus der Klasse "Color" kommt) per XML-Datei einzustellen. Mein erster Gedanke war, die Farbinformation aus der XML-Datei auszulesen und dann so etwas wie das Folgende zu machen:

switch(colorString){
    case "Black":
        myColor = Color.Black;
        break;
}

Nun frage ich mich, ob es da auch in C# eine Methode gibt, die den Feldnamen der einem String entspricht rausgibt. So dass es dann evtl. so ähnlich aussehen würde:

myColor = Color.DieFunktionalitätDieIchSuche(colorString)

Gibt's da etwas, das das kann?

09.03.2007 - 13:52 Uhr

Ah okay, erst nachdenken dann posten... sorry

Ein Blick in den CodeSnippetManager verrät, dass er im falschen Verzeichnis sucht (warum auch immer...)

Problem gelöst.

09.03.2007 - 13:48 Uhr

Ihr kennt vielleicht die Funktionalität, dass man - wenn man in Visual C# ein Interface implementiert - am linken Rand des Interface-Namens auf "Implement Interface" klicken kann. Seit einiger Zeit erhalte ich wenn ich dies tue den folgenden Fehler:

"Code Snippet titled [Method Stub - Body] failed to load. Verify that refactoring snippets are recognized in the Code Snippet Manager and that the snippet files are valid on disk"

Früher ging's und ich komm nicht drauf, was ich verändert habe. Kennt jemand die Problematik?

Die Programm-Info zu meinem Visual Studio:

Microsoft Visual Studio 2005
Version 8.0.50727.42 (RTM.050727-4200)
Microsoft .NET Framework
Version 2.0.50727

Installierte Edition: Professional

Microsoft Visual Basic 2005
Microsoft Visual Basic 2005

Microsoft Visual C# 2005
Microsoft Visual C# 2005

Microsoft Visual C++ 2005
Microsoft Visual C++ 2005

Microsoft Visual J# 2005
Microsoft Visual J# 2005

Microsoft Visual Web Developer 2005
Microsoft Visual Web Developer 2005

Crystal Reports
Crystal Reports for Visual Studio 2005

EventToaster 1.0
PowerToy demonstrating how to respond to IDE events from a package.

IndexedFind 1.0
Finds strings in files using Microsoft Indexing Service.

SourceOutliner 1.0
Creates a tool window that provides an outline view of a source code file.

SQL Server Analysis Services
Microsoft SQL Server Analysis Services-Designer,
Version 9.00.2047.00

SQL Server Integration Services
Microsoft SQL Server Integration Services-Designer
Version 9.00.2047.00

SQL Server Reporting Services
Designer für Microsoft SQL Server Reporting Services
Version 9.00.2047.00

SuperDiff 1.0
Implements the WinDiff engine in a Visual Studio tool window.

VcCodeSnippets 1.0
Provides basic code snippet functionality while editing C++ code.

AnkhSvn Addin
AnkhSVN 1.0.0.2584
OpenSSL 0.9.8a
Neon 0.25.5
ZLib 1.2.3
Berkeley DB 4.4.20
Subversion 1.4.0
Ankh 1.0.0RC3
apr-iconv 0.9.7
apr-util 0.9.12
apr 0.9.12

27.02.2007 - 20:38 Uhr

Ich hab jetzt aus meinem Format

YYYY-MM-DD HH:MM:SS

das Format

YYYYMMDD HH:MM:SS

gemacht und jetzt gehts...

Danke für eure Hilfe!

27.02.2007 - 20:31 Uhr

Ich hab jetzt eine kleine Methode zur Konversion erstellt. Das Query sieht nun wie folgt aus:

INSERT INTO X VALUES('2007-02-27 20:30:09')

Wenn ich dieses Statement im Microsoft SQL Server Management Studio als Abfrage eingebe, funktioniert es. Wenn ich es aus meinem C#-Programm heraus schicke (jedes andere Update-/ oder Query-Statement hat mit meinem DB-Wrapper funktioniert) bekomme ich die folgende Exception:

{"The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value. The statement has been terminated."}

Woran kann das liegen?

27.02.2007 - 20:10 Uhr

Hallo,

ich möchte ein DateTime Objekt aus C# (z.B. DateTime.Now) in meine MSSQL2005 Datenbank speichern. Wenn ich nun etwas a la

"INSERT INTO BLA VALUES ( " + DateTime.Now +")""

bastel bekomme ich einen Fehler, nämlich:

"Incorrect syntax near '.2007'."

Hab mir das Query auch mal ausgeben lassen, da sieht das DateTime-Objekt dann wie folgt aus:

27.02.2007 19:31:27

Scheinbar ist das nicht das DateTime-Format, das mein SQL-Server mag. Ich könnte jetzt natürlich den String auseinanderfriemeln und neu zusammenbauen bis ihn der SQL-Server mag, aber ist das wirklich die Lösung? Gibt's da nicht was einfacheres, was ich übersehen habe?

27.02.2007 - 16:54 Uhr

Danke für die Antworten, jetzt hab ichs geblickt 🙂.

27.02.2007 - 14:56 Uhr

Ich hab ne allgemein Frage zum Thema OOP. Ich bastel gerade an einem größeren Programm, in dem ich gegen Interfaces programmieren will, damit Programmteile austauschbar sind. Nun handelt es sich bei diesen Programmteilen um Klassen, von denen es nur ein lebendes Objekt geben soll, also wollte ich im Interface vorgeben, dass es sich um ein Singleton handeln soll. Das geht nun aber nicht, da ich im Interface keine Methode

static GetInstance()

vorgeben darf. VisualStudio ist nicht so auskunftsfreudig, warum das so ist.

Kann mir jemand erklären, warum Interfaces keine statischen Methoden fordern dürfen?

11.01.2007 - 20:49 Uhr

Hallo zusammen,

ich bin grad mal wieder am abkotzen über die Unübersichtlichkeit der MSDN-Seite. Sowas grausames hab ich selten erlebt 🙂. Ich erinner mich, dass ich über irgendwelche verwinkelten Wege (oder eben Google) immer mal wieder zu einem Tutorial/Howto im Bereich der MSDN zu irgendeinem Thema in C# (Wie verwendet ich DataTables etc.) gekommen bin. Aber dabei hab ich nie dran gedacht, mir mal n Bookmark auf die Übersicht über die C#-Artikel dort zu setzen. Hat von euch jemand zufällig n passenden Link?

Danke schonmal im Voraus!

13.11.2006 - 17:53 Uhr

Ich will also dem Programm erzählen, dass die aktuell selektierte Node doppelgeklickt wird. dafür schreibe ich:

                TreeViewEventArgs arguments = new TreeViewEventArgs(this.SelectedNode);
                OnDoubleClick(arguments);

(Das ganze in einer Klasse, die vom TreeView erbt)

Ich hoffe, dass OnDoubleClick eben genau das aufruft, was standartmäßig aufgerufen wird, wenn der Benutzer doppelklickt. Aber so wie ich es oben geschrieben hab, passiert nichts. Wo ist mein Denkfehler?

13.11.2006 - 17:10 Uhr

Da ich eine Abwandlung von deinem LoadOnDemandTreeView verwende (danke hierfür!) funktionierts so leider nicht.

13.11.2006 - 16:56 Uhr

Hallo,

ich möchte bewirken, dass genau das passiert, was auch passieren würde, wenn man im TreeView auf eine Node doppelklickt. Ich vermute, dass das der TreeView.AfterSelect Event ist. Nun frag ich mich, wie es möglich ist, dem Programm mitzuteilen, dass dieser Event jetzt passiert bzw. ihm die Node mit der der Event passieren soll übergeben. Das müsste doch irgendwie möglich sein, aber ich finde dazu einfach nichts...

Hat da jemand ne Idee?

09.11.2006 - 19:42 Uhr

Scheinbar lag das gesamte Problem am Aufruf von "ExpandAll()". Die folgende Methode funktioniert jetzt:

        public void updateRightTreeView()
        {
            rightTreeView.BeginUpdate();
            rightTreeView.Nodes.Clear();
            rightTreeView.Nodes.Add(new TreeNode("TEST"));
            rightTreeView.EndUpdate();
        }
09.11.2006 - 19:15 Uhr

Leider hilft mir das nicht weiter, zum einen verstehe ich leider nicht alles, was dort steht und bekomme es auch nicht umgesetzt, zum anderen bin ich eigentlich relativ überzeugt davon, kein Threading zu benötigen. Ich möchte nicht immer wieder die TreeView ändern und das Programm darf ruhig hängen, während die TreeView geändert wird. Ich möchte nur, dass die geänderte TreeView angezeigt wird, nachdem die Änderungen abgeschlossen sind. Eigentlich denke ich, dass das doch nicht so schwer sein kann, aber stundenlange Suche hier, in der MS Knowledge-Base und auf Google hat mich nicht wirklich weitergebracht. Ist die TreeView-Klasse einfach nicht dafür gedacht, dass sich der Baum verändert?

Durch erweitern der entsprechenden Collections geht es auch problemlos (wenn auch langsam), einzelne Nodes hinzuzufügen und zu entfernen. Wenn sich die Collection ändert, schafft es das Programm den TreeView neu zu zeichnen (bzw. die hinzugefügte Node anzuzeigen) - ohne Threads und ohne irgendwelche besonderen Befehle. Daher will mir nicht in den Kopf dass es - scheinbar - unmöglich ist den kompletten TreeView neu anzuzeigen, noch dazu wo es in dem o.g. Beispiel geht.

Edit: Hab jetzt gerade noch in einem anderen Thread hier vom Befehl "Invalidate" gelesen und ihn auch ausprobiert. Theorethisch sollte er bewirken, dass die Oberfläche eines Steuerelements für ungültig erklärt wird und es neu gezeichnet wird. Also ist es - laut beschreibung - exakt der Befehl, den ich gesucht habe. Leider bewirkt das rufen von rightTreeView.Invalidate() oder rightTreeView.Invalidate(true) rein gar nichts. Kann sich das jemand erklären?

09.11.2006 - 17:17 Uhr

Hallo,

ich stehe gerade komplett auf dem Schlauch. Die Ausgangslage ist die folgende:

Ich habe einen Controller und eine GUI. In der GUI befindet sich ein TreeView, den ich updaten möchte. Dafür ruf ich in der GUI die Methode "updateRightTree":


            if (rightTreeView == null)
            {
                rightTreeView = new TreeView();
            }
            rightTreeView.Nodes.Clear();
            rightTreeView.Nodes.Add(new TreeNode("TEST"));
            rightTreeView.ExpandAll();

Das Problem was ich nun habe ist, dass der TreeView einfach leer angezeigt wird. Ich vermute, ich muss irgendeine Methode rufen, die dem TreeView sagt, dass er neu zeichnen soll, allerdings habe ich in der MSDN ein Beispiel gefunden, in dem das nicht notwendig ist (siehe hier). Mir ist überhaupt nicht klar, was ich anders mache, als in dem Beispiel (hab das Beispiel auch schon getestet, es funktioniert). Kann mir jemand Hinweise geben, wo ich den Fehler suchen sollte?

30.10.2006 - 20:48 Uhr

Hallo,

in JAVA hatte ich mal ein kostenloses Plugin für Eclipse, das während dem Programmablauf mitlief und dann Informationen rausgegeben hat, wie lang das Programm in welcher Methode unterwegs war. Weiss jemand von euch, ob es etwas vergleichbares (kostenloses) für Visual Studio und C# gibt?

12.10.2006 - 17:37 Uhr

Mit Hilfe eines Artikels hier:

http://www.magerquark.de/blog/index.php/archive/date/2006/06/

konnte ich das Problem nun lösen.

12.10.2006 - 17:00 Uhr

Eigentlich dürfte es aber doch kein Unterschied sein ob ich das inherited Form / geerbtes Formular aus einer DLL nehme oder aus einer C#-Datei in meinem Projekt, oder sehe ich da was falsch?

Ich hatte schon versucht das ganze als inherited Form die von meiner PapaGUI erbt zu implementieren (PapaGUI dabei als Klasse im Projekt). Allerdings führt das zum selben Fehler...

12.10.2006 - 16:44 Uhr

Danke für die schnelle Antwort!

Ich fürchte nur das passt nicht zu meiner Anforderung. Ich muss eben in der "PapaGUI" auf aktuelle Werte des Projekts zugreifen, das dürfte nicht funktionieren, wenn ich sie in einer Library "outsource"...

12.10.2006 - 16:33 Uhr

Erstmal danke, das hat mein Problem fürs erste gelöst, allerdings renn ich direkt in das nächste Problem...

Ich greife in meiner PapaGUI auf eine Methode aus einer statischen Klasse zu:


            this.label1.Text = MainClass.gimmeLabel();

Das funktioniert in der PapaGUI wunderbar, aber wenn ich die SohnGUI mit dem Designer öffnen will sagt er mir:

Object reference not set to an instance of an object.
Hide

at IFCC.referencing.projects.AbstractGUI.InitializeComponent() in PapaGUI.cs:line 342 (= das Codeschnipsel oben - teil der InitializeComponents()-Methode)
at IFCC.referencing.projects.AbstractGUI..ctor() in PapaGUI.cs:line 113 (= InitializeComponents())

12.10.2006 - 15:51 Uhr

Hallo zusammen,

ich möchte unter Benutzung von MS Visual Studio 2005 Forms vererben. Meine Vorstellung ist in etwa so:

PapaForm enthält das Grundgerüst, sowie den Bildschirminhalt in der oberen Hälfte des Bildschirms
SohnForm enthält einen Bildschirminhalt für die untere Hälfte des Bildschirms
TochterForm enthält einen anderen Bildschirminhalt für die untere Hälfte des Bildschirms

Dabei würde ich auch noch ganz gern den GUI-Designer von Visual Studio verwenden, allerdings tauchen hier die Probleme auf.

Wenn ich SohnForm schreibe:


namespace bla
{
    class SohnGUI : PapaGUI
    {
        public SohnGUI(Object blub)
            : base(blub)
        {
        }
    }
}     

...und mir das ganze dann mit dem GUI-Designer anschauen will, meldet Visual Studio "Constructor on type PapaGUI not found. Und das obwohl ich den namespace von PapaGUI unter using eingefügt hab.

Hat jemand eine Idee, was ich falsch mache? Oder gibt es prinzipielle Gründe, warum man GUIs nicht vererben sollte?