Laden...
Avatar #avatar-2860.gif
Benutzerbeschreibung

Forenbeiträge von tonka Ingesamt 373 Beiträge

05.08.2009 - 11:49 Uhr

Hallo,

ich stehe vor einem nicht all zu kleinen Problem. Ich muss Dateien einlesen, die mehrere NURBS Flächen enthalten und diese muss ich dann darstellen. Nun habe ich herausgefunden das WPF/XNA nur Polygone unterstützen, keine NURBS! Nun frage ich mich wie ich die NURBS nach WPF/XNA bringe. Ich muss diese dann ja folglich in Polygone konvertieren, bloß wie? Die NURBS stammen aus einem Berechnungsprogramm (nicht aus einem CAD wie Maya oder ähnliches), somit kann ich nur NURBS exportieren, keine Polygone.

Kennt jemand von euch eine Möglichkeit(en) NURBS in WPF/XNA darzustellen oder hat jemand von euch eine Kovertierungsformel zufällig rumliegen g???

MfG
Tonka

22.07.2009 - 16:22 Uhr

So, habs jetzt selbst geschafft.

Der folgende Code projiziert die vier Ecken eines UIElements auf ein anderes UIElement:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;


    public static class UIHelper
    {
        public static Boolean GetUIElementCornersRelativTo(UIElement Base,
                                                    UIElement RelativeTo,
                                                    ref Point TopLeft,
                                                    ref Point BottomLeft,
                                                    ref Point BottomRight,
                                                    ref Point TopRight,
                                                    ref String Message)
        {
            try
            {
                if (Base == null)
                {
                    throw new Exception("Base UIElement is null");
                }
                if (RelativeTo == null)
                {
                    throw new Exception("RelativTo UIElement is null");
                }

                TopLeft = Base.TranslatePoint(new Point(0, 0), RelativeTo);
                BottomLeft = Base.TranslatePoint(new Point(0, Base.RenderSize.Height), RelativeTo);
                BottomRight = Base.TranslatePoint(new Point(Base.RenderSize.Width, Base.RenderSize.Height), RelativeTo);
                TopRight = Base.TranslatePoint(new Point(Base.RenderSize.Width, 0), RelativeTo);

                Message = "OK";
                return true;
            }
            catch (Exception ex)
            {
                Message = ex.Message;
                return false;
            }
        }
        public static Boolean GetPointRelativTo(UIElement Base,
                                         UIElement RelativeTo,
                                         Point ToProjectPoint,
                                         ref Point Result,
                                         ref String Message)
        {
            try
            {
                if (Base == null)
                {
                    throw new Exception("Base UIElement is null");
                }
                if (RelativeTo == null)
                {
                    throw new Exception("RelativTo UIElement is null");
                }

                if (ToProjectPoint == null)
                {
                    throw new Exception("To project point is null");
                }

                Result = Base.TranslatePoint(ToProjectPoint, RelativeTo);

                Message = "OK";
                return true;
            }
            catch (Exception ex)
            {
                Message = ex.Message;
                return false;
            }
        }
    }


MfG
Tonka

20.07.2009 - 13:21 Uhr

Versteh nicht wie du das meinst. Hier ist ein Forum-Eintrag, wo es ums gleiche Thema gegangen ist und hier ist von FrameworkElement.transformToAncestor und FrameworkElement.transformToDescendant die Rede. Jedoch habe ich das Problem, das mein Image und mein Canvas auf der gleichen Ebene liegen!

MfG

20.07.2009 - 11:48 Uhr

Hallo,

gibt es eine Möglichkeit, die vier Ecken eines Controls auf ein darüberliegendes zu projizieren. Ich habe eine Image-Control und über diesem ist ein Canvas das aber größer als das Image-Control ist. Im Canvas zeichne ich ein Grid! Nun müsste ich aber wissen wo die Ecken des Image-Controls auf meinem Canvas liegen. Mit der Mouse geht das ja auch, gibt es hier irgendwas?

MfG
Tonka

11.07.2009 - 09:48 Uhr

Danke für das Tutorial, werd ich mir anschauen!

Ob ein 3D-Mesh für deinen Anwendungsfall jedoch sinnvoll ist weis ich nicht.
Kannst du nicht ein UniformGrid nehmen und da Rechtecke in verschiedenen Farben reinstecken?

Das mit dem Grid und den Rechtecken geht nicht, da ich viel zu viele Rechtecke (im Durchschnitt 1000x1000 pixel, die ich live strechen muss) habe und da WPF nicht mehr mitkommt! Beschäfftige mich schon eine ganze weile mit diesem Problem und ich habe echt schon vieles probiert. Das 3D-Mesh mach deshalb sind, da sowohl das verschieben, das Zoomen und vor allem die Abfrage der momentanen Position schon inkludiert sind und LIVE keine Probleme macht!

MfG
Tonka

09.07.2009 - 22:19 Uhr

keiner ne Ahnung?

09.07.2009 - 22:12 Uhr

Servus sharpType,

einen kleinen Tipp habe ich an dich. Da du offensichtlich mit dem AutomationInterface von CATIA V5 (oder schon V6 wie ich 😃 ) empfehle ich dir, nicht die COM-assemblys zu benutzten, sondern da ganze mit "Invoke" zu machen, wenn du einen Release-Wechsel hast, dann must du die Dlls ebenfalls neu kopieren (das kannst du sehen, wenn du dir die Version der DLL anschaust, da steht dann sowas wie 5.16.xxx für z.B. Release 16). Wenn du mit mehreren Release arbeiten musst, so benutzt ebenfalls Invoke, um dir sehr sehr viel Ärger zu ersparen!

MfG
Tonka

09.07.2009 - 22:07 Uhr

Hallo,

also ich hätts so geschrieben


Copy "$(TargetPath)" "$(TargetPath)../../Testprojekt/includes"

MfG

06.07.2009 - 20:20 Uhr

Hallo,

