Laden...
S
suny myCSharp.de - Member
Informatiker Thüringen Dabei seit 09.11.2004 127 Beiträge
Benutzerbeschreibung

Forenbeiträge von suny Ingesamt 127 Beiträge

11.04.2013 - 08:51 Uhr

Ok, das habe ich nicht gewusst.

Aber der Weg bleibt gleich, HTML parsen und in XAML umwandeln und dann als ChildUIElemente in die Textblock hängen.

Beispiel Convert HTML To XAML (mit FlowDocument)
http://code.msdn.microsoft.com/windowsdesktop/Converting-between-RTF-and-aaa02a6e#content

Du müsstest nur die Convertierung so anpassen das dann Liste von XAML UIElemente raus kommt.
http://stackoverflow.com/questions/7277199/can-i-display-a-flowdocument-or-equivalent-on-windows-phone-7

10.04.2013 - 09:57 Uhr

Ja, ich würde eine Synchronisation verwenden.
Bei allen 3 Varianten benötigst du eine feste IP-Adresse oder zumindestens eine Namensauflösung für deine dynamische IP-Adresse. Du hast ja eine Fritz!Box, diese kann schon verschiedene Dienste ansprechen, die deine dynamische IP-Adresse in einen Namen umwandeln können (DynDNS ist einer dieser Dienste.).

Dein Client muss ja eine Verbindung zu dem Service aufbauen, egal ob das der Web-Service oder der VPN-Service oder der Datenbank-Service ist. Hier für benötigt der Client die IP-Adresse, die kann durch eine Konfiguration vorgegeben sein oder durch eine Dynamische Namensauflösung (DNS) ermittelt werden.

09.04.2013 - 09:46 Uhr

Hallo Cannon,

da du nicht genau dein Szenario erklärst, gehe ich davon aus dass du eine verteilte Anwendung erstellen musst, die in verschieden Standort der Firma laufen soll.

@Variante 1)
Auch hier benötigst du eine IP-Adressen Auflösung (siehe Variante 2) um eine VPN Verbindung aufzubauen. Stellt aber einen hohen administrativen Aufwand dar.

@Variante 3)
Hiervon würde ich dir aus Sicherheitsgründen abraten, hier muss mind. eine VPN Verbindung da sein über den der Datenaustausch läuft. (siehe Variante 1).

@Variante 2)
Das ist an sich die die flexibelste Lösung. Die Datensynchronisation kann dann über verschieden Techniken laufen. (SQL Server Mergereplikation with Websyncgronisation, Sync Framework, ...)
Auch hier benötigst du eine IP-Adressen Auflösung, die kann man über verschiedene Wege erreichen

  • Dynamische Auflösungen via DNS (DynDNS) = kostenlos
  • feste IP-Adresse = kostet bei den meisten ISP

Was hier die größte Herausforderung ist, ist die Sicherheit.

  • Wie sichert man den Transportweg ab?
  • Wie stellt man sicher das nur bestimmte Clients den Service aufrufen dürfen?

Hier würde ich das Geld für ein SSL Zertifikat ausgeben, damit hat man schon mal eine gewisse Grundsicherheit drin.

Ein Webservice ist in der Architektur eine Fassade, der Client interessiert sich nicht für die Implementierung hinter der Fassade. Somit kann man die Speicherung der Daten leicht ändern (Dateibasiert oder unterschiedliche Datenbankmanagementsysteme).
Hier zwei Links zu einem Blog der sich mit den Sync Framework beschäftigt.
http://blogs.msdn.com/b/ploeh/archive/2008/08/26/n-tier-synchronization-with-the-sync-framework-and-wcf-channelfactory-part-1.aspx
http://blogs.msdn.com/b/ploeh/archive/2008/08/27/n-tier-synchronization-with-the-sync-framework-and-wcf-channelfactory-part-2.aspx

23.01.2013 - 15:49 Uhr

Hallo Endro,

normaler Weise ist das schon beim xaml dabei.
Width=""
Hight="
"
Bei den entsprechenden Controls.
Wenn das Fenster dann größer gezogen wird, vergrößern sich auch die Controls.

Aber das Löst nicht dein Problem, du musst auch die Schriftgröße ändern.

Ich muss mal schauen, ich hatte diese Anforderung schon mal von einem Kunden.
Der wollte das der Mitarbeiter die Schriftgröße im Programm ändern kann.


mfg
Steffen

23.01.2013 - 12:00 Uhr

Hallo muntablues,

Ok, wenn du komplett Geräteunabhängig sein willst, dann kannst du nur HTML benutzen. Damit spart sich der Benutzer die Installation von einer spezifischen Software.

Aber wenn du Geräteunabhängig sein willst, dann kannst du deine Fragen 1 und 2 vergessen.
Was ist, wenn der WLan Adapter abgeschaltet ist?
Was ist, wenn das WLan eine Identifizierung benötigt? (Username / Password)

Der DNS Server ist auch nicht notwendig, da dieses der Router vom WLan übernimmt.
Dieser beantwortet ja die Frage "Wie ist die IP-Adresse von der Domäne 'jukebox.now' ?". Wenn der Router das selber nicht beantworten kann, dann fragt er beim Internet Service Provider nach.

Nur mit entsprechender Software auf dem Endgerät, kannst du die Punkte 1 und 2 machen. Diese Software kann ja Teil der App sein.

  • Prüfen ob eine Verbindung zum Netzwerk besteht. => Netzwerk Adapter in Betrieb nehmen ggf.
  • Senden eines UDP Paketes um heraus
    zu finden ob die entsprechende Server Software im Netzwerk erreichbar ist.

Aber du möchtest Geräteunabhängig sein, daher kannst du dort keinen Einfluss nehmen.


mfg
suny

23.01.2013 - 10:14 Uhr

Hallo muntablues,

ich verstehe nicht ganz warum du einen Webserver in deine Software einbauen willst.

