Laden...

Forenbeiträge von trib Ingesamt 708 Beiträge

18.02.2009 - 09:59 Uhr

Hi nuggie,

ich denke mal das der WebBrowser die Seite noch nicht geladen hat und deshalb keine URL hat.
Du lässt das Control per Navigate() auf eine Seite zugreifen. Dann versuchst du sofort auf die URL zuzugreifen. Jedoch hat das Webcontrol so schnell noch keinen Response bekommen und kennt die Seite noch nicht wirklich.
Es könnte ja auch nur eine Weiterleitung sein...

Um wirklich sicher zu gehen, abonnier das "Navigated"-Event. Das wird ausgeführt sobald das Webcontrol fertiggeladen ist.

Alternativ kannst du das ganze einfach mit einem Timer verzögern. Aber das ist alles andere als Elegant.

Gruß,
TriB

06.02.2009 - 13:21 Uhr

Du kannst per "Druck" Taste einen Screenshot von einem ganzen Bildschirm machen,
mit ALT+Druck nur von dem aktiven Fenster.
Vielleicht hilft das schon weiter. Ansonsten musst du dir den Handle von dem Fenster holen und dort per Rectangle die Position und Größe bestimmen.

Gruß,
TriB

04.02.2009 - 14:46 Uhr

Nein, ein eigenes Control einfügen ist nicht möglich.
Du kannst ja nicht einmal alá C# eine Referenz hinzufügen...

Zu der Sache mit dem Diagramm:
Die Quick ´n Dirty-Lösung wären 2-3 Diagramme übereinander gelegt (Oder verschiedene Sub-Reports)
Das 1. Zeigt das Intervall Monatlich (Für ein Jahr)
Das 2. Zeigt die Wochen für die Anzeige eines Zeitraums ~1 Monat
Das 3. Zeigt die einzelnen Tage. Intervall = 1 Woche

Dann Fragst du ab, wie groß der zu betrachtende Zeitraum ist und zeigst das passende Diagramm an.
Alles andere als schön, aber es funktioniert.

04.02.2009 - 08:54 Uhr

Hallo smilingbandit,