ich arbeite seit kurzem mit WCF. Ich möchte nun einen kleinen Chat-Server/Client bauen. Habe im Internet ein Beispiel gefunden. Die Oberfläche wurde da mit WinForms realisiert. Ich habe dies auf WPF umgeschrieben, um dies für meine Zwecke verwenden zu können. Soweit sogut, nun stehe ich vor dem Problem, das mein Client seine Konfiguration dynamisch per Code erhalten soll/muss und nicht per App.config file. Habe dazu passende Dinge mit Google gefunden, jedoch kann ich nicht alle Eigenschaften der Config Datei im Code anlegen.

Hier ist das Config-File vom Original Programm, das auch bestens funktioniert!


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint name="ChatEndPoint" address="net.p2p://chatMesh/ChatServer"
                binding="netPeerTcpBinding" bindingConfiguration="PeerTcpConfig"
                contract="ComCat.IChatService">        
      </endpoint>
    </client>

    <bindings>
      <netPeerTcpBinding>
        <binding name="PeerTcpConfig" port="0">
          <security mode="None"></security>
          <resolver mode="Custom">
            <custom address="net.tcp://MeinPc/ChatServer" binding="netTcpBinding"
                    bindingConfiguration="TcpConfig"></custom>
          </resolver>
        </binding>        
      </netPeerTcpBinding>
      <netTcpBinding>
        <binding name="TcpConfig">
          <security mode="None"></security>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

So, und hier mein Versuch es in Behind-Code zu übersetzten!


private void Login()
        {
            try
            {
                String UserName = Environment.UserName;
                NewJoin += new UserJoined(ChatClient_NewJoin);
                MessageSent += new UserSendMessage(ChatClient_MessageSent);
                RemoveUser += new UserLeft(ChatClient_RemoveUser);

                channel = null;
                this.userName = UserName;
                InstanceContext context = new InstanceContext(
                    new ComCatControl(this.userName));

                factory = new DuplexChannelFactory<IChatChannel>(context,
                                                                 new NetTcpBinding(SecurityMode.None),
                                                                 new EndpointAddress("net.tcp://MeinPc/ChatServer"));
                channel = factory.CreateChannel();
                IOnlineStatus status = channel.GetProperty<IOnlineStatus>();
                if (status == null)
                {
                    throw new Exception("Could not get OnlineStatus from channel");
                }
                status.Offline += new EventHandler(Offline);
                status.Online += new EventHandler(Online);
                [CSHARP]channel.Open();
                channel.Join(this.userName);
                TBMessageText.Focus();
            }
            catch (Exception ex)
            {
                Master.MessageManager.SendErrorMessage(ex.Message);
            }
        }

Ich bekomme dauernd eine Exception. Einerseits kann ich nicht das Property(IOnlineStatus) von der factory beziehen. Wenn ich dies auskommentiere, so bekomme ich ein "Wird vom sever nicht unterstützt"-Exception bei der Zeile

channel.Open();

Weiß hier jemand von euch Rat?

MfG
Tonka

30.06.2009 - 22:40 Uhr

Ich möchte ein Art Pixelbild aufbauen. Hinter jedem Pixel steck ein Wert, jedem Wert wird eine Farbe zugewiesen. Wenn ich mit der Maus über den jeweiligen Triagngle (eigentlich ja 2) fahre, so wird der Werte der hinter dem "Pixel" steckt ausgegeben. Das Zoomen und verschieben muss ebenfalls möglich sein, jedoch soll beim Zoomen keine Interpolation stattfinden, wie bei den normalen Bilder (habe schon viele Techniken probiert, doch entweder waren die zu rechenintensiv oder haben interpoliert). Das sollte mit so einem Mesh ja kein Problem sein.

Wie funktioniert das mit den Texturkoordinaten, könnest du mir das kurz erklären (oder einen Link schicken)?

MfG
Tonka

30.06.2009 - 16:11 Uhr

Hy@all,

ich versuche jetzt schon einige Zeit mein selbst erzeugtes Mesh einzufärben. Das ganze Mesh einzufärben geht ja wie folgt:


GeometryModel3D geo = new GeometryModel3D();
mg.Children.Add(geo);
DiffuseMaterial dm = new DiffuseMaterial(Brushes.LightGreen);
geo.Material = dm;

Ich habe meiner Model3DGroup(mg) ein GeometryModel3D(geo) zugewiesen. Dem geo füge ich dann ein Material bei, somit sind alle triangle die ich der geo zuordne Grün eingefärbt.

Ich müsste aber jedem Triangle eine Farbe einzeln zuweisen. Muss ich jetzt für jedes Triangle ein eigenes GeometryModel3D machen? Dies würde mir sehr umständlich erscheinen!

MfG
Tonka

16.06.2009 - 21:11 Uhr

Naja, eigentlich musst dir auslesen mit wieviel DPI (dots per inch) wpf deine objekte darstellt. Standardmäßig sind da glaub ich 96 dpi. Dann musst das einfach umrechnen => Details siehe WIKI

Hier findest du Beispiele für das Auslesen der DPI Website

Ich hoffe das hilft dir weiter!

MfG
Tonka

14.06.2009 - 21:14 Uhr

Hy,

du wirst in Windows nur dann nach dem Username und Passwort gefragt, wenn der in Windows angemeldet User keine Berechtigungen auf dem Netzlaufwerk besitzt ("nichtvorhandensein" des Users inklusive)!

ich habe bei mir das folgendermaßen gelöst: zu jedem Netzlaufwerk gibt es ja einen UNC-Pfad wie z.B. \meinserver.... oder ne IP \100.200.50.x....

Du kannst deinen Netzlaufwerksbuchstaben in einen UNC-Pfad umwandeln (das geht, das ist ein WIN32 Befehl, den ich grade nicht parat habe => einfach mal googlen).

Dann einfach die Impersonation (Doku-Link). Mit der Impersonierung kannst du mittem im code eine andere Identität annehmen.