Wenn ich dich richtig verstehe, willst du eine Voting Plattform machen. Ich würde da wie folgt vorgehen.
Die ganze Geschäftslogik würde ich hinter einem WCF Service verstecken.
In der Geschäftslogik ist dann enthalten wie du ein "vote" interpretierst.
Dann kann man als nächstest eine ASP.Net WebApplication bauen, die den WCF Service nutzt. Über "WURFL" http://wurfl.sourceforge.net/ kannst du ja erkennen um was für ein Endgerät es sich handelt, und kannst entsprechen diesem den entsprechenden StyleSheet benutzen (CSS).
Und in den weiteren Schritten kann man dann die verschieden App´s für die verschieden Plattformen bauen, die wieder rum nur den WCF Service benutzen.

Deine Aussage, das man für jede Plattform das Rad neu erfinden muss stimmt nicht.
Durch die Kapselung der Geschäftslogik in einen WCF Service, kann ich diese auf jeder Plattform nutzen, mit unter schiedlichsten Sprachen (.Net, Java, Jscript, PHP).
Bei der Oberfläche gebe ich dir bisschen recht, aber auch dort muss man nicht alles neu erfinden.
siehe Mono-Projekt -> Xamarin
.Net + Apple Ios http://xamarin.com/monotouch
.Net + Android http://xamarin.com/monoforandroid
Windows Phone / Windows App können ja nativ in Visual Studio


mfg
suny

23.01.2013 - 08:57 Uhr

Wenn ich dich richtig verstehe, dann willst du ein Foto (was eingescannt ist) prüfen ob in den Ecken eine Rot Verfärbung auf tritt.

Ich würde hierfür die Bitmap.GetPixel Methode verwenden. Hier bekommst die Farbe (als Strucktur "Color") zurück.
Dann kann man prüfen ob die RGB Werte eine zu großen Rot Anteil hat.
Dazu musst du aber eine Fläche prüfen.
Wie groß die zu prüfende Fläche ist, kannst du ja selber festlegen.

  • 10 x 10 Pixel oder 20 x 20 Pixel

Erst wenn in der Fläche zuviel Rot enthalten ist, kannst du dir sicher sein das dort eine Rot Verfärbung ist.

Bitmap.GetPixel-Methode

22.01.2013 - 14:20 Uhr

Hallo *,

wenn ich das richtig verstehe, dann hast du einen ETL Prozess. Hier für bietet der SQL Server die Integration Services (SSIS).
Über den SSIS kannst du ein Paket erstellen welches alle deine Schritte macht.
SSIS-Pakete sind so ähnlich wie die Workflow Foundation.
Dort kannst du auch im 2012 C# verwenden (im 2008 war nur VB.Net möglich).

Das Paket legst du dann auf dem entsprechenden Server ab, und erstellst einen SQL Agent Job dafür. In dem Job sollte keine Zeitplanung sein.

Den Job kannst du dann über deinen Taskmanager starten, in dem du folgendes SQL Statement absetzt.

"exec sp_start_job @JobName;"

Der Aufruf ist innerhalb des SQL Server async., damit meine ich die Prozedure warte nur so lange bis der Job erfolgreich angelaufen ist und gibt dir sofort wieder eine Antwort.

05.10.2006 - 15:16 Uhr

Hallo

versuche es mal mit einem SQL Statment.

Select Count() as AnzahlDS, Max(ID-Feld) as MaxID, Min(ID-Feld) as MinID
From <Tabelle>
Group by <alle Felder außer das ID-Feld>
Having (Count(
) ≥ 2)

Dann bekommst du alle Datensätze die doppelt in der Tabelle drin sind, mit entsprechenden ID´s.

05.10.2006 - 14:43 Uhr

Hallo,

Ich würde den Wiederherstellungsmodus schon auf Vollständig lassen, bzw drauf stellen.
Aber das TLog sollte auch mal gesichert werden.
Dann wächst die Tlog Datei nicht so schnell an. Da beim sichern der TLog der gesicherte Bereich wieder freigegeben wird.
Die Datei sieht dass zwar im Dateisystem riesig aus, ist aber fast nicht gefüllt.
Das Kann man sich auch anzeigen lassen über den Enterprise Manager.
SQL-Statment zum Sicher der TLog Datei

Backup Log <Datenbank> To Disk = N'<Pfad>.trn'
go

@Performance Problem:

  1. Was sagt das ErrorLog des SQL Server?
  2. Wie ist die Fragmentierung des Dateisystems, wo die Datendatei / Logdatei liegt?
    -> Wichtig die Logdatei, da die zuerst geschrieben wird. (Unabhängig vom Recover Modus)
  3. Wie ist die Fragmentierung der Indexe? (Ich gehe mal davon aus das es Indexe gibt)
  4. Wieviel User (Connection sind normaler weise offen) nutzen den SQL Server, und wieviel RAM hat dieser?
  5. Darf der SQL Server den Speicher selber verwalten?
  6. Wie schnell ist der Netzwerkanschluss?
  7. Wie wird der Server aufgelöst? (DNS oder IP Adresse)

Das Tlog verkleinern bringt relativ wenig, da der SQL Server mal den Platz gebraucht hat, und dann kann er immer wieder den Platz brauchen. Ich habe die erfahrung gemacht das das OS nicht schnell genug Plattenplatz zur Verfügung stellen kann, darum versuche ich das TLog immer in einer anständigen Größe zu lassen, in Abhängigkeit zur Datendatei. (OK 4,5 GB ist schon groß.)

01.09.2006 - 21:47 Uhr

SUPPER

DANKE, das du deine Lösung nochmal gepostet hast.

Ich hatte einen ähnlichen Fehler und es lag genau daran.

12.02.2006 - 19:58 Uhr

Hallo ajloon

Aber du kannst doch die Version ermitteln mit
ExcelObjekt.Application.Version, und dann sagst du das erst ab Excel ab der Version 9 unterstützt (Office 2000 meiner Meinung nach) unterstützt wird.
Zwischen Office 2000 und Höher gibt es nicht mehr die Version Probleme, beim Ansprechen von Excel (nur noch das Dateiformat was sich immer geändert hat, aber die API ist die gleiche).