wie du schon selbst sagst, ist man bei SQL-Reports sehr eingeschränkt. Das muss zum Teil auch so sein, damit alles extremst dynamisch verwaltet werden kann.
Auf der einen Seite verständlich, auf der anderen der blanke Horror X(

Also muss du versuchen das SQL-Statement so wasserdicht wie möglich zu erstellen.
Ein Trick ist z.B. einem Dataset ein Parameter zuzuweisen, welches als Wert ein anderes Dataset zur Grundlage hat.
So kann man 2 Datasets mit einander verbinden. Ansonsten eine Unterabfrage erstellen.

Das Diagramm selbst kann wirklich nicht viel. Daher immer Die Daten so "sauber" & fertig wie möglich anbinden. -> Sprich: meist anders als in der Tabelle die der User sieht.

Viel Erfolg bei deiner Arbeit!

30.01.2009 - 14:52 Uhr
  • Bei POP3 werden die Inhalte auf dein Client abgerufen und auf dem Server gelöscht.

Jein, das ist zwar bei Thunderbird automatisch so eingestellt, aber das kann unter den Kontoeinstellungen deaktiviert werden. Das Signal zum löschen gibt immer noch der Client.

Also einfach in den Konto Optionen das Häkchen entfernen und die empfangene Mails bleiben auf dem Server.

Für die gesendeten Mails liegt die Einstellung beim Anbieter.

Gruß,
TriB

EDIT: Quote berichtigt...

27.01.2009 - 10:25 Uhr

Wie darf man verstehen "das man mit c# ziemlich schnell verweichlicht" ?

Hi Kelkes,

ich finde das C# eine sehr einfach zu lernende Sprache ist, in der Itellisense die halbe Arbeit leistet.
Wenn Jemand C oder C++ gelernt hat, kann man sich extrem schnell in C# einarbeiten und gewöhnt sich schnell an die Vielzahl von Funktionen.
Andersherum ist es doch deutlich schwieriger.

27.01.2009 - 09:21 Uhr

Ich bin Technischer Assistent für Informatik
Und ich dachte ich wär alleine 😃

Nene, ich bin ja auch noch hier^^
Da das aber eine rein Schulische Ausbildung war, mache ich nun noch eine im Betrieb als Fachinformatiker...

Als ITA haben wir Java, C & C++ gemacht.
Als Fach Inf. ausschließlich C#.

Da ich finde das man mit c# ziemlich schnell verweichlicht, bin ich der Meinung man sollte erst mit c++ o.Ä. anfangen.

27.01.2009 - 09:10 Uhr

Als gebürtiger Düsseldorfer kann ich mich natürlich in die Reihe der Karneval-Feierschweine einreihen 😁

Bis jetzt habe ich jedes Jahr gefeiert und mich auch verkleidet. So wird es in Zukunft auch bleiben!
Was ich allerdings anziehe weiß ich noch nicht. Das entscheidet sich meist spontan.
Erst auf den Zug (Die erst betrinken-Zeiten sind vorbei) und dann in die Stadthalle.

Das es hier so viele Karnevalsmuffel gibt hätte ich nicht gedacht. Vielleicht liegt es an dem Berufszweig der Informatiker?!?
Treu dem Motto: "Im Keller gibt´s keine Kamelle"... 😉

27.01.2009 - 09:02 Uhr

Hallo Schamese,

du hast ja schon etliche Tipps bekommen.

Um zum einen mal mit Linux herum zu spielen und um zu schauen welche Distri dir am besten gefällt, kannst du auf die sog. Live-CDs zurückgreifen.
Die schiebst du in den PC und Linux startet komplett mit vielen Anwendungen vorinstalliert. Auf dem Rechner selbst bleibt nichts zurück.

Früher war Knoppix da das Non plus Ultra. Mittlerweile haben viele Distris, dies als Standard in der Installations-CD integriert. (z.B. Kubuntu. Live CD & Installations CD in einem) Die 700mb sind ja auch fix gesaugt. Die DVD Versionen haben natürlich mehr.

Knoppix hat mir schon viele Daten gerettet, wenn sich Windows zerschossen hat 😃

22.01.2009 - 11:23 Uhr

Hi Timo,

privat nutze ich auch Thunderbird mit Lightning Addon.
Bin auch sehr zufrieden damit 😃
Der einzige Nachteil den ich ausfindig machen konnte ist wahrscheinlich auch ein Todeskriterium für dich.
"Termine syncronisieren mit Handy" ist soweit nicht möglich.
Zumindest habe ich noch keine kostenlose Software kennengelernt die das mit Thunderbird & Lighning kann.

Mein Versuch über Nokia PC Suite -> Outlook Express -> CSV Ex & Import schlug leider bis jetzt jedes Mal kommentarlos fehl...

22.01.2009 - 10:43 Uhr

Also, ich habe jetzt etwas passendes gefunden.
Jedoch habe ich keine Ahnung wie ich das Parentfenster, wie du so schön sagts "subclasse".

Das habe ich gefunden und soweit abgeändert.

//Resize
        [DllImport("User32.dll", SetLastError = true)]
        static extern int SendMessage(IntPtr handleWindow, int message, IntPtr wParam, IntPtr lParam);
        private const int WM_NCCALCSIZE = 0x0083;

protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_NCCALCSIZE:
                    //Hier neu Zeichnen!
                    base.WndProc(ref m);
                    break;

                default:
                    //Mach Nix
                    base.WndProc(ref m);
                    break;
            }
        }

Nun brauche ich das zu "overridende"-Objekt
Das Fenster setzt ich wie folgt (greift noch auf eine ausgelagerte Klasse zu, ist aber selbsterklärend, denke ich)