Danach kopierst du deine Sachen auf den Pfad oder was immer du machen willst.

Danach musst du umbedingt die Impersonierung rückgängig mach (der Befehl heißt "undo"), sonst läuft dein Programm immer noch mit dem User weiter!

So habe ich das gelöst. Ich hoffe das hilft dir weiter!

MfG
Tonka

14.06.2009 - 12:39 Uhr

Hy,

hast du schon einmal versucht die Datei mit File.System.IO.Move(String Source, String Destination) zu verschieben? Vielleicht klappts ja mit dem richtig.

Alternative würde ich den Move Befehl selbst bauen, also zuerst ein copy und dann ein delete auf die Originalquelle!

Ich hoffe das bringt dich weiter!

MfG
Tonka

10.06.2009 - 09:25 Uhr

Hallo,

ich habe einen TreeView mit vielen Nodes Nun möchte ich dem User die Möglichkeit geben, den Inhalt des Treeviews aufzuskalieren so wie in Word2007. Also habe ich mir einen Slider eingebaut und mittels Binding auf den ScaleTransform angewendet. Jeodoch wird alles mitskaliert(was ja auch logisch ist), also auch z.B. der Rahmen wird dicker. Das TreeViewElement bricht aus seiner Grid-Position aus, sprich es verändert sein Grenzen!

Ich würde gerne den Inhalt, also den Text, Expander und Co. skalieren ohne den Rahmen und die Begrenzung mitzuskalieren.

Weiß jemand wie das geht?

MfG
Tonka

09.06.2009 - 20:31 Uhr

Hy,

sorry das ich so lange nicht geantwortet habe. Mir ist bis jetzt nicht gelungen, mich unter einem bestimmten Windows-Account in die SQL-Datenbank einzuklinken. Ich habe jetzt die Datenbank für alle Domain-Mitglieder freigeschalten - ist zwar nicht die Lösung aber vielleicht finde ich die irgendwann und dann kann ich sie implimentieren 😃.

Zur Impersonation : Die benutzte ich schon länger, um auf Netzlaufwerke schreiben zu können, und das unter einem anderen Benutzernamen! Würde sicher für die Datenbank auch gehen, ist mir aber ehrlich gesagt ein bisschen umständlich, denn ich möchte die Impersonation nur so kurz als möglich benutzten!

MfG
Tonka

05.06.2009 - 21:57 Uhr

Hallo Frank,

In dem CodeProject Artikel gibt es aber zwei Arten der Integration. Einmal über den WindowsFormHost und über Hwnd. Der Effekt tritt ja bei beiden auf!

Kennt irgendjemand eine Lösung für das Problem?

04.06.2009 - 21:32 Uhr

Hallo,

ich arbeite schon seit längerem mit AvalonDock (auf Codeplex zu finden). Ich muss nun ein OpenGL Control in die Dokumente einfügen. Nun habe ich bei CodeProject zwei Arten der Integration von OpenGL in WPF gefunden (OpenGL in WPF). Wenn ich nun so ein OpenGL Control in ein AvalonDock-Dokument stecke und ich das Dokument verkleinere, so überlappt das OpenGLControl ab dem Zeitpunkt, wo das eine Dokument hinter dem anderen verschwinden sollte, alles!

Wieso und warum geschieht das?

Hier ein Link zu einem GIF, das mein Problem verdeutlichen soll: GIF

MfG
Tonka

28.05.2009 - 14:06 Uhr

OK. Wenn ich

Integrated Security=True

im string beibehalte, scheint es so, als ob der User danach ignoriert wird, denn es wird immer der in Windows angemeldete Username benutzt!

28.05.2009 - 13:56 Uhr

Die Seite ist toll.

Ich habe nun den Teil

Integrated Security=True

entfernt. Somit wird dann die User Id benutzt. Jedoch bekomme ich jetzt immer Login failed, obwohl der User zu 100% die Berechtigung hat.

Weiß du da auch Rat?

MfG

28.05.2009 - 13:30 Uhr

verwendetes Datenbanksystem: <SQL 2005>

Hy,

ich versuche gerade mich über den LINQ-Datacontext-Connectionstring einen bestimmten User anzugeben, über den alle Abfragen ablaufen.

Mein Connectionstring sieht jetzt so aus:

"Data Source=SQL01Srv;Initial Catalog=DataTable04;Integrated Security=True;User Id=generaluser;Password=1234";

Da bei mir die Parameter über eine Optionsmenü kommen, übergebe ich den Connectionstring beim Instanzieren des DataContext's Object


db = new NorthwindDataContext(ConnectionString);

Das mit der DATA Source und dem Catalog funktioniert problemlos, bloß der User wird nicht angenommen, es wird immer der aktuell in Windows angemeldete Username benutzt.

Ich konnte leider nicht gescheites finden (was mich aber ehrlichgesagt wundert)!

Wie kann ich einen fixen User im Connectionstring angeben???

MfG
Tonka

25.05.2009 - 13:17 Uhr

Hallo,

ich versuche jetzt schon die ganze Zeit, meine GUI Multithreading-fähig zu machen. In WPF gelingt mir das, im Gegensatz zu den WinForms, nicht. Egal was ich mache, es funktioniert nicht. Eigentlich sollte das mit dem Dispatcher und der Invoke Methode ja keine Problem sein, funkt aber irgendwie nicht.

Ich habe viele LINQ abfragen (LINQ 2 SQL) und die dauern mitunter 10 bis 20 Sekunden. Ich möchte dem User zumindest anzeigen, dass das Programm nicht hängt, sondern einfach nur lädt.

Ich habe mir jetzt ein kleines Testprojekt gemacht und habe es diesem Beitrag als Anhang hinzugefügt, um zu zeigen, was hier nicht funktiniert. Egal ob ich die Methode Test() ohne ein Invoke ausführe oder mit Invoke, das Ergebnis ist immer ein einfrieren der GUI, bloß wieso??? Egal auf welche Art und weise ich das Invoke auch schreibe, es kommt immer zum Einfrieren!