12.02.2006 - 18:25 Uhr

Hallo amorph,

Die Sortierungssplate ist meiner Meinung nicht notwendig, da man das auch schon mit dem SQL-Statement machen

Select .... From .... [Where...] Order by Bezeichnung -> das Sortiert Bezeichnung von A nach Z

Select .... From .... [Where...] Order by Bezeichnung Desc -> das Sortiet Bezeichnung von Z nach A

Und jenach dem was der Benutzer ausgewählt hat holt man sich so die Datensätze. Falls er sich erst entscheidet wenn der Baum schon aufgebaut ist (nach dem er schon Knoten geöffnet hat) dann brauch man ja nur den letzen Knoten neu laden entsprechend wie der Benutzer das will. Dabei sollte man sich aber merken auf welchem Unterknoten er momentan steht um nach dem erneuten aufbauen des Knoten auch wieder den Unterknoten auswählen zu können.

Leider habe ich momentan kein Codebeispiel zur Verfügung.

12.02.2006 - 17:39 Uhr

Hallo

wenn ich dich richtig verstanden habe, dann brauchst du nur eine Tabelle
mit der folgenden Strucktur.

Feld Datentyp
ID Int, Auto-Int, oder GUID <das was du als Primarykey einsetzen möchtest>
Beschreibung Tex
RefID <gleicher Datentyp wie dein Primarykey>

Die Datensätze würden dann so aus sehen
ID------Beschreibung----RefID
1------------LaLa---------<Null>
2------------unter LaLa-----1
3------------LiLi-----------<Null>
4------------unter LaLa-----2
5------------unter LiLi-------3

Da durch kannst in einer DB eine Baumstruktur nach stellen.

Das Ergebnis sieht dann so aus
+LaLa(ID = 1)
---+unter LaLa(ID = 2)
------+unter LaLa(ID = 4)
+LiLI(ID = 3)
---+unter LiLi(ID = 5)

Wenn du was verschieben willst (Drag&Drop) brauchts du nur die RefID ändern.
Und du brauchst die Unterknoten erst laden wenn der Benutzer drauf klickt dadurch ist das Programm schneller beim Starten. Weil erstmal nur die RootEbene(alle die Datensätze die in RefID = Null sind) geladen wird. Und Beim Klick auf den Knoten lädst du den Rest nach. Am besten hängst du an den Knoten auch die ID in die Eigenschaft "Tag"

12.12.2005 - 16:29 Uhr

Hallo zusammen,

Wie bekommt denn das Dataset seine Daten?

Ich würde das in DB machen mit einer Def Tabelle, so wärst du auch flexsibel, wenn auf ein mal die Farbe Gelb mit auf genommen werden soll.

Datengrundlage des Datasets:
Select Table1.*, DefTable1.Bez From Table1, DefTable1 Where Table1.FarbeID = DefTable1.ID;

Hat aber einen Nachteil, die Update Funktion des Datasets klappt nicht mehr da die Datengrundlage auf mehrere Tabellen basiert.

Das mit der Spalte im Code hinzufügen halte ich für nicht so performat. Bei 100 Datensätzen mag das gehen.


Public enum Farben
{
Rot = 0;
Grün = 2;
Blau = 3;
}
...
myDS.Tables("x").Columns.Add("<Feldbezeichnung>",GetType(String));
DataRow myRow;
For each myRow in myDS.Tables("x").Rows
{
   myRow("<Feldbezeichnung>") = (Farben) myRow("FarbenID");
}
myDS.AcceptChanges();
...

Enschuldige wenn die Syntax nicht ganz richtig ist aber isch schreibe mehr VB.Net 🙁

21.07.2005 - 21:10 Uhr

Original von Scarface
Versteh ich nicht. Wenn sich die Logik ändert muss ich zwar die Methoden umschreiben. Die können doch aber ihre Namen behalten. Die musste ich ja sowieso selber da rein schreiben.
Ob ich da nun ein Interface für hab oder nicht ist da doch egal, oder hab ich dich falsch verstanden?

Nun stell dir aber vor das eine neue Klasse hinzukommt die auch die gleichen Methoden haben soll. Über das Interface ist dann gewährleistet das das in allen Klassen die Methoden gleich heißen und du so deinen VB 6 Code nicht mehr ändern musst. (so kann man dan beide Klassen ansprechen ohne den Code zuändern)

Ich versuche es mal an einem Beispiel:

public interface IAuto
{
float GetMaxGeschwindigkeit()
}

public class Trabbi : IAuto
{
public float GetMaxGescwindigkeit()
{
return 100;
}
}

public class Ferari : IAuto
{
public float GetMaxGescwindigkeit()
{
return 300;
}
}

Tipp schau dir mal den PlugIn-Patter an der zeigt sehr gut zu was man Interfaces einsetzt. (Sollte hier im Forum auch mehrere Beiträge geben)

04.04.2005 - 21:02 Uhr

Na ja ich bin mir nicht sicher ob ein Report die Binäry Daten richtig interpretieren kann.

Wo soll er den wissen ob das Bild ein gif, jpg, png , u.s.w. ist. Ich denke schon das Crystal Report ein Steuerelement besitzt was Bilder darstellen kann wie es die Bilder aber erhält (als Pfad oder Binär) keine Ahnung.

Aber eins weis ich MS Access kann Bilder in Berichten machen, dort gibt es ein Steuerelement. Und deshalb denke ich schon das es Crystal Report auch kann.

04.04.2005 - 20:07 Uhr

@BillTuer:

also ich denke das wenn du das Hide() nicht benutzt dann geht das wie du es willst.
Also wenn es minimiert dann zeige das TrayIcon an, wenn TrayIcon doppelklick dann wieder Fenster vergrössern und TrayIcon entfernen.

Ich hoffe ich habe dir da geholfen.

04.04.2005 - 19:59 Uhr

