Hi sven22,
ich bin mir zu 99,9% sicher soetwas bei codeproject.com gesehen zu haben 🤔
Ich befasse mich auch seit einigen Wochen damit. Als Lösung dafür, habe ich mir einfach ein Panel überschrieben und es mir selbst als Control nachgebaut.
@Friedel: Wenn ich aber auf die Leiste klicke und gedrückt halte, ändert sich die Opacity erst nach kurzer Zeit. Das finde ich sehr unschön.
Danke Pako. werde es mal ausprobieren 🙂
Also das ist ganz einfach eine ToolBar bzw. ein ToolStripcwie progger schon sagte. Man überschreibe einfach den ToolStrip(Item)Renderer und fertig.
Hallo,
das gleiche Thema hatte ich vor einigen Wochen auch schon eröffnet. Leider kam dort keine 100%ige Lösung heraus. Musst mal suchen. Wenn du was findest melde dich mal, würde mich nach wie vor interessieren.
Auch wenn ich mich mit ASP überhaupt nicht auskenne, aber langjährige Erfahrung in PHP/MySQL, etc habe, kann ich dir nur abraten das so zu machen. Gerade wegen der Orientierung hat die Adressleiste ihren Sinn.
Der History sei Dank 8)
Schau mal hier: Beibehalten von Anwendungseinstellungen in .NET Framework
Da sollte das Wesentliche enthalten sein. Kannst gerne fragen wenn was ist 🙂
// EDIT: Oh Doppelpost, sorry.
Bin momentan kaum zuhause wegen Umzug. Aber ich guck mal im Internet. Hab nen Teil von der MSDN... melde mich.
Also nochmal zum Verfahren: Ich würde dir empfehlen eine kleine XmlSettings-Klasse zu schreiben die LoadSettings, LoadDefaultSettings und SaveSettings enthält und die XmlSerializer-Klasse benutzt. So kommst du parallel mit Feldern in Begegnung (hat mir viel gebracht).
Hallo herbivore,
wie schon sicherlich bekannt eine tolle Sache, aber einfach noch nicht dynamisch genug. Siehe dazu meinen Beitrag. Ich habe mir daher kurzerhand eine eigene Settingsklasse erstellt, die dem 2.0er sehr ähnelt. Auch die Sache mit dem "ToString()" etc. erledigt sich dadurch. Damit kann ich dann einfach jeden, oder sagen wir die meisten, Datentypen in meine Klasse werfen und wieder auslesen. Es gibt nur eine .config Datei die heißen kann wie sie will und liegt jeweils im UserApp Ordner.
bigdaddy86 sollte sich daher vorher gut überlegen, wie er die SettingsKlasse einsetzen will. Ganz im Gegenteil zu mir, ich habs verpennt und hab erstmal was gebaut was nix war, dann das 2.0er ausprobiert und bin doch wieder bei ner ganz neuen Klasse angelangt. 🤔
Programmierhans das verstehe ich nicht. Gibt es bei den WEbcontrols ein IPAddress Objekt? (Habe mit WebControls noch nie was gemacht).
Vielleicht gibt es einen WindowsXP Home/Prof. Unterschied?! ?(
Hallo Leute,
man nehme zb. den RessourceHacker öffne zb. die shell32.exe oder die explorer.exe, etc. Dort kann man jede Ressource zb. als Icon speichern bzw. als Bitmap. Das Umwandeln in ein andres Format wie zb. png (wegen der Transparenz) übernimmt gerne Photoshop etc.
Diese Bitmaps könnten dann in die Imagelist eingebunden werden.
@ikaros: Mich würde die "genauere" Methode interessieren...
Hallo thepaul,
ich bin mir nicht 100% sicher ob es für DirectoryInfo.GetFiles() auch geht, aber ich bin mir sicher, hier im Forum mal eine Lösung dafür gesehen zu haben, wie man den SearchPattern erweitert.
Gibt schon jede Menge hier im Forum. Außerdem such mal bei codeproject.com zb. nach Wizard.
zunächst: "." ist Dos-Steinzeit und bewirkt unter Windows nicht das Gewünschte. Verwende "*".
Ja, hast du ja schonmal erwähnt. Hoffe den Fehler mache ich nicht nochmal. Danke 🙂
Bist du dir sicher, dass eine WinIoException kommt?
Du hast mir mal wieder das Gegenteil bewiesen. Es kommt eine "UnauthorizedAccessException". Damit kann ich eine benutzerfreundliche Meldung ausgeben. Thanks too.
ich hab in der schnelle nicht gelesen, ob da das Problem mit versteckten Systemordnern gelöst wurde, aber schau mal hier
Bringt mir nichts. Ich mache das schon fast so, aber trotzdem danke.
frisch, eine gute Lösung. Ich denke ich werde in einer der nächsten Versionen die Methode erweitern. Momentan sollte das Zielverzeichnis halt keine Zugriffsgeschützten Ordner enthalten.
Danke euch allen 🙂
S.H.-Teichhof,
nein leider nicht. Das die sich unterscheiden weiß ich, aber wenn ich wieder in den normalen Modus zurückkehre, sind teilweise die Panels in der Größe verschoben. Komisch ne.
Hey Leute,
ich wollte euch mal fragen, was ihr zu meinem Problem sagt:
Ich lese mit
string[] Files = Directory.GetFiles(Path, "*.*", SearchOption.AllDirectories);
ein Verzeichnis aus, damit ich später die Größe dessen berechnen kann. Wenn ich zb. "C:" übergebe, bleibe ich an System Volume Information hängen, weil ich ja keine Rechte drauf habe. Genauso geht es mir teilweise bei Ordnern im Netzwerk. Ich habe im Forum etwas gesucht und dort nur gefunden, dass es auch korrekt sei keinen Zugriff auf System Volume Information zu haben.
Jetzt wollte ich mich ein bisschen um die Fehler die auftreten könnten kümmern und benutzerfreundliche Fehlermeldungen ausgeben.
DirectoryNotFoundException wenn der Ordner nicht gefunden wurde.
Ich habe mal geschaut, welche Exception kommt, wenn ich keinen Zugriff habe und zwar die WinIoException, die ich aber in meinen Exceptions nicht auswählen kann und daher mit die Möglichkeit entgeht, den Fehler korrekt abzufangen.
Als Workaround dachte ich mir, einfach selbst eine rekursive Methode zu schreiben, die mir die Ordner alle ausließt (ist kein Problem) und dort abzufragen, ob ich überhaupt Rechte auf den Ordner habe.
Leider weiß ich
a) nicht wie ich herausfinde, ob ich überhaupt Rechte auf den Ordner habe ihn nach der Größe zu fragen.
b) nicht ob das überhaupt sinnvoll ist, da im Falle der Netzwerkabfrage ja Speicherplatz nicht einberechnet wird, weil ich ja die Ordner einfach weglassen würde wenn ich keine Rechte darauf habe und somit die Größenangabe nicht korrekt ist.
Könntet ihr mir mal eure Meinung dazu sagen?
P.S.: Nach Möglichkeit keine WinApis...
Ich verstehe dein Problem nicht ganz. Wenn du ein Control hast, dann kannst du die Länge mit Control.Text.Length abfragen. Oder meinst du die Breite in Pixel? Das geht mit MeasureString().
Cool, aber in der Express nicht vorhanden, finde ich die SolutionLine.
Ist diese empfehlenswert?
Also ich bin sehr begeistert. Auch der Desinger macht richtig viel Spass. Ich habe nur einen recht nervigen Bug entdeckt: Wenn man den Debugmodus startet, werden oftmals die Panels (Properties, Solutionsexplorer, etc.) wild verstreut bzw. in der Größe verändert. Als Workaround mache ich es immer so, dass ich F6 oder rechte Maustaste+Build auf dem Projekt drücke und dann immer in der Taskleiste in meinen Ausgabeordner gehe und dort die Exe starte. Hat halt zur Folge, dass ich keine Zeilen bei Fehlern angezeigt bekomme. Da muss dann doch die IDE her.
und gibt es diese auch schon in Deutsch?
Ja, such mal im Forum. Ich habe versucht sie zu installieren, allerdings kommt bei mir beim starten der setup.exe ein Fehler, wo mir noch niemand helfen konnte.
Sorry war nicht meine Absicht:
Wollte nochmal sagen das es jetzt geht und den Code nochmal zusammenfassen:
string Size = Info.GetSize(new DirectoryInfo(this._MyPath)).ToString();
if (Size != null)
WaitForm.Invoke(new SetTextDelegate(this.Size), new object[] { Size });
if (WaitForm != null)
WaitForm.Invoke(new SetDialogResultDelegate(WaitForm.SetDialogResult), new object[] { DialogResult.OK });
Danke. Habe eben nochmals bei meiner Freundin erwähnt wie hilfreich mycharp bzw du bist. Ohne euch wäre ich arm dran 👍
Das ist doch sowieso schon drin und funktioniert alleine nicht.
... also habe ich das mal erweitert:
string Size = Info.GetSize(new DirectoryInfo(this._MyPath)).ToString();
if (Size != null)
WaitForm.Invoke(new SetTextDelegate(this.Size), new object[] { Size });
Korrekt?
Aaaaalso 🙂
Das sind meine Operationen (natürlich mehrmals und in unterschiedlichen Formen):
string Size = Info.GetSize(new DirectoryInfo(this._MyPath)).ToString();
WaitForm.Invoke(new SetTextDelegate(this.Size), new object[] { Size });
Dahinter steckt eine statische Klasse die zb. die Größe eines Pfades zurückgibt.
Diese Operationen werden ja abrubt durch das "X" abgebrochen und ich denke mir da knallt es. Wenn ich nämlich die Operationen auskommentiere, geht es.
Habe es eben in ein neues Projekt gebaut. Der Code den ihr kennt funktioniert sauber. Das Problem liegt in an meinen Operationen die ja dann dadurch abgebrochen werden. Was gibt es da für eine Lösung? Einfach auf den Rückgabewert der Operationen prüfen und bei nicht korrekten Rückgabewert einfach
WaitForm.Invoke(new SetDialogResultDelegate(WaitForm.SetDialogResult), new object[] { DialogResult.Cancel });
zu machen? Eigentlich müsste doch die WaitForm durch Abbruch (X) auch den Dialogresult.Cancel wiedergeben oder?
Hoffe dieser "StackTrace" bringt dir mehr:
Geht nicht.
WaitThread = new Thread(new ThreadStart(StartWait));
WaitForm = new frmWait();
IntPtr h = WaitForm.Handle;
WaitThread.Start();
WaitForm.ShowDialog();
WaitForm = null;
if (WaitForm != null)
WaitForm.Invoke(new SetDialogResultDelegate(WaitForm.SetDialogResult), new object[] { DialogResult.OK });
Singleton... ok jetzt weiß ich was es ist. Danke 🙂
WaitForm.Close(); ist draußen.
Beim Invoke habe ich jetzt geschrieben:
if (!WaitForm.IsDisposed)
WaitForm.Invoke(new SetDialogResultDelegate(WaitForm.SetDialogResult), new object[] { DialogResult.OK });
Es geht aber immer noch nicht.
a) Ja ich benutze das 2.0er Konfigurationsmodell. Das "zur Verfügung stellen" würde dann so funktionieren, dass ich ein Modul (xyz.dll) habe, welches eine SettingsClass zur Verfügung stellt. Die andren Module müssten dann die xyz.fll referenzieren?
b)
Du könntest die Klasse MyApplicationSettings auch als Singleton realisieren (mal eine der wenigen Stellen, wo so ein Singleton Sinn macht). Dann tun sich die Module mit dem Zugriff noch leichter.
Oh damit redest du für mich in Rätseln. 🤔
Ah also erzeuge ich einfach eine neue Buttoninstanz names btnCopy. Ok danke 🙂
Also an den drei, vier Zeilen Code zu urteilen, wo der Fehler jetzt liegt, ist ziemlich schwierig. Besonders, wenn thread benutzt werden.
WaitThread = new Thread(new ThreadStart(StartWait));
WaitForm = new frmWait();
IntPtr h = WaitForm.Handle;
WaitThread.Start();
WaitForm.ShowDialog();
WaitForm.Close();
private void StartWait()
{
try
{
// Hier werden Operationen durchgeführt...
WaitForm.Invoke(new SetDialogResultDelegate(WaitForm.SetDialogResult), new object[] { DialogResult.OK });
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
WaitForm:
public partial class frmWait : Form
{
public frmWait()
{
InitializeComponent();
}
public void SetDialogResult(DialogResult pDialogResult)
{
this.DialogResult = pDialogResult;
}
}
Brichst du den Thread mit Abort ab?
ich benutze das "X" des Dialogs der Waitform.
*gg* nicht Engine... Eigene 😉
Also nochmal:
Da mein Programm modular aufgebaut ist (Referenzierungen von Dlls und Einbinden über Interfaces) benötige ich die Einstellungen in vielen Modulen (unter Anderem im Hauptprogramm). Und ich möchte ungerne für jedes Modul eine Einstellungsdatei erzeugen.
Ja sie ist null.
a) Wie wie setze ich diese Variable auf den richtigen Button? Mit this.btnCopy = this.btnCopy; ?!
b) Wie ich bereits sagte, spricht Einiges dafür eine eigene Methode zu verwenden. Daher denke ich ist es wirklich sinnvoller mich nochmal mit meiner eigenen Kopierroutine zu beschäftigen.
Also wie ich schon sagte, die Meldung kommt (sofern der Thread erfolgreich zuende läuft) garnicht mehr. Auch wenn ich das WaitForm.Handle weglasse. Wenn ich aber jetzt den Thread abbreche, kommt die Meldung (vorher nicht getestet). Also habe ich das Handle wieder reingenommen, aber es kommt immer noch.
WaitForm = new frmWait();
IntPtr h = WaitForm.Handle; // <<<================
WaitThread.Start();
WaitForm.ShowDialog();
Da keiner Rat weis, werde ich also doch zu meiner eigenen Klasse greifen.
Habe die Zeilen weggelassen. So geh es jetzt. Bin aber noch wie vor am überlegen ob ich nicht doch - wie herbivore schon sagte - zu meiner alten eigenen Kopiermethode zurückgreife. Die ist zwar nicht so konfortabel, aber ich habe ein Dialogfenster, damit der User nicht mehr auf die Hauptform zugreifen kann und ich habe mehr Kontrolle über das was ich anzeige und mache. Außerdem bin ich unabhängig von WinApis.
Danke für eure Hilfe 🙂
Hey,
ich muss diese Thema leider nochmal aufgreifen: Wenn ich jetzt die Refernzierung auf das Hanlde weglasse geht es komischerweise.
Nun ist mir aber etwas Andres aufgefallen:
Wenn ich das Dialogfenster schließe, kommt nach etwa 5 Sekunden die gleiche Fehlermeldung. Woran liegt das nun wieder? Achja: Wenn ich das Handle wieder reingeschreibe merke ich keine Unterschied. Der Code ist immer noch der Gleiche.
Ah. StackTrace... habe den mal ausgeben lassen:
try
{
//this.btnCopy.Enabled = false;
this._ShellCopy.OwnerWindow = this.Handle;
this._ShellCopy.Copy();
//this.btnCopy.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + " \r\n\r\n" + ex.StackTrace);
}
Wenn ich nun die zwei Zeilen, die den Button erst deaktiviert und dann wieder aktiviert, ausblende geht es. Ich verstehe aber nicht was ich falsch mache bzw. warum es dann nicht funktioniert wenn die zwei Zeilen wieder eingebunden werden.
Also ich habe nochmal geschaut. Komischerweise gehts im Debugmodus aus VS heraus ohne Fehler. Der Fehler tritt nur beim Einzelaufruf der exe auf. Wie kann ich denn den Fehler lokalisieren? Achja: Der Click des Buttons ist einfach nur ein stink normales Buttonevent, welche die Kopierroutine aufruft. Der Code ist also genau der gleiche wie unten...
übersetz mal im Debug-Modus.
Was heißt das? Ich benutze bereits den Debugmodus. Dort wird eine dll erstellt, die in meinem Hauptprojekt referenziert wird. Gibt es eine bessere Möglichkeit zu debuggen um genau die Zeile angezeigt zu bekommen?
Habe mir gerade eine Demo Application geschrieben. Dort funzt es:
//Quelle wählen
private void button2_Click(object sender, EventArgs e)
{
FolderBrowserDialog fb = new FolderBrowserDialog();
if (fb.ShowDialog() == DialogResult.OK)
{
string[] SourcePath = { fb.SelectedPath + "*" };
this.sc.SourceFiles = SourcePath;
}
}
//Ziel wählen
private void button3_Click(object sender, EventArgs e)
{
FolderBrowserDialog fb = new FolderBrowserDialog();
if (fb.ShowDialog() == DialogResult.OK)
{
string[] DestPath = { fb.SelectedPath };
this.sc.DestFiles = DestPath;
}
}
Dort habe ich dann auch noch noch Buttn der das Kopieren ausführt. Den gleichen Code habe ich in eine andre Anwendung übernommen und bekomme beim Abbrechen des Kopierendialogs folgenden Fehler:
************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
at fastInstall.plgnDataSource.button3_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Könnt ihr mir helfen?