Warum?

MfG
Tonka

18.05.2009 - 16:17 Uhr

Super. Jetzt funktionierts. Ich muss mich echt noch genauer mit den Lambda-Befehlen beschäftigen.

Viel viel Dank.

MfG
Tonka

18.05.2009 - 16:09 Uhr

deswegen

Fehler 5 "lambda-Ausdruck" kann nicht in den Typ "System.Collections.Generic.IEqualityComparer<LSM.DataBase.DbData>" konvertiert werden, da dies kein Delegattyp ist.

18.05.2009 - 15:57 Uhr

So, hab nun meinen Comparer Klasse gebaut, jedoch funkt das nicht so ganz. Mit google finde ich immer Beispiele, die aussehen wie meines.


public class CompanyComparer : IEqualityComparer<DbData>
        {
            #region IEqualityComparer<DbData> Member

            public bool Equals(DbData x, DbData y)
            {
                return x.Company.Equals(y.Company);
            }

            public int GetHashCode(DbData obj)
            {
                return obj.GetHashCode();
            }

            #endregion
        }

Aufruf des Comparer bei Distinct Funktion


var l = db.DbData.Distinct(new CompanyComparer ());
                if (l != null)
                {
                    foreach (DbData Line in l)
                    {
                        if (Line == null || Line.Company.Equals(""))
                        {
                            continue;
                        }
                        TreeViewItem item = new TreeViewItem();
                        item.Name = Line.Company;
                    }
                }

Bei der foreach bekomme ich dann die Exception, das die Überladung von IEqualityComparer nicht unterstützt wird.

Was mache ich bitte falsch???

MfG
Tonka

18.05.2009 - 15:24 Uhr

habs selbst gelöst. Damit der Counter funktioniert, muss man ein InsertOnSubmit und kein Attach.

MfG

18.05.2009 - 14:52 Uhr

verwendetes Datenbanksystem: <Linq to SQL>

Hallo,

versuche gerade den automatischen Counter in der Datenbank zu aktivieren, um meine ID-Nummer automatisch mitzählen zu lassen.

Ich habe nun meine Linq-Object aus meiner SQL Datenbank-Tabelle erstellt. Im SQL Tabellenblatt habe ich ID als primary Key und habe die Identifikationsspezifikation auf ja gesetzt, Startwerte 1, Weiterzählen 1.

So, nun habe ich mir eine kleine Testfunktion geschrieben, die mir ein paar Testdaten in die Tabelle speichert. Diese sieht wie folgt aus.


for(Int32 i = 0; i < 20; i++)
{
     DbLinqObject obj = new DbLinqObject();
     db.DbLinqObject .Attach(obj);
}
db.SubmitChanges();

DbLinqObject ... Linq- Object
db ... Linq-DataContext

Der Counter wird hier nicht weitergezählt! Ich denke, das kommt daher, weil das ja nur ein Objektinstanz selbst ist und nicht von der Datenbank zugewiesen. Jetzt frage ich mich wie ich das mit Linq richtig mache!

MfG
Tonka

18.05.2009 - 14:40 Uhr

Danke, werds mir ansehen!

18.05.2009 - 13:30 Uhr

verwendetes Datenbanksystem: <LINQ 2 SQL>

Hy,

ich arbeite seit kurzem mit Linq und "konvertiere" ein altes Programm auf Linq schreibweise um. Funktioniert auch soweit sehr gut. Ich suche jetzt eine Funktion (wenns die in LINQ überhaupt gibt), bei der man von eine Spalte alle Einträge ohne Duplicate bekommt.

z.B. für Firmen (siehe Anhang)

Ich könnte zwar alle Daten in ein Array kopieren und dann mit foreach aussortieren, jedoch wäre mir ein Linq-Befehl(e) lieber.

Ist das mit Linq möglich?

MfG
Tonka

17.05.2009 - 13:16 Uhr

Hallo,

@Taladan:

Insbesondere wenn du viele WPF elemente hinein lädst, verhackelt es sich scheinbar schnell und verwechselt das eine oder andere.

Arbeite schon seit längerem mit AvalonDock und ich habe sehr sehr viele WPF Elemente drinnen, hatte aber noch nie das Problem das irgendein Element verwechselt worden wäre! Aber wie du schon sagtest, is das ja schon ein Jahr her und bis heute liegen das so ca. 7 Versionen dazwischen.

@chrische5:
Wie ich gesehen habe, hast du schon deinen Beitrag im AvalonDock-Discussions-Forum eingeben. Wollte mal nachfragen ob dir das geholfen hat?

MfG
Tonka

07.05.2009 - 23:53 Uhr

Hallo,

danke für die antwort. Blöd das das svn-Protokoll nicht supported wird!

Der admin hat das uaf windows-user gestellt, hab das selbst gesehen. und danach haben wir die Berechtigungen für die einzelnen User gesetzt, hat aber nicht gefunkt!

Andere Iddee, wo das Prob. sein könnte?

MfG

07.05.2009 - 22:02 Uhr

Hallo,

ich habe ein Problem mit einem SVN-Server (in unserer Firma), im speziellen VisualSVN-Server. Bei mir zuhause nutzte ich svnserve auf einer Linux Maschine. Wenn ich mit dem Repo-Browser mein gewünschtes Repository ansurfe, so mache ich das mit der folgenden Adresse:


svn://MeinServer:MeinPort/svn/MeinRepository

Das funktioniert bei allen 5 Leuten, die bei meinem Home-SVN-Server mitarbeiten perfekt, ohne irgendwelche Probleme.

In unserer Firma haben wir VisualSVN von http://www.visualsvn.com/server/ (Muss ich nehmen, unsere Administratoren wollen nur Windows-Server). Wenn ich auf dem Server versuche, über den Repo-Browser die gleiche adresse(also die syntax) einzugeben, hängt sich der Browser einfach auf grrrr. Über http und https funktionierts, jedoch geht die Active-Directory Usererkennung nicht.