Ich verstehe das so das der Namespace "Generic" nicht Abwärtskompatible ist,
da MS ja einen anderen Weg gegangen ist als Sun mit Java.

Aber was ich mir noch Vorstellen kann, das der Namespace noch nicht
standardisiert ist. Und somit wollen sie nur sagen das sich da noch was tun kann.

04.04.2005 - 14:19 Uhr

Also prinzipell kannst du Bilder in einem Dataset speichern. (sind dann Blob´s)
Du musst die Bilder als Binärstream öffnen und komplett ein lesen. Dann solltest du ein Byte Array erhalten und dieses kannst du dann in ein Dataset(Zelle) rein tun.

Ich weiß aber nicht ob Crystal die BinäryDaten dann auch als Bild interpretiert.

Es wäre vielleicht leichter, wenn du den Pfad zu den Bildern generieren kannst und diesen dann dem Report mit übergeben. Und der report läd dann das Bild.

Beispiel:
Bericht für den Artikel x
Der Artikel x gehört zu der Kategorie n. Dann würde der Pfad so lauten
"\Server\Berichte&lt;Kategorie n>&lt;Artikel x>&lt;Nummer aus der DB>.wmf"

14.03.2005 - 08:47 Uhr

Original von pee
Hat wer auf die schnelle eine Kommando Zeile, mit der man MSDE problemlos auf seinen Rechner bekommt, und mir damit eine Stunde Readme Lesen und in Foren suchen erspart?

setup SAPWD="<AstrongSaPAsswd>" TARGETDIR="c:\msde" /L*a c:\msdesetup.log frisst er schon mal nicht.

Bei mir hat der dieser Aufruf geklappt. Ich habe " /L*a c:\msdesetup.log " weggelassen und schon ging es.

11.03.2005 - 15:41 Uhr

Wrapper Klassen sind Klassen die dir die Kommunikation mit nicht .Net Komponenten ermöglichen, so das man auch mit .Net das alte ADO einsetzen kann.(als Beispiel)
Die Wrapper Klassen bilden für dich dann ein Schnittstelle zu der Komponete, sie ummandeln praktisch die Komponete.

Mehr weiß ich leider auch nicht dazu.

11.03.2005 - 15:09 Uhr

Benutze doch #develop Link zur Seite.

Das kann deine VS Solution importieren und dann von VB nach C# übersetzen. Und diesen Code auch wieder als VS Solution exportieren. Dann brauchst du nicht mehr soviel nachdenken, sonder kannst dich dann auf das Testen des übesetzen Codes konzentrieren.

Der Konverter nutzt bei #develop Reflection und kann so fast Fehlerfrei übersetzen.

11.03.2005 - 11:35 Uhr

Also mir ist leider keine andere Downloadmöglichkeit für VS Express bekannt, außer die von MS selber.

11.03.2005 - 10:22 Uhr

Wenn man ein Byte in ein Ascii-Zeichen umwandeln, kann es passieren das das Byte ein Zeichen erzeugt was man nicht sieht. Ascii-Zeichen die sichtbar sind fangen erst bei 32 (int) an davor sind es einfach Steuerzeichen Tab, neue Zeile, Dateiende, u.s.w. (siehe Ascii-Zeichen-Tabelle).#

Aber ich würde dir vorschlagen die Bytewerte in einen int zucasten und diese dann in eine Datei schreiben, dabei musst du dir aber ein Trennungszeichen überlegen (Komma, Semikoln, neue Zeile) damit du unterscheiden kannst wo ein Byte aufhört und wo es anfängt. Das Trennungszeichen kann alles sein, ist deiner Phantasie überlassen, ausser Zahlen natürlich.

11.03.2005 - 09:27 Uhr

Soviel wie ich weiß kann du ja auf die Tabellen im DataSet zugreifen und sagen "gib mir alle die sich geändert haben" (glaube "select"). Und als Ergebnis bekommst du die Rows die sich geändert haben. Dann kannst du ja wieder deine Update-Comandos zusammen bauen und an die Datenbank schicken.

Ich denke nicht das du in ein Update eine Join-Bedingung einbauen kannst, bin mir da aber nicht sicher.

11.03.2005 - 09:11 Uhr

#develop (Version 1 - Fidalgo) unterstützt das .Net Framework 2 nicht, das hat was mit der neuen Struktur zu tun. MS selber sagt das die beiden Frameworks zu einander nich kombatible sind.

#develop (Version 2- Corsavy) wird dann auch nur noch das .Net Framework 2 unterstützen. Diese Version (als Beta) wird wahrscheinlich 1 - 2 Monate nach dem Release des .Net 2 raus kommen.