hwndForm = GetForegroundWindow();
                windows.GetWindows(hwndForm);

                //Windows Handle durchsuchen
                foreach (EnumWindowsItem item in windows.Items)
                {
                    if (item.Text == subForm)
                    {
                        hwndSUB = item.Handle;
                        break;
                    }
                }

                if (hwndSUB != IntPtr.Zero)
                {
                    SetParent(IE.Handle.ToInt32(), hwndSUB);
                    Rectangle rect = new Rectangle();
                    GetWindowRect(hwndSUB, ref rect);
                    if (MoveWindow(IE.Handle, 0, 0, rect.Width, rect.Height, 1) == 1)
                    {
                        IE.Size = new System.Drawing.Size(rect.Width - rect.Left, rect.Height - rect.Top);                       
                        SetParent(IE.Handle.ToInt32(), hwndSUB);
                        IE.Opacity = 1.0;
                        IE.Show();
                        break;
                    }

Wobei "IE" meine Form darstellt...

22.01.2009 - 08:40 Uhr

WinApi-Message WM_ResizeBegin / WM_ResizeEnd

Das sollte doch für eine ergiebigere Suche reichen! Dank Dir soweit.

Gestern wusste ich nicht so recht WAS ich eigentlich brauche und habe immer nur nach Stichworten suchen können.

Falls natürlich Jemand zufällig was passendes auf Lager hat, unterbrecht meine Suche ruhig 😉

Gruß,
TriB

21.01.2009 - 17:22 Uhr

Hallo zusammen,

für eine Form muss ich ein Event abonnieren, wann das Parent-Fenster die Größe verändert.
Über MDI wahrscheinlich kein Problem...
An das Parent Fenster hänge ich mich aber per User32 Import und SetParent(Form.Handle.ToInt32(), hwndSUB);

Das heißt, ich hänge mich an eine laufende Anwendung. Diese hat ein Unterfenster.
Minimiere oder verschiebe ich dieses Unterfenster, dann tut es meine angehängte Form ebenso.
Das einzige was sie nicht mitbekommt ist, wenn ich die Größe des Unterfensters verändere.

Also müsste ich ebenfalls per "[DllImport("user32")]" oder vielleicht per Hook an dieses Event.

Der Code ist etwas umfangreich... Aber zumindest die Art und Weise möchte ich kurz beschreiben:
Ich hole mir alle Windowhandle zu einem Programm und durchsuche sie nach dem Unterfenster meiner Wahl.
Dann Checke ich das Windowstate (Minimiert, versteckt...) und suche mit die Größe & Position.
Meiner Form weise ich die Größe und Position zu und hänge es dran (mit SetParent).

Gruß,
TriB

16.01.2009 - 13:04 Uhr

Ich frag mich wozu die captchas überhaupt auf hosterseiten nötig waren, wollten die benutzer damit nerven bis sie sich premuim holen ? Genauso die ladezeiten vor dem download... auch unnötig

Klar sind die Ladezeiten / Timer dazu da dich zu nerven um einen PremAcc zu kaufen.
Genauso wie die Downloadgeschwindigkeit die deutlich gedrosselt wird.

Die Capchas waren einzig und allein dafür da, um Automatisierungen vorzubeugen.
Du gibst Programmen wie CryptLoad eine Liste von Dateien, die nacheinander heruntergeladen werden sollen. Das Programm startet dann automatisch den Router neu.
Das war natürlich den Hostern ein Dorn im Auge. Machst den Rechner an, gehst arbeiten und wenn du wieder da bis, hast du für Umme ein paar GB gesaugt.
Somit kamen die tollen Katzen^^

Von RS ist aber meiner Meinung nach abzuraten, da die geäderten Regeln mehr als abzocke sind. Früher konnte man laden ohne ende, nun maximal 2,5GB am Tag.
Der Speed ist runtergegangen und die Preise hoch....

14.01.2009 - 17:17 Uhr

Hallo herbivore,

dein Tipp hat mich leider nicht zum Ziel geführt.

Cursor.Position = this.PointToScreen(new Point(x, y));

Das berechnet irgendeine andere Zahl und gibt den Cursor sonstwo aus.

Durch langes probieren habe ich nun herausgefunden wo das Problem lag.
Es war nicht das Mauszeiger setzen, sondern das holen. So geht es nun:

[DllImport("User32.dll")]
static extern bool GetCursorPos(ref Point lpPoint);

......

GetCursorPos(ref pos);
key += "<LMouse" + pos.X + ":" + pos.Y + ">";

Das setzen blieb dann wie es war.

TriB

14.01.2009 - 14:42 Uhr

Hallo zusammen!

Mir ist bewusst, das es schon ein paar Themen zu Mousehooks im Forum gibt. Jedoch ist das Problem nicht, das es nicht funktioniert, sondern das die Maus die falsche Position an nimmt.

Die Mausposition lege ich wie folgt fest:

                    Point pos = Cursor.Position;                    
					if(Enum.GetName(typeof(keys), i) == "LButton")
                        key += "LMouse" + pos.X + ":" + pos.Y ;
					else if(Enum.GetName(typeof(keys), i) == "RButton")
                        key += "RMouse" + pos.X + ":" + pos.Y;

Dann folgt nach der Übergabe ein bisschen String gesplitte und das hier:

                        int MOUSEEVENTF_LEFTDOWN = 0x02;
                        int MOUSEEVENTF_LEFTUP = 0x04;
                        int MOUSEEVENTF_RIGHTDOWN = 0x08;
                        int MOUSEEVENTF_RIGHTUP = 0x10;

                        Cursor.Position = new Point(x, y);                                              

                        if (lbKeys.Items[i].Text.Contains("<LMouse"))
                            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, x, y, 0, 0);
                        else
                            mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, x, y, 0, 0);

Nun wird meine Maus zwar versetzt, aber immer grob in die Mitte am oberen Bildschirmrand.
Die Werte, die übergeben werden klingen ganz gut (z.B. 400:550, 1200:500) jedoch kommt die Maus immer wieder an die falsche Stelle.

Woran kann das liegen? Cursor.Position orientiert sich doch an dem gesamten Bildschirm und nicht an Programmen?!?

Danke für jeden Tipp,
TriB

09.01.2009 - 09:42 Uhr

Fände es auch wichtiger per Gesetz stärker dagegen anzugehen.