So nun meine Frage: Ich konnte bei VisualSVN nur eine Einstellung für http oder https finden, funktioniert da das svn Protokoll nicht? Hab jetzt schon den ganzen Tag versucht das hinzubekommen, jedoch hängt sich der Repo-Browser ständig auf!

Weiß hier jemand von euch Rat?

MfG
Tonka

07.05.2009 - 21:51 Uhr

OK. Sichern funktioniert jetzt. Jedoch hab ich jetzt eine anders Problem mit VisualSVN, das poste ich jedoch in einem neuen Thread, so wie sich das gehört 😃.

Danke für eure Antworten.

MfG
Tonka

06.05.2009 - 17:06 Uhr

ok, ich probiers mal!

06.05.2009 - 15:41 Uhr

Hallo,

naja, schon klar. Kenn aber leider keinen Befehl(e) in *.bat um alle Ordnernamen auslesen zu können.

Was mir einfällt wer eine TXT-Datei im gleichen Ordner wie die bat-Datei. In der TXT steht zeile für zeile welche Ordner ich sichern möchte.


echo off
title backup
cls
for /f %%i in (Reps.txt) do (
echo %%i
)

Jedoch ist das extrem umständlich, wenn ich ein neues Rep anlege.

Weiß du eine Lösung?

MfG
Tonka

06.05.2009 - 15:12 Uhr

Hallo,

wir haben seit geraumer seit SVN in Betrieb (mit VisualSVN Server). Nun möchten wir die Sicherung aller Repositories zu einem bestimmten Zeitpunkt auslösen.

In der Doku findet man dazu folgenden Befehl:


svnadmin hotcopy PathToRepository PathToBackupRep --clean-logs

Das mit clean logs und so verstehe ich, aber der Befehl funktioniert nur für ein repository. Gibt es irgendwie die Möglichkeit (mit svn direkt), alle Reps zu sichern???

MfG
Tonka

24.04.2009 - 18:46 Uhr

Danke. Manchmal sieht man vor lauter Bäumen den Wald kaum!

MfG
Tonka

24.04.2009 - 16:26 Uhr

Hy@all,

ich versuche gerade ein Event zu finden, bei dem ich mitbekomme, das sich der WindowState geändert hat. Hab aber bis jetzt leider nichts gefunden, was mich ehrlich gesagt wundert! Weiß jemand von euch ein Event das ich nutzten kann, Microsoft hat ja bei WPF leider scheinbar sowas nicht standardmäßig miteingebaut (oder ich bin zu blöd es zu finden 😉 ).

MfG
Tonka

17.04.2009 - 23:01 Uhr

Hallo,

ich seh das auch wie NeuroCoder => List<String> ist hier die beste Wahl. Als kleinen Tipp noch dazu, überprüfe bei deinem Code, ob das zurückgegebene Array der Funktionen GetFiles/GetDirectories nicht null ist, sonst könnte es einmal krachen wenn du in die foreach gehst!


private List<String> DateienZählen(string Verzeichnis)
{
     //hier sollten noch Kontrollen staffinden, ob der "Verzeichnis"-String nicht leer ist und ob das Directory existiert!!!
     List<String> erg = new List<String>();
     String[] Dateien = Directory.GetFiles(Verzeichnis);
     if(Dateien != null && Dateien.Length > 0)
     {
           foreach(String Datei in Dateien)
           {
                erg.Add(Datei);
           }
     }
     String[] UnterOrdner = Directory.GetDirectories(Verzeichnis);
     if(UnterOrdner != null && UnterOrdner.Length > 0)
     {
           foreach (string dir in UnterOrdner)
           {
                 List<String> SubDateien = DateienZählen(dir);
                 if(SubDateien != null && SubDatein.Count > 0)
                 {
                          erg.AddRange(SubDateien);//bei der Zeile bin ich mir nicht sicher ob das so geht. hab keinen compiler "zur hand"! sonst musst du dateien einfach wieder per foreach der List adden!
                  }
           }
      }
     return erg;
}

MfG
Tonka

16.04.2009 - 22:22 Uhr

Also wenns nur für "Normalos" ist, dann würde ich das über die Berechtigungen spielen. Firefox kopiert ja irgendwo die plugins hin => einfach mal probieren, das Schreibrecht in diesem Ordner zu sperren. Man kann sicher den Pluginordner in den Options umstellen, aber für die "Normalos" müsste das reichen. Gegen den Portable Firefox bist vermutlich ziemlich machtlos!

MfG
Tonka

16.04.2009 - 20:53 Uhr

Hallo,

also mit google hab ich schon etwas gefunden. Laut dieser Forumdiskusion ist es nicht oder nur sehr beschränkt möglich!

MfG
Tonka

22.03.2009 - 14:41 Uhr

hy SeeQuark,

sehr interessant, da hast du dann natürlich recht. Das ist gut zu wissen 😃! DANKE für die Info!

MfG
Tonka

22.03.2009 - 13:57 Uhr

Hy,

Es reicht nicht, wenn du das KeyDown event von deiner Form abfängst, du musst von all deinen Controls(wie z.B. Textbox, Combobox und co) das KeyDown(oder Keyup) -Event abfangen und auf Escape prüfen. Das Problem ist sonst, das wenn der Focus z.B. auf einer Textbox liegt, nur das keydown-event der textbox gefeuert wird, und nicht die des Forms.

Das geht mit einem recht einfachen Stück Source-Code der wie folgt aussieht:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.KeyDown += new KeyEventHandler(Line_KeyDown);
            SetKeyDownEvent(this.Controls);
        }

        private void SetKeyDownEvent(System.Windows.Forms.Control.ControlCollection col)
        {
            if (col == null || col.Count <= 0)
            {
                return;
            }
            foreach (Control Line in this.Controls)
            {
                SetKeyDownEvent(Line.Controls);
                Line.KeyDown += new KeyEventHandler(Line_KeyDown);
            }
        }

        void Line_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }
        }
    }
}