Diese Infos habe ich aus einem Webcast von MSDN, dazu muss man sich aber dort anmelden. Was ja nicht weiter schlimm ist. Das WebCast heißt: ".Net Entwicklung zum Nulltarif mit #develop" mit Uwe Baumann (gehört zum Stammteam von #develop)

Link zum MSDN Webcast

//EDIT
oh mein Rechtschreibung,
Also wer einen Fehler findet darf ihn beahlten.

10.03.2005 - 16:43 Uhr

Hi,

ich weiß nicht ob es geht. Aber ich bevorzuge da lieber die DBA Tools von den DBMS.
In deinem Fall "MySql" gibt es da ja drei Tools von MySql selber.www.mysql.com

Ich war mit diesen Tools immer sehr zufrieden.

09.03.2005 - 17:07 Uhr

Na ja die Tabelle selber zu analysieren hat den vorteil das du nicht für jedes DBMS seine Besonderheiten beachten musst.
Also Oracle stellt dir dafür zum Bespiel den Sql-Befehl Desc (kommt in dem Fall von Description und hat nichts mit dem sortieren zu tun), beim SQL Server musst du in sysobject Tabelle schauen.

Ich meine was alle DB machen ist, dass bei einem "Select * From <Tabelle>" ein Ergebniss zurückliefern wird und das kann man ja analysieren.

09.03.2005 - 14:51 Uhr

erstelle dir dein DataSet und lasse davon eine Klasse erben diese Überschreibt die Methoden wo dir die Typen nicht gefallen und den rest nimmt es aus der Basisklasse (also deinem DataSet)

So kannst du immer wieder ein DataSet generieren und verlierst deine Änderungen nicht. Bedingung ist natürlich das das generiete DataSet immer gleich heißt.

Ich hoffe das mein Vorgehen so geht, das war jetzt nur so ein Gedanke der mir durch den Kopf geschossen ist.
Dann würdest du zumindestens dem entgehen.

Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.

09.03.2005 - 14:43 Uhr

Hi,

wenn du es universel machen willst, dann solltest du dir die Tabelle durch ein Select holen. Und dann die Columns durchlaufen, dadurch bekommst du die Feldnamen und deren Datentypen. Bei den Datentypen ist aber darauf zu achten das nicht alle Datentypen eines DBMS bei dem anderen DBMS gibt.
Beispiel:
nvarchar -> SQL Server (variabler Text)
Text -> MS Access (variabler Text)
varchar2 -> Oracle (variabler Text)

Wie du siehst ist die Typenbezeichnung nicht immer gleich. Aber ich denke das die gängigsten Datentypen bei allen Unterstütz werden.
(Number, Varchar, Date, Blob)

Weiterhin musst du beachten das die grossen DBMS Schemas benutzen, was zum Beispiel Access nicht tut. Schemas sind Aufteilungen in der DB selber, so das es mehrere Tabellen mit dem Namen "USER" geben kann. (Die eine heißt dann [userx].[USER] und die zweite heißt dann [usery].[USER].)

08.03.2005 - 15:45 Uhr

Hi,

wenn ich dich richtig Verstanden habe ist jede Row ein eigener Kunde für sich. Und du möchtest für jeden Kunden ein Object erstellen.

Also ich würde das mit einer For each Schleife lösen, da bist du auf der sicheren Seite. Und ich würde eine Klasse Kunde erstellen die die Eigenschaften von den realen Kunden im Programm wieder spiegelt. Der Construktor würde dann eine Row entgegennehmen und so die Werte verteilen.


...
clsKunde myKunde;
ArrayList myKundenliste = new ArrayList;

foreach(DataRow aRow in dataset.Tables["Kunde"].Rows())
{
  myKunde = new clsKunde(aRow);
  myKundenliste.Add(myKunde);
}
....

class clsKunde
{
   public clsKunde(DataRow myRow)
  {
    // und hier die Werte den Eigenschaften bzw Feldern zuweisen 
  }
}


Man könnte auch Hashtables als Kundenliste nehmen, die sind schneller im Zugriff.

Na ja ich hoffe ich konnte dir helfen

08.03.2005 - 10:01 Uhr

Hi,
du musst natürlich deinem Projekt sagen das es die dll [x] nutzen soll.
Das geht über Verweise, Verweis hinzufügen.
Dort der Reiter "Net" und dann musst du kurz suchen nach Oracle (ich weiß leider nicht genau wie das Assembly heist), dieses dann auswählen und dann OK.

"using" ist nur für den Programmierer eine Erleichterung, so das er nicht immer "System.xxxx.xxxx" vor eine Klasse schreiben muss und keine Referenzierung auf andere Assembly´s.

Ich hoffe ich konnte dir helfen.

PS.:
Ich gehe davon aus das du den .Net Provider von Oracle auf dem Rechner installiert hast.

07.03.2005 - 14:57 Uhr

int x = 20;
int y = 15;
int Width = 50;
int Height = 10;
TextBox mylabel;

for( int i = 1;i <= 9;i++)
{
 mylabel = new TextBox() ;
 mylabel.Location = new System.Drawing.Point(x, y * i);
 mylabel.Name = "Textbox" + i.ToString();
 mylabel.Size = new System.Drawing.Size(Width, Height);
 mylabel.TabIndex = i;
 mylabel.Text = "label" + i.ToString();
 this.Controls.Add(mylabel);
}

Ich denke dieser Code sollte dein Problem lösen.
Auf die Textboxen kannst du dann durch this.Controls zugreifen. Dabei muss man halt alle Controls durchlaufen bis an das hat was man haben will.

07.03.2005 - 12:50 Uhr

Hi,

nba ich sehe das nicht so, mir hat #Develop noch nie was kaput gemacht. Und ich finde es sogar sehr gut, und bei der Integration von Entwicklertools kann sich da VS echt was abschauen.

Die Beta von VS 2005 habe ich noch nicht so weit getestet um mir da eine Aussage zu erlauben. Nur ich finde es schlecht das der Code von MS geteilt wird. Eigentlich will eine Datei wo mein Steuerelement drin ist und nicht 2 oder 20, nur weil man in bestimmten Funktionen nicht rumfuschen darf. Ich denke jeder Programmierer kann seinen Code schon selber aufteilen und strukturieren.

07.03.2005 - 11:03 Uhr

Hallo,

Wenn ich dich richtig verstanden habe willst du Binärydaten in einer Datenbank speichern (Oracle).
Also ich weiß nicht ob du die Tabellendefinition noch ändern kannst. Es wäre nämlich angebracht auch der Datenbank zu sagen das es Byte sind und keine Char.
Blob -> Binärydaten
Varchar -> Char mit variabler länge

Oracle convertiert deine Bytes in ein Char und das bringt dich raus. Zum Beispiel siehst du das Byte mit dem Wert 9 dann als Tabulartor, das kommt natürlich auf die installierte Default Zeichensatz an "UTF8" (meistens hier zu Lande).

Das Ergebniss von einer Select-Abfrage auf das Feld wäre dann ein Byte-Array.

Korregiert mich wenn ich was falsch verstanden habe.

02.03.2005 - 11:02 Uhr

Dazu must du ein Event erstellen, was public ist. Dann noch eine Methode die den Click der PictureBox abfängt und dein Event auslöst.

Dann kannst du in der Form wo du dein UserControl eingebunden hast, eine Eventhandler auf dein Event setzen und somit merkst du wann in die PictureBox geklickt wurde.

28.02.2005 - 10:59 Uhr

Doch hat sie, diese gilt aber immer für den Rechner und nicht für das Netzwerk. Da Access, nicht dafür gedacht ist, dann soll man doch den MsSql Server kaufen.

Nur der Vollständigkeitshalber, es gibt auch den MsSql Server kostenlos (MSDE), dieser ist aber auf 2GB und 10 Verbindungen beschränkt.

28.02.2005 - 10:36 Uhr

Ok ich würde schon sagen das sich eine Datenbank lohnt, da es dorch einge Variablen sind die zuspeichern sind.

Da es einen zentralen Rechner in dem Netzwerk gibt. Dann schliesse ich mich "herbivore" Meinung zu Datenbank an und empfehle dir da MySql.

Der Wartungsaufwand ist bei MySql etwas höher, da es ein DatenbankManagmentSystem ist, was Access nicht wirklich so ist.

@Verwaltungsaufwand MySql:
Benutzerverwaltung
Also man sollte für jeden realen Benutzer einen Benutzer in der DB anlegen. Man kann auch einen technischen Benutzer für alle anlegen, aber dann hat man das Problem das alle Leute alles dürfen. Wenn das Vertrettbar ist dann ist es auch eine Lösung. Und somit sinkt der Verwaltungsaufwand um einiges, da die Benutzerverwaltung komplett wegfällt.

Sicherung
Dann gibt es praktisch nur noch die Verwaltungsaufgabe "Regelmäßige Sicherung der DB". Aber das hätte man auch bei Access.

28.02.2005 - 10:03 Uhr

Also ich denke das kommt auch noch auf die Größe der zu speichernden Daten an.

Frage : Wieviele Felder(Eigenschaften) besitzt denn dein Auftrag?

Im allg. würde ich schon sagen das es sich lohnt mit einer Datenbank, da du dann gezeilter Zugreifen kannst und nicht überflüssig viel Speicher verbrauchst von Aufträgen die eigentlich fertig sind und nur noch für die Auswertung da sind.

Dann ist es die Frage "Welche Datenbanksystem man haben will?" und "Muss des den lokal auf dem Rechner sein?"

25.02.2005 - 14:34 Uhr

Hi ich nochmal,

hier ein stück Code der das machen sollte, ich hoffe er ist verständlich.


int x = 20;
int y = 15;
int Width = 50;
int Height = 10;
Label mylabel;

for( int i = 1;i <= 9;i++)
{
  mylabel = new Label();
  mylabel.Location = new System.Drawing.Point(x, y * i);
  mylabel.Name = "label1";
  mylabel.Size = new System.Drawing.Size(Width, Height);
  mylabel.TabIndex = i;
  mylabel.Text = "label" + i.ToString();
  this.Controls.Add(mylabel);
}


25.02.2005 - 13:54 Uhr

Hi,

so wie ich dich verstanden habe, willst du wenn der Server läuft grün zeigen und wenn er nicht läuft rot. Und du weißt nicht wieviele Server nun dann im Netzwerk sich befinden.

Also ich würde dir da von Labels abraten, man kann diese dynamisch laden.
(Siehe "InitializeComponent" relativ am ende der Methode)


this.lable1 = new System.Windows.Forms.Lable();
this.SuspendLayout();
// 
// lable1
// [I]<erstellen des Lable>[/I]
this.lable1.Location = new System.Drawing.Point(0, 8);
this.lable1.Name = "myLable";
this.lable1.TabIndex = 0;
// [I]</erstellen des Lable>[/I]
// Form1
// 
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(576, 266);
this.Controls.AddRange(
new System.Windows.Forms.Control[] {this.lable}); // hier wird das Lable der Form hinzu gefügt 
// alternativ kannst du auch [B]this.Controls.Add(this.lable);[/B] nehmen
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

Du musst dann aber immer mit rechnen wo es hingesetzt werden soll. Und da kommt der knackpunkt ist den deine Form den so groß, das du unendlich viele Labels setzen kannst?

Ich würde dir hier zu Listbox raten (am anfang), sollte einfacher sein.
Später würde ich ein DataGrid nehmen, un dort bedingte Formatierung anwenden. dieser Artikel sollte dir dabei helfen

25.02.2005 - 08:57 Uhr

Original von Chief Brodie

Um das zu umgehen musst du in die Datenbank auch Metadaten schreiben womit man später das Bild auch wieder findet.
klar, die pfade - wie oben bereits erleutert...
😉

grtz
chief

Nein das meinte ich nicht.
Ich meinte das es eine eigene Tabelle sein sollte, ungefähr nach diesen Schema.
<Tabellenschema>
ID -> Autoincrement -> Primary Key
Bild -> Blob -> Binärdaten des Bildes
Code -> Varchar(50) -> Kodierung des Bildes (jpg,png ...)
erstellt -> Datetime -> Datum des Eintrages
Beschreibung -> Varchar(255) -> Kurze Beschreibung des Bildes
....
hier könnten noch weitere Metadaten stehen
</Tabellenschema>
Und diese Tabelle dann in die Beziehungen zu den anderen Tabellen stellen.

Der Vorteil davon ist ich brauch nur die DB zu sichern und das war es, da das ja regelmässig passieren sollte ist man dar auf der sicheren Seite. Zweiter Vorteil ist das man das Programm dann auch an andere weitergeben kann ohne das Probleme auftauchen. Stell dir doch mal vor du das der Path bei der Person schon vergeben ist, dann musst du dir Gedanken machen wie man das mit dem Path flexibel halten kann. Diese Gedanken brauch man sich bei der DB Lösung nicht machen.

Das Bild holt man dann als MemoryStream wieder aus der Datenbank und so weit wie ich weiß kann man ein Bild auch von einem Stream öffnen kann.

24.02.2005 - 19:10 Uhr

Binary würde ich jet mal so vermuten
Blob = Binary large Object

Also das Bild als Filestream öffnen und dann bis zum ende lesen und das byte[] in die Tabelle schreiben. Und zum schluss ein Update auf die Tabelle, damit es auch in die Datenbank kommt.

wenn du nicht dringend auf eine solche verfahrensweise angewiesen bist, würde ich dir dringend davon abraten, binäre daten in einer db zu speichern.

Um das zu umgehen musst du in die Datenbank auch Metadaten schreiben womit man später das Bild auch wieder findet.

24.02.2005 - 12:47 Uhr

Ja tue ich.

Sorry, war ein versuch.

24.02.2005 - 12:45 Uhr

Was spricht dagegen den Komprimierungsfaktor gleich auszurechnen?

Also um bei deinem Beispiel zubleiben
400 KB = 100 %
50 KB = Komprimierungsfaktor %

Komprimierungsfaktor =(1-(50 / (400))*100 = 87,5 %

Natürlich kann es dann passieren das das Bild unbrauchbar wird da es zustark geschrumpft ist.

24.02.2005 - 12:13 Uhr

Ich weiß zwar nicht ob es hilft, aber ich weiß das die TV-Karten (digitale / analoge) als Netzwerkarten erkannt werden. Und auch eine IP-Adresse haben.
Das ist zwar VB Code aber damit konnte ich meine TV-Karte (analog) bzw. eine WebCam ansprechen. Die Ansteuerung erfolgt über die Windows-API und den Treibern
Vielleicht hilft es.


Option Strict On
Option Explicit On
Module Module1

#Region "konstante Variablen"
    Public Const WS_CHILD As Integer = &H40000000
    Public Const WS_VISIBLE As Integer = &H10000000
    Public Const SWP_NOMOVE As Short = &H2S
    Public Const SWP_NOZORDER As Short = &H4S
    Public Const HWND_BOTTOM As Short = 1
    Public Const WM_USER As Short = &H400S

    Public Const WM_CAP_START As Short = WM_USER
    Public Const WM_CAP_SET_CALLBACK_ERROR As Integer = WM_CAP_START + 2
    Public Const WM_CAP_SET_CALLBACK_STATUS As Integer = WM_CAP_START + 3
    Public Const WM_CAP_SET_CALLBACK_YIELD As Integer = WM_CAP_START + 4
    Public Const WM_CAP_SET_CALLBACK_FRAME As Integer = WM_CAP_START + 5
    Public Const WM_CAP_SET_CALLBACK_VIDEOSTREAM As Integer = WM_CAP_START + 6
    Public Const WM_CAP_SET_CALLBACK_WAVESTREAM As Integer = WM_CAP_START + 7

    Public Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP_START + 10
    Public Const WM_CAP_DRIVER_GET_CAPS As Integer = WM_CAP_START + 14
    Public Const WM_CAP_DLG_VIDEOFORMAT As Integer = WM_CAP_START + 41
    Public Const WM_CAP_DLG_VIDEOSOURCE As Integer = WM_CAP_START + 42
    Public Const WM_CAP_DLG_VIDEODISPLAY As Integer = WM_CAP_START + 43
    Public Const WM_CAP_SET_PREVIEW As Integer = WM_CAP_START + 50
    Public Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP_START + 52
    Public Const WM_CAP_GET_STATUS As Integer = WM_CAP_START + 54
    Public Const WM_CAP_SET_CALLBACK_CAPCONTROL As Integer = WM_CAP_START + 85
#End Region

#Region "Strukturen"
    Structure CAPDRIVERCAPS
        Dim wDeviceIndex As Integer ' Treiber index in der System.ini
        Dim fHasOverlay As Integer ' Unterstützt die Hardware die overlay-Methode?
        Dim fHasDlgVideoSource As Integer ' Hat der Treiber einen "Quelle-Dialog"?
        Dim fHasDlgVideoFormat As Integer ' Hat der Treiber einen "Format-Dialog"?
        Dim fHasDlgVideoDisplay As Integer ' Hat der Treiber einen "Externen Ausgang-Dialog"?
        Dim fCaptureInitialized As Integer ' Ist der Treiber einsatzbereit?
        Dim fDriverSuppliesPalettes As Integer ' Unterstützt der Treiber Paletten?
        Dim hVideoIn As Integer ' Treiber Eingangs Kanal
        Dim hVideoOut As Integer ' Treiber Ausgangs Kanal
        Dim hVideoExtIn As Integer ' Externer Treiber Eingang
        Dim hVideoExtOut As Integer ' Externer Treiber Ausgang
    End Structure

    Structure CAPSTATUS
        Dim uiImageWidth As Integer ' Breite des Bildes
        Dim uiImageHeight As Integer ' Höhe des Bildes
        Dim fLiveWindow As Integer ' Vorschau des Bildes?
        Dim fOverlayWindow As Integer ' Jetzt das Bild overlayen?
        Dim fScale As Integer ' Bild auf Fenster Grösse skalieren?
        Dim ptScroll As POINTAPI ' Scroll Postiton
        Dim fUsingDefaultPalette As Integer ' Standart Treiber Palette benutzen?
        Dim fAudioHardware As Integer ' Ist die Audio Hardware verfügbar?
        Dim fCapFileExists As Integer ' existiert die Capture-Datei?
        Dim dwCurrentVideoFrame As Integer ' # der aufgenommen Video-Bilder
        Dim dwCurrentVideoFramesDropped As Integer ' # der nicht aufgenommen Video-Bilder
        Dim dwCurrentWaveSamples As Integer ' # der aufgenommen Audio Spuren
        Dim dwCurrentTimeElapsedMS As Integer ' Länge der aufgenommen Sequenz
        Dim hPalCurrent As Integer ' Wird die aktuelle Palette bereits benutzt?
        Dim fCapturingNow As Integer ' Wird bereits aufgenommen?
        Dim dwReturn As Integer ' Fehler-Variable für auftretende Fehler
        Dim wNumVideoAllocated As Integer ' Aktuelle Grösse des Video Buffers
        Dim wNumAudioAllocated As Integer ' Aktuelle Grösse des Audio Buffers
    End Structure

    Structure POINTAPI
        Dim x As Integer
        Dim y As Integer
    End Structure
#End Region

#Region "Windows-API"
    Public Declare Function capCreateCaptureWindowA Lib "avicap32.dll" (ByVal lpszWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Short, ByVal hWndParent As Integer, ByVal nID As Integer) As Integer
    Public Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short, ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, ByVal cbVer As Integer) As Boolean
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Short, ByRef lParam As Object) As Integer
    Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