Wenn das so einfach wäre. Ein Gesetzt ist nur dann sinnvoll, wenn man dessen Einhaltung auch kontrollieren kann. Und genau das ist nicht der Fall!
Wenn irgendwo in Sibirien ein Server steht, kann der mehr oder weniger ungehindert rausschicken was er möchte.

Schlimmer ist es noch, wenn privat PCs als Spam-Schleuder missbraucht werden.

Da ich auch ab und an solche Nachrichten bekomme, kann ich bei Trilian wunderbar auf den Button "Block" drücken und sehe von dem Kontakt nie wieder was...

Zumindest scheinen die Jungs von ICQ die Viren soweit im Griff zu haben. Im letzten Jahr kamen ziemliche viele Nachrichten von Bekannten, die einen Pfad zu einem "Bild" auf einem Russischen Server verschickt haben....

07.01.2009 - 09:13 Uhr

Guten Morgen zusammen,

danke für die zahlreichen Antworten 🙂
Und genau wie erwartet, war die Lösung simpel wie einfach.

Der ErfinderDesRades hat den entscheidenden Tipp gegeben!
Im Normalfall heißt die Datei und die Klasse gleich. (Standard beim erstellen von VS und so halte ich das auch)
In diesem Fall, waren aber mehrere Klassen vorhanden die das noch undurchsichtiger gemacht haben.

Dann klappt es natürlich nicht mehr, in den Projektmappen-Explorer zu schauen und den Namen der Datei zu verwenden.

Klappt 100 mal und dann kommt die Überraschung 😁

Gruß, TriB

06.01.2009 - 16:45 Uhr

Hi zusammen,

leider habe ich ein etwas älteres Projekt in dem der Namespace und eine Klasse den selben Namen haben.

Da ich aus einer Form ein Event in eben dieser Klasse auslösen möchte, gibt es ein Problem mit den identischen Namen. Intellisense zeigt, das es sich immer um den Namespace handelt und nicht um die Klasse.

"Kein Problem" dachte ich und wollte die Klasse einfach umbenennen. Jedoch wird sie nach dem umbenennen (speichern, Projekt schließen, öffnen...) nicht angezeigt, bzw. wirft einen Fehler wenn ich sie ohne IntelliSense hinschreibe.

Normal fügt man eine Klasse ein, schreibt in die Form: "public KlassenNamen Variablenname;" und fertig ist die Laube...

Kann mir da Jemand einen Tipp geben?
Ich bin mir ja schon fast sicher, das es sich um irgend eine Kleinigkeit handelt 😃

EDIT: gelöst 😃

06.01.2009 - 08:35 Uhr

Hi,

also es wird definitiv am try-catch liegen, das es so lange dauert.

Du hast meiner Meinung nach 3 Möglichkeiten:

for (int j = 0; j < sa2.Length; j++)

Check einfach in der Schleife ab, ob du einen Wert hast oder nicht. Sozusagen IF statt Try.

Alternativ kannst du deine Variable vorbelegen. Das heißt, wenn du nur 10 Zellen hast, soll er eben in die 11. ein leeres Zeichen schreiben.

Gruß,
TriB

18.12.2008 - 09:37 Uhr

Ja das gibt es!
Auf PortableApps gibt es ja zahlreiche solcher Applicationen.
In diesem Falle hat ein Berufsschullehrer Portable Sharp Develop erstellt um vom USB-Stick aus C# programmieren zu können.
(Es reicht natürlich eine Installation ohne PortableApps aus)

Gruß,
TriB

16.12.2008 - 10:03 Uhr

Hallo Ollo,

Leider kannst du in dem Sinne keine Datasets kombinieren.
Was du aber machen kannst, ist über die Berichtsparameter ein Dataset zu Filtern.

Erstell ein Parameter und weise diesem das Dataset1 zu. Es wird automatisch mit dem 1. Wert gefüllt.
Nun schreibst du in das Dataset2 einen Filter auf dieses Berichtsparameter.
(Frag mich aber nicht wie das bei XML geht 🙁 )

So kann man zumindest bei verschiedenen SQL-Datasets eine Werteübergabe realisieren.

Gruß,
TriB

12.12.2008 - 09:44 Uhr

Die Berechnungen in Windows sind sowieso unergründlich 😁

Wahrscheinlich Performance-Gründe die Zahlen einfach abzuschneiden als zu runden^^

12.12.2008 - 09:37 Uhr

Also echt Klasse, was du da gebaut hast.
Da freut man sich ja schon regelrecht darauf sich nochmal zu bewerben 😉

Hab auch eine Kleinigkeit gefunden. Es gibt 2x die Kontaktperson1
Denke aber nicht, das daran das Projekt scheitern wird 😄

09.12.2008 - 14:44 Uhr

Hi Tzetze,

was ist denn "@path"?