Ich hoffe das hilft dir weiter.

MfG
Tonka

21.03.2009 - 12:58 Uhr

Hallo,

schau dir AvalonDock an. Einfach Source-Code downloaden und mal anschaun!

MfG
Tonka

13.03.2009 - 10:59 Uhr

Hallo camelord,

also ich würd das ein kleines bisschen anders realisieren.

Du braucht für deinen beiden Berechnungsmethoden scheinbar immer den "Namen". Deine erstes Plugin braucht nur den Namen, das zweit den Namen + Parameter.
Ich würde bei deinem Interface die die Methode so implimentieren.


bool CreateNewCategory(string theName, object args); //kannst natürlich statt des Object auch deine Parameterklasse hinschreiben, mit Object wäre es ein bisschen flexibler

Du kannst ja kontrollieren ob das args object vom richtingen Typ ist...


if(args is MeinKlasse)
{
    //Berechnung
}

Wenn das args Objekt "null" ist, so gibt es einfach keine Parameter!

MfG
Tonka

09.03.2009 - 22:05 Uhr

So, habs jetzt endlich selbst gelöst.

Ich ändere die Zwischenspeichertaktik. Ich merke mir das geclonte Object als Backup (und nicht wie bisher, das geclonte Object zum bearbeiten nehmen) und arbeite derweile am aktuellen Object weiter, wenn der User nun abbrechen klickt, so werden die Backups (die geclonten Objecte) wieder zurückkopiert. Das funktioniert jetzt prima.

Danke nochmal!

MfG
Tonka

09.03.2009 - 21:41 Uhr

So, hab jetzt lange gebraucht, bis ich das Problem entdeckt habe, jedoch find ich nach Stunden der Probiererei keine Lösung.

zu meinem Problem:
Ich habe eine GUI. Diese GUI enthält ein IOption Object. Mittels Load-Methode wird diese geladen und die Textboxen un Co mit den Daten gefüttert.

Vom Optionsfenster wird das laden folgendermaßen ausgeführt:
Ich besitzte eine Klasse, die das aktuelle IOption Object des jeweiligen Plugins gespeichert hat. Nun Clone ich das aktuelle Object und lade dies in die GUI (mittels load Methode, siehe zweiter Code-Snippet)


// gesamten Code siehe Post 1
IOption NewOption = null;
                        String Message = "";
                        if (Line.GetClone(ref NewOption, ref Message) == false) //hier wird der Clone des aktuellen IOption-Objects erstellt
                        {
                            Master.MessageManager.SendErrorMessage(Message);
                            continue;
                        }

                        if (Line.Addin.Instance.Option.Load(NewOption, ref Message) == false) // neues Optionsobjekt wird in die GUI geladen
                        {
                            Master.MessageManager.SendErrorMessage(Message);
                        }

Die GUI load Methode sieht so aus:


public bool Load(object obj, ref string Message)
{
if (obj == null)
                {
                    throw new Exception("Option is empty");
                }

                if (!(obj is TestAddin01OptionsObject))
                {
                    throw new Exception("Option is not from Type \"TestAddin01OptionsObject\"");
                TestAddin01OptionsObject act = (TestAddin01OptionsObject)obj;
                _Options = act; // hier wird das übergeben Objekt gespeichert und genau hier ist das Problem!
                _IsLoading = true;
                TBMain.Text = act.FilePath;
                CBMain.IsChecked = act.IsCheckOK;
                act.HasModified = false;

                Message = "OK";
                return true;
            }
            catch (Exception ex)
            {
                Message = ex.Message;
                return false;
            }
            finally
            {
                _IsLoading = false;
            }
                }

in der Zeile ...


_Options = act;

... ist das Problem. Denn wenn ich das neue Objekt zuweise, so wird vom Plugin (Line.Addin.Instance.Option) ebenfalls das Object auf das neue (geclonte Object, das ich extra vorher geclont hab, um sowas zu verhindern) gesetzt. Somit hab ich eine Schleife => Warum?. Ich arbeite schon Stunden daran das zu unterbinden, aber irgendwie funktiniert keiner meiner Ansätzte.

Hast du eine Idee wie man das unterbinden kann? Ich bin echt schon am verzweifeln!

MfG
Tonka

08.03.2009 - 20:55 Uhr

Hallo,

ich bin gerade dabei, ein dynamisches Optionsmenü zu gestalten. Mein Programm basiert auf einem Pluginsystem und das funktioniert prima. Jetzt möchte ich, das jedes Plugin,wenn der Author das so möchte, ein Optionsmenü mitladen kann. Das Interface und co zu laden habe ich alles schon fertig, ich habe nur ein Problem mit den Objekten selbst. Geladen werden nur Objekte, die das Interface IOption und ICloneable besitzten. Das funktioniert auch.

Szenario: Wenn der User das Optionsfenster öffnet, so erstelle ich beim öffnen des Window (WPF) von jedem Plugin-Optionsobject (IOption, ICloneable) einen Clone und lade diesen in die einzelnen Controls der Optionen. Nun kann der User seine Optionen so ändern wie er es möchte. Wenn der User abbricht, so werden die alten Obtionsobjekte geladen (werden beim Clone zwischengespeichert). Wenn der User auf OK klick, so werden die neuen (die geclonten) Objekte über die alten Objekte überschrieben und als xml gespeichert.

Mein Problem: Trotz des geclonte Objekts werden die Änderungen in die Original Objekt mit reingeschrieben, aber warum? Sonst funktioniert das Clonen immer prima, hier aber nicht!

Hier jetzt der Code (Ausschnitte) des Option-Window selbst:


