Laden...
T
tomschrot myCSharp.de - Member
Softwareentwickler Herrsching a. A. Dabei seit 26.08.2004 73 Beiträge
Benutzerbeschreibung

Forenbeiträge von tomschrot Ingesamt 73 Beiträge

06.12.2023 - 09:02 Uhr

@Abt: Wenn das alles so doof ist, frage ich mich, warum das dann in C# eingebaut wird? Das C# Team bei MS ist ziemlich konservativ und neuer Syntax kommt nur in kleinen Dosen. Die wissen schon ziemlich genau, was sie tun.

Die NULL Operatoren sind schon sinnvoll, wenn sie richtig eingesetzt werden. Außerdem unterscheidet der Compiler genau zwischen NULLABLE und NOT NULLABLE Code. Dazu enthält csproj <Nullable>enable</Nullable> oder im Code #pragma nullable enable / disable / restore.

11.11.2023 - 12:36 Uhr

@BlonderHans: ja klar, damit MoveNext() nach Reset() aufs 1 (!!!) Element zeigt:

Das Iterator-Pattern verwendet eine Annehmende-Schleife:

        var enumerator = collection?.GetEnumerator ();
        enumerator?.Reset();
        
        while ( enumerator?.MoveNext() ?? false )
        {
            var value = enumerator.Current;
            ...
        }
10.11.2023 - 12:59 Uhr

Ein IEnumerable<T> definiert einen Typ der lediglich eine Funktion enthält, nämlich GetEnumerator() und liefert ein Objekt vom Typ IEnumerator<T>.

Ein IEnumerator<T> ist ein Typ der eine Eigenschaft sowie 2 Methoden enthält:

  • T Current: liefert einen Wert vom Typen T
  • bool MoveNext(): bewegt einen internen Index auf das nächste Element, liefert TRUE solange es Elemente gibt.
  • void Reset(): setzt den Index aufs 1. Element

Dies ist in .NET eine ziemlich geradlinige Implementation des Iterator-Patterns.

Jede Klasse, die einen IEnumerable implementiert, kann in C# mittel der foreach-Schleife iteriert werden. Das ist praktisch, um die Kapselung interner Datenstrukturen/Listen vor dem Konsumenten zu verbergen und entspricht dem Paradigma des "Information Hiding".

p.s. dein Beispiel oben kann nicht funktionieren, da Reset() VOR der While-Schleife stehen muss!

15.05.2023 - 18:24 Uhr

Hallo

Ich hab mal eine Infrastruktur-Klasse erstellt die die oben behandelte Fragestellung erledigt.