Wenn du z.B. mit StartUpPath o.ä. arbeitest, bekommst du den Ort der Verknüpfung und nicht den des Programmes zurück.

Ansonsten sieht der Code für mich völlig OK aus. Bis jetzt habe ich Verknüpfungen immer mit der Interop.IWshRuntimeLibrary.dll erstellt:

WShell shell = new WShell();
                        WShort link = (WShort)shell.CreateShortcut(SpecialDirectories.Desktop + "\\Visual Studio.lnk");
                        link.TargetPath = @"C:\Programme\Microsoft Visual Studio 8\Common7\IDE\devenv.exe";
                        link.Save();

Gruß,
TriB

05.12.2008 - 11:46 Uhr

Hallo Underscare,

auch von mir ein Lob, vor allem für die Idee an sich 😃
Bei mir kommt´s auch zu spät. Aber man weiß ja nie...

Du hast ja ein Feld "Rückmeldung". Da wäre es mir wichtig gewesen, von welcher Art diese Rückmeldung ist (spätere Auswertung) und vor allem ob die Bewerbung zurückgekommen ist.

Damals habe ich etliche Bewerbungen weggeschickt und schätzungsweise knapp unter 50% wiederbekommen.
So könnte man die Unternehmen nochmal an ihre Pflichten erinnern (Sofern es keine Initialbewerbung war).

Die Krönung war, das ich eine Bewerbung gefaltet und ohne Mappe in einem normalen Brief wieder bekommen habe...

04.12.2008 - 09:07 Uhr

Guten Morgen zusammen,

leider kann ich das Problem nur bestätigen...
Wenn es nicht klar ist, welche Office Version oder gar welches Programm der Anwender nutzt, kann man keine saubere/sichere Lösung finden.
Tagelang habe ich auch versucht über den "Senden An - Email Empfänger" Shortcut zu einem Ergebnis zu kommen. Leider ohne Erfolg.
Bei genau diesem Thema ist Google leider wirklich kaputt 😉

Über "mailto:" kann man Mailprogramm unabhängig auf fast jedem System eine Mail erstellen. Nur ein Attachement hinterher zu schieben will einfach nicht.

Bin natürlich gerne bereit mich eines besseren belehren zu lassen 😃

Gruß,
TriB

26.11.2008 - 14:45 Uhr

Hi zusammen,

Für ein Programm habe ich eine Automation.dll erstellt. Diese läuft soweit auch ohne Probleme.
Nun soll diese *.dll auf einem Citrix-Server installiert werden, über diesen die User das Programm benutzen.

Der Installer ermöglicht eine Installation "All Users" und vorher wurde in der Kommandozeile "user /install" ausgeführt (Installations Modus für Citrix).
Die Anmeldung erfolgte als Administrator.

Nun können die User die *.dll ausführen...

Das Problem allerdings ist, das die User irgendwie keine Rechte haben.
Sprich-> soll eine Datei per dll modifiziert werden, gibt es einen Fehler. (Ordner & Dateien haben Schreibrechte)

Gibt man jedem User Admin-Rechte, installiert die *.dll & entzieht anschließend die Admin-Rechte wieder, funktioniert alles wie gewünscht.

Das wäre aber bei einer Vielzahl von Usern oder bei Updates sehr, sehr aufwändig.

Kennt sich damit Jemand aus? Liegt es an Citrix oder dem msi-installer?!

Vielen Dank,
TriB

26.11.2008 - 09:52 Uhr

Hallo zusammen,

das es nicht ohne weiteres möglich ist innerhalb eines Thread auf die GUI zuzugreifen ist klar. Daher habe ich mir die etlichen Beiträge zu [FAQ] Warum blockiert mein GUI? , [ExtensionMethods]CrossThread-Calls oder auch [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke) durchgelesen.

Eine Dateisuche soll ihren aktuellen Stand an den Benutzer übermitteln (Datei Counter, Ordnername...). Mit dem bösen, bösen DoEvents klappt es wunderbar. Aber davon wollte ich gerne weg.

Noch bin ich nicht all zu warm mit Invoke 😕
Wie folgt habe ich dann meinen Code angepasst, es passiert aber einfach nichts.

.....
new Thread(Search).Start();

private void Search()
        {
            if(lblAction.InvokeRequired)
            {
                lblAction.Invoke(new MethodInvoker(Search));
                return;
            }
            lblAction.Text = "Suche...";
            DirSearch(txtFolder.Text);
        }

void DirSearch(string sDir)
      {
            .......
            files++;
            if(lblFiles.InvokeRequired)
            {
                lblFiles.Invoke(new MethodInvoker(Search));
                return;
            }                                
            lblFiles.Text = "Dateien: " + files;
            ......
      }