#End Region

#Region "Weitere Funktionen"
    Function capDriverConnect(ByVal lwnd As Integer, ByVal i As Short) As Boolean
        'Verbinder ein Aufnahmefenster zum Aufnahmetreiber
        capDriverConnect = CBool(SendMessage(lwnd, WM_CAP_DRIVER_CONNECT, i, New Object()))
    End Function

    Function capDriverGetCaps(ByVal lwnd As Integer, ByRef s As Object, ByVal wSize As Short) As Boolean
        'Gibt die Verfügbarkeit der Videohardware an
        capDriverGetCaps = CBool(SendMessage(lwnd, WM_CAP_DRIVER_GET_CAPS, wSize, s))
    End Function

    Function capGetStatus(ByVal lwnd As Integer, ByRef s As Object, ByVal wSize As Short) As Boolean
        'Status des Videofensters bekommen
        capGetStatus = CBool(SendMessage(lwnd, WM_CAP_GET_STATUS, wSize, s))
    End Function

    Function capDlgVideoFormat(ByVal lwnd As Integer) As Boolean
        '"Format" Dialog der Videoquelle anzeigen
        capDlgVideoFormat = CBool(SendMessage(lwnd, WM_CAP_DLG_VIDEOFORMAT, 0, New Object()))
    End Function

    Function capDlgVideoSource(ByVal lwnd As Integer) As Boolean
        '"Quelle" Dialog des Videoeingangs anzeigen
        capDlgVideoSource = CBool(SendMessage(lwnd, WM_CAP_DLG_VIDEOSOURCE, 0, New Object()))
    End Function

    Function capDlgVideoDisplay(ByVal lwnd As Integer) As Boolean
        '"Options"Dialog anzeigen (Helligkeit, Kontrast, etc)
        capDlgVideoDisplay = CBool(SendMessage(lwnd, WM_CAP_DLG_VIDEODISPLAY, 0, New Object()))
    End Function

    Function capPreview(ByVal lwnd As Integer, ByVal f As Boolean) As Boolean
        'Video Stream starten
        capPreview = CBool(SendMessage(lwnd, WM_CAP_SET_PREVIEW, CShort(f), New Object()))
    End Function

    Function capPreviewRate(ByVal lwnd As Integer, ByVal wMS As Short) As Boolean
        'Vorschau Rate (Schnelligkeit der neuen Bilder) feststellen
        capPreviewRate = CBool(SendMessage(lwnd, WM_CAP_SET_PREVIEWRATE, wMS, New Object()))
    End Function

    Function capSetCallbackOnError(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird bei einem AVICap Fehler aufgerufen
        capSetCallbackOnError = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_ERROR, 0, lpProc))
    End Function

    Function capSetCallbackOnStatus(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird bei einer Statusveränderung des Anzeigefensters aufgerufen
        capSetCallbackOnStatus = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_STATUS, 0, lpProc))
    End Function

    Function capSetCallbackOnYield(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird aufgerufen, wenn ein Fehler während der Aufnahme auftritt
        capSetCallbackOnYield = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_YIELD, 0, lpProc))
    End Function

    Function capSetCallbackOnFrame(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird aufgerufen, die Bilder anzuzeigen
        capSetCallbackOnFrame = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_FRAME, 0, lpProc))
    End Function

    Function capSetCallbackOnVideoStream(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird aufgerufen, wenn der Videobuffer voll ist
        capSetCallbackOnVideoStream = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, lpProc))
    End Function

    Function capSetCallbackOnWaveStream(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird aufgerufen, wenn ein neuer Audio Buffer verfügbar ist
        capSetCallbackOnWaveStream = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, lpProc))
    End Function

    Function capSetCallbackOnCapControl(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'Aufnahme-Steuerungs Makro
        capSetCallbackOnCapControl = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, lpProc))
    End Function