Die Klasse ist universell, sprich, kann auf jeden Registry-Key angewendet werden. Zum Spaß hab ich noch eine Funktion zugefügt, die über alle Einträge eines Keys läuft und die Werte dazu liefert. Die Klasse unterstützt Fluent-API und Funktionen höherer Ordnung und kann wie folgt genutzt werden: (ich hab statt IPV6 mal die Hardware abgefragt 😉

Listing Consumer:

const string
    IPV6    = @"SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters",
    IPCOMP  = "DisabledComponents",

    MYPC        = @"SYSTEM\HardwareConfig\Current",
    MAINBOARD   = @"BaseBoardManufacturer"
    ;

RegistryState
.ForKey  (MYPC)
.ValueOf (MAINBOARD, value => WriteLine (value))
.Values  ((@this, name) =>
{
    WriteLine ($"Key: {name} = {@this.ValueOf(name).ToString()}");
})
;

Listing Klasse:


using Microsoft.Win32;

namespace MyApp;

public sealed class RegistryState
{
    //-------------------------------------------------------------------------
    // Static Members
    //-------------------------------------------------------------------------

    public static RegistryState ForKey (string keyName) => new (keyName);
    //-------------------------------------------------------------------------

    #pragma warning disable CA1416
    private static RegistryKey readKey (string keyName)
    =>
        RegistryKey
        .OpenBaseKey (RegistryHive.LocalMachine, RegistryView.Registry64)
        .OpenSubKey  (keyName);
    //-------------------------------------------------------------------------
    // Instance Members
    //-------------------------------------------------------------------------

    public RegistryKey RegKey {get; private set;}
    //-------------------------------------------------------------------------

    private RegistryState (string keyName) => RegKey = readKey (keyName);
    //-------------------------------------------------------------------------

    #pragma warning disable CA1416
    public RegistryState Values (Action<RegistryState, string> emit)
    {
        iterate (RegKey?.GetValueNames(), emit);
        return this;
    }
    //-------------------------------------------------------------------------

    private void iterate (string[] items, Action<RegistryState, string> emit)
    {
        var enumerator = items?.GetEnumerator();

        while ( enumerator?.MoveNext() ?? false )
            emit (this, (string)enumerator.Current);
    }
    //-------------------------------------------------------------------------
    #pragma warning disable CA1416
    public object ValueOf (string name) => RegKey?.GetValue(name);

    #pragma warning disable CA1416
    public RegistryState ValueOf (string name, Action<object> emit)
    {
        emit ( ValueOf(name) );
        return this;
    }
    //-------------------------------------------------------------------------
}

Gruß,

Tom

15.05.2023 - 10:05 Uhr

Na ja,

es gibt schon einige Regeln um Code sauber zu strukturieren.

  • Clean Code
  • Domain Design
  • immer wieder gerne Design Patterns
  • und schließlich Functional Programming
  • mit Funktoren und Monaden

(aufsteigend nach Schwierigkeit geordnet 😉)

und zu guter Letzt, eine ordentliche Portion Erfahrung, welche sich, zugegeben, halt nur im Laufe der Jahre ergibt.

Es ist immer gut, sich mit "alten Hasen" auszutauschen und offen zu sein wie die's machen.

06.01.2023 - 11:35 Uhr

Hallo

Ich habe mir eine Wear OS Smartwatch gegönnt die ich für 2 ganz konkrete Aktivitäten brauche (Segeln & Motorradfahren).
Leider ist die App-Landschaft doch recht übersichtlich, also hab ich mir gedacht, ich kann mir es ja selber programmieren...
(bin ein sehr erfahrener .NET Entwickler mit 20+ Jahre C#)

Mit Xamarin geht das auf VS doch relativ problemlos, auf den ersten Blick. (zumindest im Emulator)

Jetzt die Frage: wer hat evtl. schon Wear OS Erfahrungen und / oder Lust an einem kleinen C# Projekt mit zu arbeiten?
Zu sehen wäre das als ein Lernprojekt, nicht kommerziell, Codebasis via Github.

21.12.2022 - 10:41 Uhr

using System;
using System.Collections.Generic;
using static System.Console;

List<Tier> tiere = new ()
{
	new Katze { name = "Freddy" },
	new Katze { name = "Fibi"   },
	new Hund  { name = "Bello"  },
	new Katze { name = "Isi"    },
	new Hund  { name = "Happy"  },
};

foreach (var tier in tiere)
{
	var prefix = tier switch
	{
		Katze => "Die Katze sagt ",
		Hund  => "Der Hund macht ",
		_	  => ""
	};
	
	WriteLine ($"{prefix} {tier.sprich()}");
}

WriteLine (DateTime.Now);

interface Tier
{ 
	string name {get;set;}
	string sprich();
}

class Katze: Tier
{
	public string name {get;set;}
	public string sprich() => "miau";
}

class Hund : Tier
{
	public string name {get;set;}
	public string sprich() => "wau wau";
}

https://dotnetfiddle.net/ZBMNTX

08.12.2021 - 09:45 Uhr

Kampf dem Spaghetti Code.
Ich schlage Clean Code mäßig vor die Schreibweise mit Umbrüchen Zeilenweise zu verwenden.
Die Lesbarkeit ist besser und via Kommentare können einfach Änderungen vorgenommen werden.
(vertikalen Platz gibts ja genug...)



public readonly string softwareSysteminventoryVersion  = // for property use =>
        Assembly
        ?.GetExecutingAssembly()
        ?.GetName()
        ?.Version
        ?.ToString() 
        ?? String.Empty
        // "Version not defined!"
        ;


07.12.2021 - 17:55 Uhr

Hi

kann das sein, dass diese Frage auf FB auch schon gestellt wurde?
Ich würde das so schreiben (.NET 6, C# 10):


using static System.Console;

const string DATAFILE =".\\my.data";

byte[] data =
{
    32, 32, 67, 67, 32, 32, 32, 35, 32, 35, 32,
    32, 67, 32, 32, 67, 32, 32, 35, 32, 35, 32,
    67, 32, 32, 32, 32, 32, 35, 35, 35, 35, 35,
    67, 32, 32, 32, 32, 32, 32, 35, 32, 35, 32,
    67, 32, 32, 32, 32, 32, 35, 35, 35, 35, 35,
    32, 67, 32, 32, 67, 32, 32, 35, 32, 35, 32,
    32, 32, 67, 67, 32, 32, 32, 35, 32, 35, 32
};

File.WriteAllBytes (DATAFILE, data);

var buf =   File.Exists (DATAFILE)
            ? File.ReadAllBytes (DATAFILE)
            : new byte[]{};

int count = 0;
foreach (var value in buf)
{
    Write ($"{value,2},");
    if (++count % 11 == 0) WriteLine ();
}

WriteLine ($"\r\nOK @ {DateTime.Now}");

08.04.2021 - 11:09 Uhr

Hallo echdeneth

Gemäß UML ist das nicht so wild (obwohl ich persönlich das etwas anders lösen würde, aber okay...).

Die ObserveableCollection ist ein fester Bestandteil der Warenkorb Klasse, und somit als NUR LESEND zu setzen!
Also


public readonly ObservableCollection<Innentür> innentuerliste = new (); *

*kommt drauf an welche C# Version ihr benutzt...

Dekor ist nach UML keine Liste sondern eine Eigenschaft. Das drückt die Zahl 1 am Pfeil aus, es ist nur 1 Element.

Fragt sich, ob Dekor als NULL zu interpretieren ist wenn nicht benötigt, oder leere Standardwerte (besser)?

11.07.2020 - 10:46 Uhr

Oki

Dann probier alt einfach mal Blazor aus.
UI ist halt HTML mit Bootstrap aber eigentlich alles recht gut verständlich.

Nochmal zu deiner ursprünglichen Frage.
Es ist schon möglich mit PWAs Dateien lokal zu halten und zu bearbeiten. Aber halt nicht via Filesystem direkt auf die Platte sondern indirekt. Also erst Upload, der wird dann lokal im Browser Cache gehalten, auch wenn der Rechner Offline ist. GDocs ist ein Beispiel dafür und funktioniert gut. Wobei der Sync via GDrive erfolgt.

Ist das für dein Anwendungsszenario unbedingt nötig?

11.07.2020 - 10:17 Uhr

Hi

HTML und CSS sind keine Programmiersprachen sondern Sprachen um Formate und Gestaltung von Hypertext zu beschreiben.

Eine Programmiersprache beschreibt die Logik eines Programms das auf einer universellen Maschine zur Speicherung und Verarbeitung von (digitalen) Daten ausgeführt wird.
Also schlichtweg ein Prozessor, CPU, AMD, ARM, Intel usw. aber auch eine ausgedachte CPU die es gar nicht als Chip gibt. Dann spricht man von einer Virtuellen Maschine.

WASM ist KEINE Programmiersprache sondern eine Virtuelle Maschine die einen bestimmten OP Code ausführen kann. Um ein Programm für diese VM zu schreiben benötigst du einen Compiler der eine bestimmte Programmiersprache (C, C++, C#, JAVA, Rust, was auch immer...) in den WASM OP Code übersetzt. Das Resultat ist eine Datei (Binärcode) die in den Speicher der WASM VM geladen wird und dann ausgeführt werden kann.

Um also Programme für die WASM im Browser schreiben zu können brauchst du eine Infrastruktur: eine IDE um Programm Code eingeben zu können, einen (oder mehre) Compiler, einen Debugger um auf die Suche nach Fehlern zu gehen.
(Ich benutze dafür VS Code, was ich an dieser Stelle wirklich empfehlen kann.)

Eine WASM Anwendung besteht aus mehreren Teilen:

einem Teil der die Benutzeroberfläche (UI) beschreibt. Das ist i.d.R. der HTML/CSS Teil

die eigentliche Logik des Programms die sich wiederum aus Javascript und WASM Teilen zusammensetzt.

Und, da wir uns ja in einem Vernetzten Szenario befinden, auch noch einen oder mehrere (Web) Server die Daten an die Anwendung ausliefern bzw. empfangen.

Aktuell gibt es meines Wissens nur eine wirklich komplett integrierte Technologie mit der Client seitige WASM Anwendungen gebaut werden können: C# BLAZOR Web Assembly
(deswegen sind wir ja auch auf diesem Forum)

11.07.2020 - 09:41 Uhr

Also ich bekomme ein standalone serverless publish nicht hin:

dotnet publish -c Release -o Y:\TestX

erzeugt im Verzeichnis alle Files, aber die index.html hängt beim laden.

Kann mir bitte jemand auf die Sprünge helfen!?

p.s. ich benutze VS Code und nicht VS...

28.10.2010 - 14:06 Uhr

Pass eigentlich:


           <basicHttpBinding>
                <binding name="MobileSoap" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                    bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>

28.10.2010 - 13:15 Uhr

Hallo,

ich bin quasi am verzweifeln. Seit zwei Tagen krieg ich folgendes nicht hin:

Umgebung ist Win7 Enterprise x64, IIS 7.5, VS 2010 Premium

Ich habe einen bestehenden (zum Test lokalen) Soap ASMX Dienst der erstmal nur 2 Webmethods hat.

string Ping(string anyText)

string ServiceID()

Die Seite läuft unter Framework 2.0.50727.

Die vom IIS lokal verfügbaren Testseiten werden korrekt angezeigt und beim Testen auch korrekt ausgeführt. Ich kann die Methoden auch via Firefox-Plugin "Poster" korrekt ansprechen (via POST):


<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Ping xmlns="http://xxx/">
      <anyText>huhu</anyText>
    </Ping>
  </soap:Body>
</soap:Envelope>

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><PingResponse xmlns="http://xxx/"><PingResult>[28.10.2010 11:25:55]: huhu</PingResult></PingResponse></soap:Body></soap:Envelope>

bzw.

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://xxxxx.Mobile.Service/">xxxxx Web Service Version 0.1, yyyy GmbH</string>

Soweit alles im grünen Bereich.

Jetzt benötige ich einen Client mit dem ich auf den Dienst zugreife. Dazu lege ich in VS ein neues Projekt (WPF, Winform, Konsole...) an und füge einen Verweis zu dem obigen Dienst hinzu. Auch kein Problem, im Projektbaum erscheint der Dienst und die erforderlichen Referenzen werden erzeugt und hinzu gefügt. Der Aufruf einer Methode des Dienstes ist mit der erzeugten Proxy-Klasse trivial:


        private void _Button_Click(object sender, RoutedEventArgs e)
        {
            var client = new MobileSoapClient();
            try
            {
                Write(client.ServiceID());
            }
            catch (Exception ex)
            {
                Write(ex.Message);
                Write("");
                Write(ex.StackTrace);
                Write("");
            }
        }

Und hier liegt der Hase im Pfeffer. Der Aufruf via Client erzeugt immer(!!!) einen Fehler:

Der Inhaltstyp "text/html; charset=utf-8" der Antwortnachricht stimmt nicht mit dem Inhaltstyp der Bindung (text/xml; charset=utf-8) überein. Wenn Sie einen benutzerdefinierten Encoder verwenden, sollten Sie sicherstellen, dass die IsContentTypeSupported-Methode korrekt implementiert ist. Die ersten 1024 Bytes der Antwort waren: "

<html>

&lt;head&gt;&lt;link rel=&quot;alternate&quot; type=&quot;text/xml&quot; href=&quot;/yyyyy/Service/Mobile.asmx?disco&quot; /&gt;  

&lt;style type=&quot;text/css&quot;&gt;  

....

Es wird also nicht das XML des Soap Envelope geliefert, sondern das HTML der ASMX Seite? Ein Kollege hat aus dem WSDL einen Delphi Wrapper erzeugt und getestet was Funktioniert hat. Hier scheint es also irgendwo Probleme mit dem Generator von VS 2010 zu geben? Wer weiß Rat?

Schon mal Danke,
-TS

26.06.2009 - 13:36 Uhr

@fod:

aus oben genannten gründen, leider nein!

@jaensen:

gesten sind so ein ding: mit multitouch & win7 wärs schon was....
aber eher nicht, lieber nur standard OS unterstützung, läuft dann auf mehreren targets.
im prinzip soll ja kein unterschied zwischen maus & fingersteuerung gemacht werden.

die GUI darf dann auch nicht effekt überladen sein (hier blinkts da wuselts)
klar, schlicht, übersichtlich, selbsterklärend (soweit möglich)
FFF eben.

26.06.2009 - 12:12 Uhr

Hallo,

ich denke schon geraume zeit über ein dj projekt nach und glaube das es jetzt an der zeit ist das anzugehen.

dafür suche ich einen gewieften WPF programmierer mit gestalterischem know how der die GUI dafür entwickeln möchte.

das projekt ist zunächst als reines "spass an der freude" zu sehen, ohne kommerzielle interessen! (evtl. Open Source)

wer näheres wissen möchte

DJ Player Projekt

viele grüße,

ts

26.06.2009 - 11:58 Uhr

@Narnaja:

prüfe doch bitte mal deine schreibweise bzw. handelt es sich bei dem von dir gemeinten um

http://www.serato.com/scratchlive

???

@jaensen:

genau, zielgruppe erkannt! kleiner zusatz: touchscreen....

und ja, ich hab schon vorstellungen, die möchte ich im moment aber noch nicht öffentlich preisgeben, sorry.

ich hab auch schon experimente mit wpf durchgeführt und festgestellt das ich mich da halt schon schwer tu. vor allem weil ich kein Blend habe um vernünftig controls zu bauen... X(

außerdem: ein guter DJ ist ja öfter mal auf reisen. im flieger das equipment auspacken um ein set zu probieren stell ich mir schwierig vor. wenn er dann ein vernünftiges tool hätte das auf seinem taschen pc läuft....

26.06.2009 - 09:16 Uhr

edit:

hallo leute,

ok, mir ist bekannt das es bereits ettliche (sehr leistungsfähige) dj tools gibt.
die idee hinter dem projekt ist eine applikation die

-eine revolutionäre neue benutzerführung & oberfläche hat
-und auf einer minimalen HW (->Atom) gut läuft

und, wie gesagt, bräuchte ich jemand der eine GUI mit WPF bauen kann.
natürlich auch jeder andere der erfahrung mit BASS hat....

nix für ungut,

-ts

@herbivore: ja du hast recht, war etwas zu scharf, sorry

25.06.2009 - 12:52 Uhr

@demondriver235:

warum wohl? evtl. liegt es daran das es noch nix vernünftiges für die "kleinen" gibt!?
ich denke die HW ist mittlerweile in der lage das zu leisten....
es geht wirklich darum eine maßgeschneiderte anwendung für kleine pcs zu bauen. nicht nach dem motto läuft auf einem core2 duo ab 3GHz und 4GB doch super. was schlankes eben.

ich spiele schon seit einer weile mit BASS und finde den resourcenbedarf angemessen. es wäre halt auch ein projekt als Proof Of Feasibility. wenns nicht klappt, dann halt eine nummer größer.

was soll sowas können...?
zwei streams abspielen, mischen etc.
pro stream die üblichen controls:
gain, eq, tempo, pitch
evtl. noch fx: phaser, etc.

hier sind wir aber schon im projekt. da wäre konstruktiver input angesagt.

grüße,

tom

24.06.2009 - 17:59 Uhr

Hallo,

nicht ganz so groß! mehr was für "unterwegs"....

stichwort netbook, MID

😉

24.06.2009 - 17:19 Uhr

Hallo,

ich denke schon geraume zeit über ein dj projekt nach und glaube das es jetzt an der zeit ist das anzugehen.

dafür suche ich einen gewieften WPF programmierer mit gestalterischem know how der die GUI dafür entwickeln möchte.

das projekt ist zunächst als reines "spass an der freude" zu sehen, ohne kommerzielle interessen! (evtl. Open Source)

IDE wäre VS 2008 (Expr.)

wer näheres wissen möchte bitte eine nachricht an mich...

viele grüße,

ts

02.09.2008 - 10:02 Uhr

hallo muntablues,

bass ist schon seeeeeeeeehr komfortabel.
fuchst mich aber trotzdem es selber zu basteln... 😉

-ts

02.09.2008 - 09:59 Uhr

hallo michlG,

so gehts natürlich -vielen dank!

wundert mich aber trotzdem das nicht dragndrop...?
(und der inhalt des userc wird im main designer nicht angezeigt, nur ein leerer rahmen...)

-ts

31.08.2008 - 09:58 Uhr

hallo,

sorry aber mal eine dumme frage:
ich erstelle im gleichen projekt ein wpf user control welches sich nicht auf das main form ziehen lässt??

applikation als wpf exe, c# vs2008 express, wpf designer

-ts

31.08.2008 - 09:53 Uhr

hallo muntablues,

ja klar, bei bass bin ich auch schon gelandet. (benutze seit jahren den wmplay -ist mein liebster)

allerdings gibts auch gründe die dagegen sprechen:

warum eine dll + wrapper benutzen von der ich nur 5% brauche
und bass ist ja eigentlich lizenspflichtig wenn ich ein komerzielles produkt bzw. eine shareware bauen möchte (möcht ich ja eigentlich nicht, aber wer weiss....)

dann wäre ja noch der ehrgeiz es selber zu machen... (ist ja auch interessant)

aber im prinzip hast ja recht!

grüße,

ts

29.08.2008 - 09:19 Uhr

hallo muntablues,

im prinzip gehts um ein mini framework zum arbeiten mit mp3 (evtl. auch anderen formaten)

also input->decode->dsp->output etc...

eins hab ich bei meiner recherche gelernt: bei solchen techniken siehts mit .net ziemlich mau aus!

grüße,

ts

28.08.2008 - 17:41 Uhr

Hallo,

ich such mir schon seit tagen einen wolf im www und komm nicht weiter!
vieleicht kann mir ja hier jemand helfen... (bitte, bitte)

Also:

die idee ist eine MP3-datei frameweise zu lesen
(http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm)
was soweit schon klappt.

die einzelnen (mp3)frames sollen vom betriebsystem in PCM gewandelt werden.
(also on the fly -ohne wav file auf der platte! -direkt in einen buffer.)
an dieser stelle kann eine beliebiger (dsp)filter auf die daten losgelassen
werden bevor das ergebnis als wav abgespielt wird.

meine bisherigen recherchen führten zum AudioCompressionManager
(http://msdn.microsoft.com/en-us/library/ms705349(VS.85).aspx)
der die codecs auf dem pc verwaltet. hier sollte es möglich sein
(mp3)daten in den MPEG (lame, etc) codec zu pumpen und als pcm buffer
wieder ab zu holen.? (oder bin ich aufm holzweg)

die codecs bekomme ich auch schon ausgelesen 🙂


		//...
		
		public delegate bool DriverEnumCallbackDelegate(IntPtr handle, int inst, int flags);
		
        [DllImport("Msacm32.dll", EntryPoint = "acmDriverEnum", ExactSpelling=false)]
        public extern static int DriverEnum
        (
            [MarshalAs(UnmanagedType.FunctionPtr)]
            DriverEnumCallbackDelegate d,
            int instanceValue,
            int flags
        );

        [DllImport("Msacm32.dll", EntryPoint = "acmDriverDetails", ExactSpelling = false)]
        public extern static int DriverDetails
        (
            IntPtr      handle,
            [In, Out]
            DriverDetail  padd,
            int         reserved
        );

		//...
		
        private bool DriverEnumCallback(IntPtr handle, int instance, int flags)
        {
            DriverDetail d = new _Acm.DriverDetail();
            DriverDetails(handle, d, 0);
            //_Drivers.Add(new AcmDriver(handle, d));
            return true;
        }
		
		//...
		
	    #region structs

        [StructLayout(LayoutKind.Sequential)]
        public sealed class DriverDetail
        {
            public int      Size;
            public int      fccType;
            public int      fccComp;
            public short    wMid;
            public short    wPid;
            public int      vdwACM;
            public int      vdwDriver;
            public SupportFlags fdwSupport;
            public int      cFormatTags;
            public int      cFilterTags;
            public IntPtr   hIcon;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
            public string szShortName;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string szLongName;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szCopyright;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string szLicensing;
            
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
            public string szFeatures;

            [Flags]
            public enum SupportFlags : int
            {
                Codec       = 0x00000001,
                Converter   = 0x00000002,
                Filter      = 0x00000004,
                Hardware    = 0x00000008,
                Async       = 0x00000010,
                Local       = 0x40000000,
                Disabled    = unchecked((int)0x80000000)
            }

            public DriverDetail()
            {
                Size = Marshal.SizeOf(this);
            }

            public override string ToString()
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendFormat("{0}\n", szShortName);
                sb.AppendFormat("{0}\n", szLongName);
                sb.AppendFormat("{0}\n", szCopyright);
                sb.AppendFormat("{0}\n", szLicensing);
                sb.AppendFormat("{0}\n", szFeatures);

                return sb.ToString();
            }
        }

        #endregion
		
		//...


alle weiteren versuche (z.B. acmFormatEnum) liefern nix vernünftiges mehr...??

gibts jemanden der schon erfahrungen mit multimedia api hat und mir hier weiter helfen könnte?
evtl. auch eine zusammenarbeit am projekt?

es grüßt,
ein verzweifelter

TS

06.07.2007 - 09:53 Uhr

Yeah SQLite rulez 👍

14.03.2007 - 10:06 Uhr

hallo,

also XNA ist müll. zwar gut gemeint aber eigentlich momentan eher als technologiestudie zu sehen und für produktiveinsatz kaum zu gebrauchen... (es fehlen wesentliche teile im 3d bereich) -nix für ungut.

2d grafik mit MDX Direct Draw ist ok, schau mal beim thread vorbei.

-t

14.03.2007 - 09:56 Uhr

Hallo,

tatsächlich würd ich aus performancegründen nur mit Managed DX(9) arbeiten. hier gibts die möglichkeit mit managed direct draw reine 2D blits zu machen die recht hardwarenah und ziemlich schnell sind. einen haken hat die sache allerdings. die schnittstelle ist bei MS als veraltet geflaggt und wird nicht mehr unterstützt, d.h. nur noch in DX9 vorhanden. unter vista mit DX10 gehts wohl nicht mehr. (mal testen...??)

ich arbeite gerade an einer 2d lib dafür die ich bereitstellen könnte...

-t

14.03.2007 - 09:43 Uhr

@Grzfrz:

Hallo,

stimmt, durch einfaches kopiern der dlls ins bin gehts leider nicht...(benötigte wohl doch irgendwelche registrierungen...!?)

allerdings ist beim DXSDK ein sog. Redist installer dabei (auch seperat bei MS als download) der die benötigten dlls im GAC installiert und die abhängigkeiten registriert. den kannst mitgeben, dann klappts auch mit MDX!

-Tom

16.12.2006 - 13:13 Uhr

@ egon:

ich locke eigentlich erst beim setzen des pixel!
have a look:


		private delegate void LoopHandle(LoopParameters p, Fractals.Mandelbrot m);
		
		private void ThreadLoop(object paras)
		{
			LoopParameters 		p = (LoopParameters)		(paras as object[])[0];
			Fractals.Mandelbrot m = (Fractals.Mandelbrot)	(paras as object[])[1];
				
			if(_Form.InvokeRequired)
				 _Form.Invoke(new LoopHandle(Loop), new object[]{p,m});
			else Loop(p,m);
		}
		
		private void Loop(LoopParameters p, Fractals.Mandelbrot m)
		{
			int		iterations;
			
			Color	color;
			
			double 	runX,
			runY;
			
			_Form.Text = string.Format("Thread {0}", p.BeginLine+1);
			
			runY = p.startY;
			for(int y=p.BeginLine; y<p.Height; y+=p.StepLine)
			{
				runX = p.startX;
				for(int x=0; x<p.Width; x++)
				{
					iterations = m.Iterate(runX, runY, p.MaxIterations);
					runX += p.stepX;
					
					color = Color.FromArgb( (iterations*((1<<11)-1)) );
					
					lock(_SyncRoot)
					{
						p.Image.SetPixel(x, y, color);
					}
				}
				runY -= p.stepY;
				p.Box.Refresh();
			}
		}


wobei ThreadLoop der einsprungspunkt je thread ist und jeweils die schleife startet.

15.12.2006 - 17:04 Uhr

@ egrath:

danke!

habs probiert geht aber nicht....!!!! 🙁

jetzt ist es zwar möglich beide threads ohne fehler zu starten dennoch wird erst der eine und wenn fertig der andere ausgeführt. .....???

da bei mir die pixel uu. recht lange dauern und ich einen dual core habe wärs halt schön auch beide cpus zu nutzen...

so wies jetzt geht bringts nix weil jeder thread in der warteschlange landet.

was nun?

14.12.2006 - 15:04 Uhr

Grüße,

auf einem Winfrom habe ich eine PictureBox, darin ein Bitmap
kann ich anzeigen, via SetPixel malen etc., klappt alles prima

jetzt kommts:

eigentlich möchte ich aber aus mehreren threads auf diese bitmap zeichnen, also thread1 oberer hälfte des bilds, thread2 unterer hälfte usw.

gibt immer eine ausnahme:

Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in System.Drawing.dll aufgetreten.

Zusätzliche Informationen: Das Objekt wird bereits an anderer Stelle verwendet.

gibts eine lösung dafür?

07.12.2006 - 11:30 Uhr

Hallo expseeker,

was du brauchst ist eine datenstruktur die von mehreren threads synchron lesend und schreibend benutzt werden kann. da ich gerade mit meinen studenten diese thema hatte möchte ich dir das nicht vorenthalten. wir haben eine queue die von einem netzwerkthread mit einkommenden paketen beliefert wird, also prinzipiell ähnlich wie bei dir. prinzipiell können dann n threads lesend auf diese queue zugreifen. dazu gibts im threading-namespace die monitor klasse. zum einstellen in die queue (oder eine beliebige andere collection)


		public void Enqueue(object val)
		{
			lock(_SyncRoot)
			{
				_Queue.Enqueue(val);
				Monitor.PulseAll(_SyncRoot);
			}
		}

und das auslesen


		public bool Dequeue(out object data)
		{
			bool result = false;
			
			lock(_SyncRoot)
			{
				//Check if queue empty...
				if(_Queue.Count == 0)
				{
					data = null;
				}
				else
				{
					data = _Queue.Dequeue();
					result = true;
				}
				
				Monitor.PulseAll(_SyncRoot);
			}
			
			return result;
		}

liefert true oder false wenn der puffer leer ist. das datum steht in data.
hab dazu eine komplett fertige demo & kann dir das zip gerne mailen!

-TS

30.05.2006 - 10:14 Uhr

hallo,

du kannst den connection string im prinzip auch als simples txt-file speichern. normalerweise packst du das in das config der applikation. bei asp.net apps gibts im root der domain eine datei web.config, für beliebige exe programme kannst du eine config anlegen wobei das namensschema <appName>.exe.config ist.

gehe in dem config (ist ein xml) zum tag <appSettings> und definiere deinen connection string:


...
<appSettings>
 ...
 <add key="SqlConnectionString"
         value="Server=192.168.x.x; Database=<DbName>; Uid=<UserId>; Pwd=<Password>;"
/>
...
</appSettings>
...

Server ist der Name oder IP des DB servers,
Database ist name der datenbank,
Uid ist der Name des Db consumers
Pwd ist das password

(es gibt noch mehr parameter die in der online hilfe erklärt werden! wobei ich immer mit obigen parametern verbinde...)

um in der app auf den connection string zuzugreifen:


...
using System.Configuration;
...

string sqlConnection = ConfigurationSettings.AppSettings["SqlConnectionString"];

...

das wars

😉

15.05.2006 - 10:08 Uhr

Hallo,

versuch mal mit dem "kollegen" von is:


...

if(scheiss is Arbeitsgang)
{
    Arbeitsgang ag;

    ag = scheiss as Arbeitsgang; //Liefert null wenns nicht geht!

    if(ag != null)
    {
    ...
    }
}


alternativ kannst du ja auch ein interface definieren um zugriff auf die benötigten methoden zu bekommen (sollte allerdings durch die vererbung ja schon definiert sein...?).

08.05.2006 - 12:23 Uhr

Uff,

ich suche nach einer möglichkeit mit .net auf die internet inhalte aufm desktop zuzugreifen (nicht die inhalte sondern den browser...)

habe mir dazu auch schon infos zu IActiveDesktop besorgt, was auch fehlerfrei compiliert. nur liefert der activator ein com object das beim cast auf das interface null ergibt...???

kann mir da evtl. jemand helfen?

-t

27.04.2006 - 09:54 Uhr

Hallo,

prinzipiell kannst du deine asp.net seiten auch auf einem Linux system laufen lassen!

Dazu brauchst du einen linux server mit einer der üblichen distributionen. es geht auch ein sog. root server bei einem hoster auf dem du volle admin rechte hast.

i.d.r sind auf solchen maschinen apache, mysql, php etc. vorinstalliert. um .net ans laufen zu bekommen mußt du MONO, ein .net framework für linux, installieren. (MONO)

wobei ich sagen muß das die installation nicht trivial ist. vorzugsweise via compilation des mono pakets...

wenn das geschaft ist, muß apache mit dem mono asp.net server konfiguriert werden (auch knifflig).

aber dann kannst du echte x-platform entwicklung betreiben, also unter win deine seiten basteln & wenn alles läuft mittels simplen ftp auf den linux server kopieren...

21.04.2006 - 09:31 Uhr

morgen,

du kannst aber auch einen rückgabewert überladen:



public void Methode()
{
}

public void Methode(out string xyz)
{
}


31.03.2006 - 10:16 Uhr

hallo,

unter MONO gibts einen mini server. öffne in dem root verzeichnis deiner web applikation eine konsole und starte xsp. (deine environment muss dazu aber auf den mono pfad gesezt sein!)

der aufruf im browser ist dann: http://localhost:8080/seite

30.03.2006 - 12:49 Uhr

Ok, prima!

30.03.2006 - 10:18 Uhr

Hallo,
ich denke die fehlermeldung kommt daher das der server keinen socket auf dem vom client angeforderten port hat. ich mache es eigentlich immer so das ich einen IPEndPoint über den namen des rechners im netz erzeuge:


...
IPHostEntry   ipHost = Dns.GetHostByName( "localhost" );
IPAddress     ipAddr = ipHost.AddressList[0];
IPEndPoint    ipEnd   = new IPEndPoint(ipAddr, 10000);
			
_Server = new TcpListener(ipEnd);
			
Run();
...

bei der angabe von localhost wird eine "lokale" IP auf 127.0... aufgebaut. damit können dann zwei applikationen auf einem rechner verbinden.

wenn statt "localhost" der name des rechners also z.b. "myComputer1" verwendet wird, liegt der endpoint auf der intranet adresse (z.b. 192.168...). damit können sich rechner "von außen" mit dem server verbinden.


		private void Run()
		{
			Thread.CurrentThread.IsBackground = true;

			Console.WriteLine("Server started");
			_Server.Start();

			while(!_Terminate)
			{
				TcpClient client = _Server.AcceptTcpClient();
				new SyncClient(client);
			}
			
			_Server.Stop();
			Console.WriteLine("Server stopped");
		}

in der methode run wird bei einer neuen verbindung ein gekapselter thread erzeugt der einen client behandelt:


...
		public SyncClient(TcpClient client)
		{
			_Terminate  = false;
			_InBuffer     = new byte[1024];
			_Client        = client;
			_Stream	     = _Client.GetStream();

			Thread t = new Thread( new ThreadStart(this.Run) );
			t.IsBackground = true;
			t.Start();

		}
...
		private void Run()
		{
			string s;
			
			Console.WriteLine("Connected");
			
			while( (s=Read()) != null )
			{
				Console.WriteLine("Received: {0}", s);
				...
				Send(string.Format("Command: {0}", s));
			}
			
			Console.WriteLine("Shutting down");
			Close();
		}
...

		public string Read()
		{	
			int n;
			
			try   { n = _Stream.Read(_InBuffer, 0, _InBuffer.Length); }
			catch{ n = -1; }

			if(n > 0)
				return Encoding.Default.GetString(_InBuffer, 0, n);
			
			return null;
		}
...

kommunikaton läuft hier über strings ab, ändert aber am prinzip nix.
wenn sich ein client beendet ergibt Read() null, und der (server) thread endet.

das ganze läuft bei mir prima unter MONO auf einer Linux maschine und .net 1 unter windows.

30.03.2006 - 09:29 Uhr

@Waschbecken:

hab eine anleitung gebastelt & dir mal das zip via mail geschickt.
bitte prüfen...
webspace hab ich schon, aber wer findets da?

29.03.2006 - 11:34 Uhr

...

kann ich schon, aber wo??

hatte schon mal die templates ans #D team geschickt, hamse aber nicht übernommen?!

huch 😮 eine anleitung sollte ich dann auch scheiben...

na gut, mach ich...

wer von euch hat einen vorschlag wohin die gespeichert werden?

29.03.2006 - 09:47 Uhr

Hallo,

ich benutze ausschließlich #Develop 2 und bin damit sehr (!!!) zufrieden.
über die projekt eigenschaften kann eingestellt werden ob für .net 1, .net 2 oder MONO kompiliert wird, vorausgesetzt die frameworks sind auch installiert.

ich entwickle aus kompatibilitäts gründen nach wie vor für .net 1.1 (MONO XSP).

die aktuelle beta von #D gibts hier:

#Develop 2

einen pferdefuss hat die sache allerdings. für asp .net gibts keinen designer... 🙁
(brauch ich auch nicht unbedingt, geht mit dreamweaver auch... )

p.s. ich habe nette templates gebastelt um mit #D 2 web projekte, web form, web service und custom controls anzulegen. stelle ich bei bedarf gerne zur verfügung...

20.12.2005 - 10:35 Uhr

Güße Eisbär,

mal sehen was Wiki dazu sagt!

Aha!? Was lernen wir? Eigentlich gibts keinen Unterschied. Dennoch könnte man die sache ja so interpretieren:

Bei einer Assoziation einthält ein Objekt einen Verweis auf ein anderes Objekt. Dieser wird durch ein übergeordnetes Steuerelement (!) im Objekt gesetzt (Konstruktor, Eigenschaft...) -also von außen.

Bei der Aggregation erzeugt ein Objekt fallabhängig eine (private) Referenz auf eines oder mehrere (= Komposition) Objekte (->Factory).

(vgl. auch z.B. Gamma, Helm, Johnson, Vlissides -Design Patterns- Factory & Flyweight)

oder so ähnlich 😉
-Tom

16.12.2005 - 12:19 Uhr

@norman-timo:

aha, funzt! man lernt ja nie aus... ;D

@Rene:

IIS von XP (5?!), .net 1.1 & Mono 1.1 -xsp ist der mono asp server!

16.12.2005 - 10:20 Uhr

Hallo,

ich habe eine Frage zum IIS:

Auf meinem lokalen rechner entwickle ich ASP anwendungen. dazu lege ich ein verzeichnis irgendwo lokal auf einer partition an. dieses verzeichnis trage ich auf dem lokal laufenden IIS als virtuelles verzeichnis ein, so dass ich die inhalte unter z.b.

http://localhost/Seite/Index.aspx

aufrufen kann.

funktioniert, alles prima & wunderbar

im intranet läuft ebenfalls ein (echter) IIS auf Win 2k server, auf dem eine virtuelle domain registriert ist um die entwicklung (intra)netzweit testen zu können. der aufruf erfolgt dann z.b. via

http://virtuelleSeite/Index.aspx

passt wunderbar & geht

jetzt kommts!

mein problem ist nun das der lokale IIS die pfade anders behandelt als der server.
wenn innerhalb der webanwendung z.b. ein bild angezeigt werden soll steht dieses in einem relativen verzeichnis innerhalb des app-trees:

funktioniert auf lokalem IIS:

<img src="Images/Bild.png" >

oder ein stylesheet

<link href="Styles/Styles.css" type="text/css" rel="stylesheet">

auf dem netz IIS (übrigens auch auf einem lokalen XSP!!!) und ansonsten überhaupt auf einem beliebigen web server sollen die pfade aber immer

<link href="/Styles/Styles.css" type="text/css" rel="stylesheet">
<img src="/Images/Bild.png" >

lauten.

wie kann ich den lokalen IIS dazu bringen die "übliche" schreibweise zu fressen?