Das Ergebnis ist, das die GUI zwar nicht blockiert, jedoch die Labels erst nach Ablauf der Suche den letzten Wert zugewiesen bekommen.
Ein Invoke auf die GroupBox auf der die Labels liegen zeigte auch keine Wirkung. Keine Fehlermeldung & keine Änderung...

Kann mich jmd bitte auf den richtigen Dampfer schicken? 🙂

Gruß, TriB

25.11.2008 - 09:12 Uhr

Ist sicherlich kein super Programm, aber dein Control passt da wie "Faust aufs Auge".
--Das Proggie liest alle Dienste mit Starttyp aus und man kann diese starten/beenden, filtern | suchen. Zusätzlich noch die Prozesse und Autostart Einträge--

Nur den Screenshot zu machen, war nicht so einfach. Denn der Zeigt das Control in seinem letzten Zustand (Sprich: wie das 1. Bild.) auch wenn das Control noch seine Runden dreht. Ging aber mit einem eigenen Screenshooter.

EDIT: Ja, ich spare gerne Beiträge. Weltwirtschaftskrise und so...

Mir ist gerade aufgefallen, wenn die CheckedListBox keine Werte bekommt, bleibt das Control stehen. Sobald die Box neu gezeichnet wird (resize...) verschwindet es wieder.
Nur so zur Info. Stört mich jetzt nicht gerade 🙂

24.11.2008 - 08:17 Uhr

Alles was du suchst, findest du unter Projekt->Eigenschaften

Gruß,
TriB

23.11.2008 - 12:46 Uhr

Wenn die Bilder neben der Applikation liegen, kann man sie doch auch gleich fest in die ImageList einbinden...

Ansonsten würde ich aus performance Gründen die Bilder erst in das Programm laden, wenn es nötig ist.
Aus eigener Erfahrung kann ich dir sagen, das im Schnitt ein Bild den doppelten Speicherplatz in der Datei reserviert...

22.11.2008 - 18:48 Uhr

Wieso die Datenbank großartig langsamer sein soll ob da jetzt 10gb Binärdaten drin sind oder nicht ist mir auch nicht klar.

Je größer die Datenbank, desto langsamer: basta! 😉

Das hat sehr viele Faktoren. Gerade bei einem MS SQL-Server.
Zum einen liegt es an der Speicherposition. Es werden für Tabellen Speicherplätze vorreserviert um auf der/den Platten die Daten schneller lesen zu können.
Wird der Speicherplatz überstiegen, werden die Daten umgeschichtet, ect.

Desweiteren führt so ein SQL Server Statistiken, die den Zugriff beschleunigen sollen.
Das kann natürlich (gerade bei Dateien) zum Gegenteil ausarten.

Hat man nur eine Indexierung in der Datenbank und die Dateien auf der Platte, sollten nicht so viele Nebentätigkeiten ausgeführt werden.

20.11.2008 - 15:14 Uhr

Das klingt gut, vorallem die Erweiterung!

War das 2. was ich bemerkt habe^^
Wird z.B. ein Container mit Inhalt (ListBox...) benutzt, versteckt sich die Animation dahinter.

Viel Erfolg!

EDIT:
Verdammt Praxissemester, du hast Recht!
Ich habe mich schon beim Debuggen gewundert, das mein Programm nach dem Close immer noch im Debug-Modus ist.
Dachte erst, das liegt daran, das ich ziemlich viel von der Form überschrieben habe,
ist aber dann wohl das Control.

20.11.2008 - 13:37 Uhr

Hey gordon,

habe das Tool eben heruntergeladen und getestet.
Sieht super aus!

Das ist das Optimale, wenn man eine Form mit mehreren Buttons hat, die alle verschiedenste längerfristige Operationen ausführen. So kann der User sofort erkennen, das da noch ein oder mehrere Prozesse laufen.

Dankeschön!

EDIT:
Habe jetzt das ganze mal in einem eigenen Projekt eingebunden.
Leider "Enabled" es mein Control aber nicht wieder...
Hast du eine Ahnung woran das liegt?

ControlAnimator.startAnimating(this.lbSql, ControlAnimator.DrawMode.Dots, (int)5, (int)15, (int)3, Color.Blue);            
            new Thread(TestThread).Start();                        
            ControlAnimator.stopAnimating(this.lbSql);
20.11.2008 - 10:35 Uhr

OMG, was ein Bash-Thread.....

Also, als erstes solltest du uns mal genau verraten, wofür dein Programm nun da sein soll.
Ist das -dein- Stundenplan, den du dir hübsch zusammenstellen und konfigurieren kannst? Ist er für einen einzelnen Lehrer? Für ne Schule ist er ja nicht...

Denn ohne zu wissen, was das Programm machen soll und wie die spätere Verwendung aussieht kann dir keiner so richtig helfen.