#End Region

End Module

Ich habe noch mal ein Beispiel angehangen, konnte es leider auf nicht testen da mir eine Tv-Karte, WebCam fehlt am Rechner.

Na ja ich hoffe das ich euch helfen konnte.

23.02.2005 - 10:50 Uhr

@herbivore:
Ok ich bin mir da in C# nicht so ganz sicher, und habe es mal ausprobiert.


class Test
{
 [STAThread]
 static void Main(string[] args)
 {
  Object myVariable = new Object();
  myVariable = new myClass();
  myVariable.myMethode(); // liefert einen Compilerfehler
  ((myClass) myVariable).myMethode(); // geht
 }
}

class myClass : Object
{
 public void myMethode()
{
 Console.WriteLine("myMethode");
 }
}

Entschuldigung das ich da was falsches geschrieben habe, ich kenne das Late-Binding Konzept von C/C++. Und ich der Meinung bin das es keine schöne Art zu Programmieren ist. Deshalb verwende ich es nicht so gerne.

@Xqgene:
Ja weiß ich, warum ???

23.02.2005 - 09:04 Uhr

@Xqgene
Hier wird geprüft ob der Sender das kann, es kann ja sein das eine Klasse das Ereignis auslöst die nicht die Methode unterstützt. Und somit muss man zur Laufzeit prüfen ob man die Methode ansprechen kann oder nicht.

@herbivore:
nein da sollte kein Compiler Fehler kommen, da das Objekt ja die Methode bereit stellen kann, aber nich muss. Das ist das Problem von Late-Binding, das der Compiler hier keine Fehler entdeckt.