Ich glaube 100%ig sicher geht das (nahezu) gar nicht.
Du könntest einen Timer hernehmen und regelmäßig prüfen, ob das Foreground Window
auch deins ist:
GetForegroundWindow
SetForegroundWindow
Dazu geht im Prinzip auch ActiveX, ABER: IE only!
Moinsen!
Also ich hab im Prinzip nur die benötigten Registry Einträge erstellt.
Das AddIn selbst ist am Einfachsten mit dem VS 2005er Wizard zu erstellen.
'Shared AddIn' brauchst Du.
Dann hab ich das Installer-Projekt weggeworfen.
(Da könntest Du vorher nochmal reinschauen, welche Registry Einträge Du machen musst.)
Der Wizard erstellt Dir eine Klasse Connect (Connect.cs), die schon alle benötigten
Interfaces implementiert.
Dann hab ich aus den Referenzen einfach alles rausgeworfen, was mit Office zu tun hat.
Auch die Core!
Dann musst Du dich durch die MSDN wühlen und nachsehen, welche Eigenschaften und Methoden Du wie per Reflection zuweisen/aufrufen musst 🙂
Das war's eigentlich schon 🙂
Ach ja: Hilfreich ist es, einige Ausgaben per Debug.WriteLine(...) zu erzeugen.
Dann siehst Du genau, ob Dein AddIn fehlerhaften Code enhtält oder ob es magels z.B. Registrierung gar nicht erst geladen wird.
Und Debuggen geht eigentlich auch ganz einfach:
In den Projektoptionen einfach Word/Excel als 'zu startende Anwendung' angeben.
greetz
DaSchroeter
2 Tips hab ich noch, dann ist auch bei mir empty:
Mistsch****!
Genau sowas hab ich mir gedacht.
Werd dann wohl mal weitersuchen, ob es da einen praktikablen Workaround gibt 🙁
thnx
DaSchroeter
Moin!
Ich verwende eher das hier um den Button hinzuzufügen.
http://msdn2.microsoft.com/de-de/library/microsoft.office.core.commandbarcontrols.add(VS.80).aspx
Das würde bei mir einem solchen Aufruf entsprechen:
CommandBarButton btn = Commandbars["Standard"].Controls.Add(...,true);
true bezieht sich hier auf Temporary. Ich setzte momentan sogar noch
btn.Temporary = true;
aber das bringt alles nichts.
Genauer: Excel/Word 2007 läuft, Excel 2003 läuft, Word 2003 lässt den Button drin 🙁
Noch ne Idee, oder schonmal was davon gehört?
thnx
DaSchroeter
Zu 1. kann ich erstmal nix sagen, aber zu 2.:
Du bekommst das File als Parameter in Deine Main Routine gereicht.
static void Main(string[] args){
//.....
}
Original von langalaxy
Bedeutet soviel wie, du legst einen Button an und der bleibt nach der Deinstallation?
Ja, aber um es klarzustellen: Der Button wird natürlich vom AddIn selbst angelegt.
Und theoretisch auch wieder entfernt. Der Uninstaller entfernt 'nur' die Registrierungseinträge.
Original von langalaxy
Wenn du den Button via CommanBar/CommandBarButton anlegst, kannst du Office mitteilen dass die CommandBar nur temporär hinzugefügt werden soll und nur in der aktuellen Instanz vorhanden ist. Vielleicht hilft dir das ja schon weiter.
Das wär genau das was ich brauche...kannst Du mir noch nen Tip geben wie ich das anstellen muss?
Ach ja: Ich verwende keine Referenzen auf die Office... DLLs. Das wird alles per Reflection erledigt: Das Abrufen der CommanBar/CommandBarButton Objekte, das Erstellen/Entfernen des Buttons,...
thnx
DaSchroeter
[DllImport("clallserial.dll")]
public extern static unsafe int clGetNumPorts(
out uint numPorts); // kein pointer
uint numPorts = 0;
clGetNumPorts(out numPorts);
So sollte es aussehen
steht vielleicht irgendwo ein 'nullbyte' im string?
Wird 'aaaaaaa....aaa' (300 mal) auch abgeschnitten?
Moinsen,
hab ein kleines Problem mit meinem Office AddIn.
Vornewech: Der Installer läuft, das AddIn läuft.
Und zwar mit Word/Excel 03 und Word/Excel 07
Nun funktioniert aber der Uninstaller nicht richtig.
Ich verwende NSIS zur Erstellung der Registry Einträge
und zur Registrierung der Komponenten.
Die Office.Core Referenzen hab ich mittels Reflection umgangen.
Es werden im Prinzip nur die Einträge im Addins subkey in der Registry geschrieben.
Mit 2007 läuft auch alles prima, aber in Word/Excel 2003 bleibt der
von meinem AddIn erstellte Button (ach ja: das macht es) hängen.
Weiss jemand wo da noch überall was eingetragen wird/werden muss?
thnx
DaSchroeter
Dann musst Du auch diese Objekte für COM 'sichtbar' machen.
Genau wie die Klasse, die Deine COM-'Schnittstelle' bildet.
greetz
DaSchroeter
Zu 1. hab ich schon gefunden:
Einfach keinen Namen (leeren Namen) angeben, dann kommt (Default) oder (Standard) raus.
Zu 2.:
*PUSH* 🙂
Moin!
Bin grad auf zwei kleine Problemchen mit einem im Studio 2005 erstellten Setup-Projekt gestoßen:
thnx
DaSchroeter
Zum optimieren ist das zu wenig Info.
Zeig nochmal die gesamte Initialisierungsprozedur.
EDIT: Das Flush ist zwar schön, aber an dieser Stelle überflüssig, weil Du den Stream ja eh wieder schließt.
Erinnert mich ein bischen an das hier:
http://www.cis.upenn.edu/proj/plclub/contest/
Was Du da gemacht hast ist nur Hin- und Herschubsen des 'Blocking Calls'.
Du blockierst den GUI Thread durch den Invoke Aufruf.
Du musst aber das Laden im (extra) Thread erledigen und die GUI nur über das Ergebnis benachrichtigen.
So sollte es gehen:
public Form1()
{
InitializeComponent();
Console.WriteLine("UI-Thread ist #{0}", Thread.CurrentThread.ManagedThreadId);
Thread thread = new Thread(new ThreadStart(LoadVrmlInOwnThread));
thread.Start();
}
delegate void VoidDelegate();
void Ready()
{
if( InvokeRequired ){
Invoke( new VoidDelegate(Ready),new object[0] );
return;
}
Console.WriteLine("Loading ready");
}
void LoadVrmlInOwnThread()
{
Console.WriteLine("Lade VRML in Thread #{0}", Thread.CurrentThread.ManagedThreadId);
vrmlControl.loadFile("Gesamtlayout.wrl");
Ready();
}
greetz
DaSchroeter
Warum nicht einfach so:
this.label.Height = (int)Math.Round(ns.Height);
Weil: Wenn Du mit Round arbeitest und dann immer draufaddierst, dann kann es schon vorkommen, dass sich die 'Fehlbeträge' derart aufsummieren, dass da ganze Zeilen bei zusammenkommen.
Hi!
Ich würde innerhalb des UserControl Click-Handler für die Label-Clicks erstellen,
die dann wiederum das Click-Event des UserControls auslösen.
Wenn Du die Click-Events im Konstruktor nach InitializeConmponents();
hinzufügst, dann müsste das auch im ComapactFramework gehen.
greetz
DaSchroeter
@frisch: Skin...hmmm...wenn ich dass noch wüsste 🙂 Irgendwas Vista-mäßiges 🙂 Und das Hintergrundbild: Die Google-Suche nach 'Babylon 5' bringt einiges zutage 🙂
Edit:
Hab auch erst so nen Grafik-Kram drauf, seit ich mir nen ADM64X2 mit 2GB RAM und 600GB SATA II HDs geleistet hab 🙂
Vorher war das alles schön brav ausgeschaltet 🙂
Hab extra mal die Symbole ausgeblendet, weil: So sollte es eigentlich aussehen 🙂
Hi!
Also ich würd sagen Try'N'Error 🙂
Oder Du lässt den aktuellen WebService eine DynDns Adresse mit der eigenen IP aktualisieren und connectest dorthin.
greetz
DaSchroeter
Mit
Main thisMain = new Main();
erstellst Du eine neue Instanz der Klasse Main.
Ich denke mal, dass dort im Konstruktor die ListBox gefüllt wird.
Aber
thisMain.listBox1.SelectedItem
ist natürlich null, da ja kein Eintrag selektiert ist.
greetz
DaSchroeter
Original von talla
Kannst du nicht einfach die Bitrate auslesen und aus der Dateigröße und Bitrate dann die Länge berechnen? (okay, funktioniert nur bei statischer Bitrate so einfach)
Das müsste prinzipiell auch bei VBR gehen. Muss nur (am Besten im Thread) einmal über die gesamte Datei für alle MP3 Header ausgeführt werden.
Hab das irgendwann schonmal so gemacht und das ging recht zügig.
Tipp: Bei der Gelegenheit gleich ne MD5 über den Dateinamen (und eine über die Header-Infos) und die Länge und evtl. andere Angaben in ner DB merken. Dann spart man sich den Kram in Zukunft 🙂
greetz
DaSchroeter
Hi!
Zuerst: Ich finde die Idee eines Wettbewerbs an sich und speziell die Aufgabenstellung sehr gut! Aus hier schon oft genannten Gründen 🙂
Ob ich mich beteiligen werde hängt ein bischen davon ab, ob ich im Nov genug Zeit habe.
Ich hätte aber noch eine Anregung:
Könnte man statt einen 'Gewinner' auszuloben vielleicht verschiedene Kategorien einführen?
Also z.B. 'Design', 'Idee', 'Coding-Style',...
Und dann für jede angegebene Lösung jede dieser Kategorien bewerten lassen?
Vorteile:
Nachteil:
Ist evtl. ein wenig zu viel Aufwand für den ersten Wettbewerb.
Vielleicht für den nächsten, wenn die Beteiligung gut ist?
greetz
DaSchroeter
Ah..ok...dann hab ich jetzt echt was gelernt 🙂
Ich nehme hiermit alle meine (gutgemeinten, aber) unqualifizierten Bemerkungen zurück!
OnPaint...wieder was dazugelernt 🙂 -> Ändert aber nix, weil:
Du hast also eine Handler-Routine überschrieben. Das kann so eigentlich gar nicht funktionieren:
Das Event stammt aus Deiner Basisklasse, der Handler ist dort implementiert, das Event wird dort ausgelöst.
-> Die Basisklasse kennt Deine Ableitung ja gar nicht!
Warum machst Du nicht sowas:
this.Paint += new...
Geht das auch nicht?
greetz
DaSchroeter
Original von absolut
DaSchroeter:
Danke, werde mal die Registry durchforsten. Das mit dem Mini-Pop3 Client geht nicht, ich möchte die Emails im lokalen Email-Programm (bei mir Thunderbird) auswerten, und dies bei allen Email-Adressen (zur Zeit sechs Stück)
Verstehe den Zusammenhang nicht. POP3 kann doch die Mails online belassen!
Oder schreibst Du ein Thunderbird-PlugIn?
Oder geht es nur um die variablen eMail Konten? -> Importer schreiben
greetz
DaSchroeter
Hi!
Du kannst grundsätzlich nie von irgendwas ausgehen!
-> 5 Sekunden dauert es auf Deinem System, nicht auf jedem!
-> Wer sagt, dass der Rechner 'richtig' heruntergefahren wird!
-> Man kann Windows so einstellen, dass es schon nach 1 Sekunde alle Prozesse abschießt, wenn es herunterfahren will!
-> ....
Geht es um das Sichern von Settings? Oder Nutzdaten?
-> Erstere sollten keine 5 Sek brauchen.
-> Letztere sollten nicht erst bei Programmende gesichert werden.
greetz
DaSchroeter
Ähh...**On**Paint gibt es schonmal gar nicht (pfui Deulphi 🙂 ).
Paint heisst das Teil 🙂
Und dann ist das, was Du da schreibst ein Methodenrumpf -> Kein Event! Eher Handler, aber bestimmt nicht zugewiesen (Paint += new...).
Hi!
Ich glaube das wird vom eMail Programm in die Registry eingetragen.
Ist (dann) auf keinen fall 'sicher' -> Du bist drauf angewiesen, dass das eMail Programm da wirklich was einträgt.
Und Absender stehen da wohl eher nicht bei.
Du könntest aber nen Mini-POP3 Client schreiben, der das macht.
Gibt Classes dazu im Framework (2.0).
Oder such bei CodeProject.
greetz
DaSchroeter
OnPaint Methode überschrieben.
Einen EventHandler [...] für überschriebene Eventmethoden
Ich glaube hier geht was verquer 🙂
Also:
Hast Du das Event 'überschrieben'?
Meine Empfehlung:
Neues Form erstellen und eben implementieren.
Ist ja sooo viel nicht 🙂
Original von vicon
Original von vicon
textBox1.BackColor = Color.Green;
hat bei mir wunderbar Funktioniert. ebenso ForeColor, BorderStyle usw
Jup, von TextBox, Button, ... aber sicherlich nicht von MessageBox 🙂
Weil: MessageBox.Show(...) erzeugt nen vordefinierten Dialog und zeigt ihn gleich an.
Und ich denke hier ist eben MessageBox.Show(...) gemeint.
greetz
DaSchroeter
[Edit]Ups, da war wieder mal einer schneller 🙂[/Edit]
Mal 'ne Frage:
Hast Du Pseudo-Code oder irgendwie sowas als Aufgabenstellung bekommen?
Ja? -> Poste mal!
Ich zumindest kann nicht so richtig was mit Deinem Problem anfangen 🙂
Die Calling Convention hat nichts (oder nicht nur) mit dem Prototypen zu tun.
Das hier sollte Dir weiterhelfen.
greetz
DaSchroeter
Hi!
Ist deine Connection ein Field? Oder 'nur' eine lokale Varible?
Weil wenn lokal, dann wird die Verbindung beim 'Aufräumen' der Instanz geschlossen.
greetz
DaSchroeter
Zur Not gäbe es ja auch noch diese Vorschau-Funktion 🙂
Mach das doch bitte mal mit Code-Tag klar...das kann ja kein Mensch lesen!
Edit: Na da war ich ja nicht der Erste 🙂
okay...ich geh mal davon aus, dass Du das hier meinst:
Arraylist le = new Arraylist();
Und dass le die Zeilen der LogFiles enthält.
Und dass Du nun einzelne 'Segmente' der Zeilen in einer Hashtable ablegen willst, um dann Summen drüber bilden zu können.
Richtig?
Dann musst Du die Zeilen erstmal zerlegen:
string[] segs = ((string)le[0]).Split(...);
Dann in die Hashtable werfen:
Hashtable ht = new Hashtable();
ht["seg1"] = segs[0];
ht["seg2"] = segs[1];
....
Oder jedenfalls so ähnlich oder so...weiss halt immer noch nicht so genau, wie du was machen willst.
greetz
DaSchroeter
COM allgemein: ja.
Lotus Notes: nieundnimmerwerdichbestimmtnichtwillichnixvonwissenhasseichwiediepestdankedernachfrage 🙂
Original von svenson
Das ist ungefähr so, als transportiert man seine Einkäufe von ALDI mit nem 16-achsigen Tieflader nach Hause....
LOL! Kann ich mir das ausborgen?
Wirklich treffend ausgedrückt! 🙂
Kommt halt drauf an, was Du mit den Daten machen willst:
Sind es Settings oder Nutzdaten?
Willst Du Queries drauf laufen lassen (z.B. Suchen)?
Statt dBase würd ich SqLite empfehlen, ist aber Ansichtsache 🙂
greetz
DaSchroeter
Hi!
Ich hab das schonmal gemacht, aber leider inzwischen den Arbeitgeber gewechselt und daher keinen Zugriff mehr auf den Code.
Aber grundsätzlich:
Thread(s) erstellen, die ein/mehrere Verzeichnisse überwachen und per Delegate deine App informieren.
Dazu:
greetz
DaSchroeter
Wenn jemand die COM-API kennt, dann meldet er/sie sich schon...ein bischen Geduld bitte 🙂
Hast Du keine Beschreibung dafür gefunden?
Die Lotus Leutchen mal kontaktiert?
soweit so gut. aber was jetzt ? darein soll jetzt mein vector und ich hab nur die variable le, die meine daten enthält. wie soll das gehen? ich stell mir das so mit schubladen vor, aber wenn er nur einen variable hat wie soll er dann wissen wie er die aufteilt? mien lehrer hat gesagt ich soll das irgendwie mit nem switch case machen???
Logfile->ok!
Grafik->ok!
Vector->hä?
Schubladen?
Was ist denn in le? -> Wie sind die Daten da drin?
Das ist mir ein bischen zu konfus, glaub ich 🙂
greetz
DaSchroeter
Äh...da ist ne Datenbank fast overkill.
Vielleicht die Daten komplett im Speicher halten (List<T>) und als XML serialisieren?
Original von GarlandGreene
dann hat der Anwender aber bereits Daten geändert, sich mit dem Auftrag beschäftigt und Zeit vertrödelt. Da ist es tatsächlich besser, das System prüft vor Beginn der Bearbeitung, ob der Auftrag gesperrt werden kann, sperrt diesen dann und gibt erst danach die Bearbeitung frei. Eine Prüfung erst beim Speichern sorgt nur dafür, daß sich Mitarbeiter unnötig oft in die Quere kommen.
Ich meinte auch nicht automatisch beim Speichern, sondern automatisch bei der ersten Änderung 🙂