...
        private void Window_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) //wenn das Fenster sichbar wird, sollen Backups der aktuellen Optionsobjekte gemacht werden
        {
            if (this.IsVisible)
            {
                if (AddinsWithOptions != null && AddinsWithOptions.Count > 0)
                {
                    foreach (AddinOptionStatePackage Line in AddinsWithOptions)
                    {
                        if (Line == null)
                        {
                            continue;
                        }
                        IOption NewOption = null;
                        String Message = "";
                        if (Line.GetClone(ref NewOption, ref Message) == false) //hier wird der Clone des aktuellen Object erstellt
                        {
                            Master.MessageManager.SendErrorMessage(Message);
                            continue;
                        }

                        if (Line.Addin.Instance.Option.Load(NewOption, ref Message) == false) // neues Optionsobjekt wird in die GUI geladen
                        {
                            Master.MessageManager.SendErrorMessage(Message);
                        }
                    }
                }
            }
        }
...

Das Propertie "AddinsWithOptions" ist eine List<AddinOptionStatePackage> beinhaltet das "alte" und das geclonte Optionsobjekt jedes einzelnen Plugins.
Die Klasse "AddinOptionStatePackage" beinhaltet das Plugin (hier Addin genannt) + deren Optionsobjekt und das neue Objekt, das in die GUI geladen wird (siehe load methode)

Hier nun der Code der AddinOptionStatePackage-Klasse:


    public class AddinOptionStatePackage
    {
        #region Properties

        private AvailableAddin _Addin = null;
        public AvailableAddin Addin
        {
            get { return _Addin; }
            private set { _Addin = value; }
        }

        private IOption _NewOption = null;
        public IOption NewOption
        {
            get { return _NewOption; }
            private set { _NewOption = value; }
        }

        #endregion

        #region Constructor

        public AddinOptionStatePackage(AvailableAddin Addin)
        {
            try
            {
                if (Addin == null || Addin.Instance == null || Addin.Instance.Option == null || Addin.Instance.Option.MainInterface == null || Addin.Instance.Option.Options == null)
                {
                    throw new Exception("One of the Addin Options is empty");
                }
                if (!(Addin.Instance.Option.Options is ICloneable))
                {
                    throw new Exception("The Addin Option must be ICloneable");
                }
                this.Addin = Addin;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        #endregion

        #region Methods

        public Boolean GetClone(ref IOption Result, ref String Message)
        {
            try
            {
                if (!(this.Addin.Instance.Option.Options is ICloneable))
                {
                    throw new Exception("The Addin Option must be ICloneable");
                }
                ICloneable c = (ICloneable)this.Addin.Instance.Option.Options;
                Object Clone = c.Clone();                
                if (!(Clone is IOption))
                {
                    throw new Exception("Clone has to be from type IOption");
                }
                Result = (IOption)Clone;
                if (Result == null)
                {
                    throw new Exception("Could not clone Options");
                }
                NewOption = Result;
                Message = "OK";
                return true;
            }
            catch (Exception ex)
            {
                Result = null;
                Message = ex.Message;
                return false;
            }
        }

        #endregion
    }

Troz des Clones übertragen sich die Änderungen in der GUI sich in das Original Ojekt, obwohl das in der GUI gespeicherte Objekt ein geclontes ist. Der Clone wird mit der Methode "MemeberwiseClone" erledigt. Woran kann das liegen???

MfG
Tonka

07.03.2009 - 12:07 Uhr

Hallo,

ich versuche gerade ein Event, das von einem TreeViewItem ausgelöst wird mittels TreeView(also der Parent) zu übernehmen. Das Event heißt "ItemActivated" und kommt au meiner Klasse "TreeViewItemExtended" die ich einfach von "TreeViewItem" abgeleitet habe. Dort habe ich dann die Deklaration für das Event gemacht! Das Event benutzt die Bubble Technologie. Wie ich jetzt schon oft gelesen habe, wird beim "bubblen" das Event bis zum Parent durchgeroutet, was bei mir nicht wirklich funktioniert, aber wieso? Mein Ziel ist es, das ich beim TreeView das Event bekommt, egal welches Item es ausgelöst hat!

TreeViewItemExtended


public class TreeViewItemExtended : TreeViewItem
    {
        #region Own Events

        public event RoutedEventHandler ItemActivated
        {
            add { AddHandler(OnItemActivated, value); }
            remove { RemoveHandler(OnItemActivated, value); }
        }
        public static readonly RoutedEvent OnItemActivated =
            EventManager.RegisterRoutedEvent("ItemActivated",
                                             RoutingStrategy.Bubble,
                                             typeof(RoutedEventHandler),
                                             typeof(TreeViewItemExtended));

        #endregion

        #region Constructor

        public TreeViewItemExtended()
            : base()
        {
            this.KeyDown += new System.Windows.Input.KeyEventHandler(TreeViewItemExtended_KeyDown);
            this.MouseDoubleClick += new System.Windows.Input.MouseButtonEventHandler(TreeViewItemExtended_MouseDoubleClick);
        }

        #endregion

        #region Events

        void TreeViewItemExtended_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            RaiseItemActivatedEvent();
        }

        void TreeViewItemExtended_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key == System.Windows.Input.Key.Enter)
            {
                RaiseItemActivatedEvent();
            }

        }

        #endregion

        #region Methods

        private void RaiseItemActivatedEvent()
        {
            RoutedEventArgs e = new RoutedEventArgs();
            e.RoutedEvent = OnItemActivated;
            e.Source = this;
            RaiseEvent(e);
        }

        #endregion

So hätt ich es gern, beim TVMain TreeView wird das Event zur Methode verlinkt!


<tvctrl:TreeViewExtended Name="TVMain" Grid.RowSpan="2" Margin="0,9,0,0" ItemActivated="TVIEnvGeneral_ItemActivated" >
            <tvctrl:TreeViewItemExtended Header="Environment">
                <tvctrl:TreeViewItemExtended Header="General"  />
            </tvctrl:TreeViewItemExtended>
        </tvctrl:TreeViewExtended>

Weiß jemand von euch wie ich das realisieren kann?

MfG
Tonka

06.03.2009 - 13:50 Uhr

Hy@all,