Was aber schonmal klar ist, ist das dein Datenbankschema sorry Schrott ist. 😁
Es gibt einige Regeln um Gleiche Datensätze auszuschließen und die Redundanten Daten auf ein Minimum zu reduzieren.
Das hat den schönen Effekt, das man eine klare Linie in der DB erhält und vorallem ohne String-Splitting auskommt. Ein Absolutes "No-Go" in Datenbanken.

Aber um das jetzt hinzubekommen ist das Forum ja da 🙂

13.11.2008 - 15:33 Uhr

Meine Lösung sieht nun so aus, das ich einen Punkt vor die Datei setze.
(Fand ich etwas besser als ein Leerzeichen)

Es werden zu erst alle Dateien nach einem Punkt durchsucht und dieser gelöscht:

if (Path.GetFileName(dateiName)[0] == '.')
try
           {                            
                 File.Move(dateiName, dateiName.Replace("\\.","\\"));
           }...

und anschließend natürlich der ausgewählten Datei der Punkt hinzugefügt.

Der Versuch die Zeichen nach dem niedrigsten zu durchsuchen und dessen ASCII Code einen Wert herunter zu setzten hat sich sehr aufwändig gestaltet. (Keine Sonderzeichen, was wenn es schon das niedrigste ist...)
Diese Lösung ist in wenigen Zeilen geschrieben und funktioniert wunderbar 🙂

12.11.2008 - 14:51 Uhr

Hallo zusammen,

ein kleines Tool zeigt alle Dateien aus einem Ordner an.
Diese werde in der Reihenfolge angezeigt, wie sie eingelesen werden.
Das mache ich per Directory.GetFiles() und die Dateien sind in Alphabetischer Reihenfolge. (Windows standard)

Mein Problem:
Es soll nun möglich sein, eine Datei auszuwählen, die als erstes angezeigt werden soll.
Den Dateinamen zu ändern geht, dazu muss ich aber schauen was das kleinste schon vorhandene Zeichen ist, und dieses dann (char--) heruntersetzen.

Eine Andere Möglichkeit wäre eine Textdatei mit dem Namen der anzuzeigenden Datei.
Wäre aber eher eine Notlösung, da viel Quelltext geändert werde müsste und noch mehr abgefangen (umbenennen, löschen...)

Kann mir jemand einen Tipp geben, wie ich da am besten herangehen kann?

Dankeschön,
TriB

11.11.2008 - 13:39 Uhr

Um sein eigenes Adressbuch auszulesen ist es per Microsoft.Office.Interop.Outlook möglich:

Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();
Outlook.MAPIFolder contacts = (Outlook.MAPIFolder)oApp.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts);

one.Text = foundContact.FirstName;
two.Text = foundContact.LastName;
three.Text = foundContact.Email1Address;

Simpel wie einfach 🙂

Gruß,
TriB

07.11.2008 - 11:46 Uhr

Bzgl. EDIT. Deine zwei "Möglichkeiten" haben aber nichts mit der Problemstellung zu tun.

Wie leicht man so ein Großgeschriebenes "pro" mal überlesen kann...
Hatte mich schon gewundert warum du ein SubSelect benutzt hast 😉

Wer lesen kann, ist klar im Vorteil 😁

07.11.2008 - 11:39 Uhr

Entweder benutzt du eine Automation aus Navision heraus und übergibst dieser die MAC Adresse.
Sprich -> ein Button in NAV der eine von dir programmierte *.dll startet.
MSDN Bsp.

Oder du musst den NAS Server ansprechen um aus einem Programm die Daten aus der *.fdb aus zu lesen.
Dafür gibt es Schnittstellen, die von MS bereitgestellt werden. Stichwort: ODBC
In diesem MIcrosoftBUsinessSOlution Forum kannst du bestimmt ein paar Beispiele finden:
Mibuso Forum

Viel Erfolg,
TriB

EDIT: Wenn du zu einem Ergebnis per ODBC kommst, kannst du es hier gerne Posten. Versucht habe ich es so selbst auch noch nicht 🙂

06.11.2008 - 15:54 Uhr

Da gäbe es mehrere Möglichkeiten:

Entweder die Datensätze "Descending" sortieren und den 1. Auslesen
SELECT TOP (1) LogDateTime FROM...

Den Datensatz mit SELECT MAX(LogDateTime)... auf den richtigen Datensatz beschränken
(Die anderen Felder müssen dann in die GroupBy Klausel)

Oder du löschst die "falschen" Werte aus dem Select heraus. Möglich durch ein SubSelect.

Gruß,
TriB

EDIT: Da war einer schneller, aber ich zeige hier ja noch 2 andere Möglichkeiten auf 🙂

05.11.2008 - 15:13 Uhr