ich arbeite gerade mit der SharpZibLib und versuche ganze Ordner samt Unterordner und aller Files in das zip zu speichern (nur der Inhalt des Ordners, der Ordner selbst soll nicht gepsiechert werden). Das zippen funktioniert ohne Probleme, nur beim entzippen (extract) bekomme ich immer eine Fehlermeldung...

Size mismatch: 4294967295;20 <-> 17;20

Schema siehe Bild!

Es soll z.B. der Inhalt des Ordners "D:\Bilder2" gezippt werden. Das funktioniert auch prima, beim entpacken kommt aber ein Exception

Hier der Code zum zippen:


private Boolean CreateZipFile(string zipFileStoragePath
            , string zipFileName
            , string Password
            , String Dir,
            ref String Message)
        {
            try
            {
                String BaseDir = Dir;
                List<String> Paths = null;
                if (FindFiles(BaseDir, ref Paths, ref Message) == false) // eine Methode, die alle Dateipfade eines Ordner ermittelt (rekuriv)
                {
                    throw new Exception(Message);
                }

                if (Paths == null || Paths.Count <= 0)
                {
                    throw new Exception("No Files in Directory");
                }

                ICSharpCode.SharpZipLib.Checksums.Crc32 crc = new ICSharpCode.SharpZipLib.Checksums.Crc32();

                ZipOutputStream s = new ZipOutputStream(File.Create(zipFileStoragePath + zipFileName));

                s.SetLevel(6); // 0 - store only to 9 - means best compression

                foreach (String file in Paths)
                {
                    FileStream fs = null;
                    try
                    {
                        fs = File.OpenRead(file);

                        byte[] buffer = new byte[fs.Length];

                        fs.Read(buffer, 0, buffer.Length);

                        if (file.StartsWith(BaseDir) == false) // Die Datei muss mit den angegebenen Ordnernamen anfangen, sonst Error
                        {
                            throw new Exception("Fullname start not with BaseDir-Name");
                        }
                        String FilePath = file.Remove(0, BaseDir.Length); //Der Pfad muss auf die relative angabe gekürzt werden, sonst werden bei tieferen Ordnerstrukturen alle Ordner bis zur Wurzel mit übernommen
                        if (FilePath.StartsWith(@"\"))
                        {
                            FilePath = FilePath.Remove(0, 1);
                        }

                        ZipEntry entry = new ZipEntry(FilePath);//file.Name);

                        entry.DateTime = DateTime.Now;

                        // set Size and the crc, because the information

                        // about the size and crc should be stored in the header

                        // if it is not set it is automatically written in the footer.

                        // (in this case size == crc == -1 in the header)

                        // Some ZIP programs have problems with zip files that don't store

                        // the size and crc in the header.

                        entry.Size = fs.Length;

                        //fs.Close();

                        crc.Reset();

                        crc.Update(buffer);

                        entry.Crc = crc.Value;

                        s.PutNextEntry(entry);

                        s.Write(buffer, 0, buffer.Length);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        if (fs != null)
                        {
                            fs.Close();
                            fs = null;
                        }
                    }

                }

                s.Finish();

                s.Close();

                Message = "OK";
                return true;
            }
            catch (Exception ex)
            {
                Message = ex.Message;
                return false;
            }

        }

Hier ist er Code für den unzippt Vorgang:


public Boolean UnZip(String SrcFile, String DstFile, int BufferSize, ref String Message)// die BufferSize ist 4096
        {
            FileStream fileStreamIn = null;
            FileStream fileStreamOut = null;
            ZipInputStream zipInStream = null;
            try
            {
                if (DstFile == "")
                {
                    throw new Exception("Destination Directory is empty");
                }

                Boolean Exist = false;
                try
                {
                    if (Directory.Exists(DstFile) == true)
                    {
                        Exist = true;
                    }
                }
                catch
                {
                    throw new Exception("Error checking existing Directory");
                }

                if (Exist == true)
                {
                    try
                    {
                        Directory.Delete(DstFile,true);
                    }
                    catch (Exception ex)
                    {
                        throw new Exception("Could not delete existing Destination Directory: " + DstFile + " - " + ex.Message);
                    }
                }
                ZipEntry entry = null;
                fileStreamIn = new FileStream(SrcFile, FileMode.Open, FileAccess.Read);
                zipInStream = new ZipInputStream(fileStreamIn);
                do
                {
                    try
                    {


                        entry = zipInStream.GetNextEntry(); // hier bekomme ich plötzlich eine Exception
                        if (entry == null)
                        {
                            break;
                        }
                        String DestPath = DstFile + @"\" + entry.Name;
                        String DestPathDir = Path.GetDirectoryName(DestPath);
                        if (Directory.Exists(DestPathDir) == false)
                        {
                            try
                            {
                                Directory.CreateDirectory(DestPathDir);
                            }
                            catch (Exception ex)
                            {
                                throw new Exception("Could not create Destination Directory: " + DestPathDir + " - " + ex.Message);
                            }
                        }
                        fileStreamOut = new FileStream(DestPath, FileMode.Create, FileAccess.Write);

                        int size;
                        byte[] buffer = new byte[BufferSize];
                        do
                        {
                            size = zipInStream.Read(buffer, 0, buffer.Length);
                            fileStreamOut.Write(buffer, 0, size);
                        } while (size > 0);

                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {

                        if (fileStreamOut != null)
                        {
                            fileStreamOut.Close();
                            fileStreamOut = null;
                        }
                        
                    }

                } while (entry != null);

                Message = "OK";
                return true;
            }
            catch (Exception ex)
            {
                Message = ex.Message;
                return false;
            }
            finally
            {
                if (fileStreamIn != null)
                {
                    fileStreamIn.Close();
                    fileStreamIn = null;
                }
                if (zipInStream != null)
                {
                    zipInStream.Close();
                    zipInStream = null;
                }
            }

Weiß jemand von euch, wo mein Fehler liegt???

MfG
Tonka