Ein Dienst ist ja keine Form, daher wird er sowas auch ignorieren.
Eine MessageBox kannst du ja auch nicht ausgeben, sondern Fehler nur im Log protokollieren.

Normalerweise erstellt man zur Konfiguration eine weitere Datei, die dann die Einstellungen an dem Dienst vornimmt. Darüber könntest du dann auch dein NotifyIcon anzeigen lassen.

--Soweit habe ich das zumindest mit den Diensten verstanden--

04.11.2008 - 09:12 Uhr

Keine deutsche Prüfung -> keine deutschen Bücher.

Kann man bei den Preisen bei MS ja auch kaum erwarten... 😜

Bei mir steht es auch noch an, aber ich lasse mich da mal mehr oder weniger überraschen. Die Grundlagen habe ich drauf und nach einer Anmeldung zum Zertifikat kann man eh die Übungen und Probeaufgaben online machen. Dann bekommt man einen guten Überblick, wie auch die Prüfung ablaufen wird.

Gruß,
TriB

04.11.2008 - 09:00 Uhr

Tu das aber besser nicht, da die Deutsche Sprache ein paar Funktionen nicht mehr unterstützt.
Z.B. Installer erstellen (Man muss per Hand die Sprache des Installers auf Englisch zurücksetzen, dann geht´s) oder man kann keine Felder mehr Einkapseln oder andere Codesnippets nutzen.

Warum weiß ich nicht, aber VS+Deutsch+Servicepacks ist ziemlich bescheiden...

31.10.2008 - 10:31 Uhr

Leider bist du einen Tag zu spät....

Das hier wäre sicherlich Interessant für dich gewesen:
CodeWeaver

Gruß,
TriB

29.10.2008 - 09:18 Uhr

Also die normale Kollisionsberechnung ist ja simpel wie einfach 🙂

Stößt du an eine Wand, musst du die Richtung wechseln. Der Winkel bleibt gleich.
Du hast ja eine X und eine Y Koordinate, mit der du die Richtung bestimmst.
Für diese beiden Koordinaten benötigst du noch eine Bewegungsrichtung.
z.B. speedX & speedY.
Stößt du an eine Wand (posX ≥ Oberkante) dann invertierst du den Zähler von speedX++ zu speedX-- (oder andersherum).

Damit kannst du den Ball in 8 Zeilen Code schon im Quadrat springen lassen.

Nun fliegt der Ball immer im 90° Winkel. Das soll er natürlich nicht machen,
also musst du z.B. beim Auftreffen des Balles auf den Player den speedY erhöhen oder verringern.

Alles andere kommt sicherlich dann von alleine 🙂

Für anschneiden ect. solltest du natürlich besser nach fertigen Libarys suchen!

27.10.2008 - 16:57 Uhr

Die Grundlage hat die JAck30lena schon gegeben.

Nun musst du nur noch den Pfad z.B. "\127.0.0.1\Ordnername\programm.exe" benutzen.
Wenn der PC, Ordner oder die Datei nicht vorhanden ist, stürzt das Programm ab. Um dies zu vermeiden solltest du den Teil in einen try-catch Block setzten.

Weiterhin sollte der Ordner außer der Freigabe am besten noch Schreibrechte besitzen.
(Da hatte ich sonst manchmal Probleme)

Gruß,
TriB

27.10.2008 - 16:47 Uhr

Hi ihr beiden,

ohne herbivore in den Rücken fallen zu wollen...
Genau das selbe Problem habe ich auch gehabt. Als ich die Funktion von Image.FromFile auf FileStream umgestellt habe, ging es problemlos.

Auch wenn es lt. Doku "richtiger" ist, meiner Meinung nach bereitet die FromFile-Funktion nicht replizierbare Probleme.

Bei einem Bildbetrachter mit Vor-, zurück-, löschen- und drehen-button habe ich vor jeder neuen Aktion ein Dispose auf die Image-Variable, sowie auf PicBox.Image ausgeführt und in unregelmäßigen Abständen diese Fehlermeldung erhalten.
Mit FileStream läuft es nun Fehlerfrei...

Gruß,
TriB

24.10.2008 - 09:07 Uhr

Ich würde character nehmen. Das passt IMHO am besten.

Solange man das nicht mit dem Buchstaben verwechselt 😉

Attributes ist schon das beste oder je nach Verwendungszweck characteristics.
Qualities, features oder criteria sollten je nach Ausdrucksweise verwendet werden, sonst versteht man´s falsch.

Sonst gibt es noch spezielle technische Synonyme, die man dann für den Einzelfall aussuchen sollte...

Was soll es denn werden? Ne Doku? Da solltest du aber eher die selben Wörter verwenden, damit der User nicht total verwirrt wird 😁