Datei aus "My.Resources" öffnen und in Zwischenablage kopieren

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Datei aus "My.Resources" öffnen und in Zwischenablage kopieren

    Hallo liebes Forum.
    Dank Eurer Hilfe habe ich untenstehenden Code um eine emf-Datei in die Zwischenablage zu schreiben.
    Das funktioniert soweit super. Nun würde ich die Datei aber gerne als "Resourcen" ins Projekt einbinden und von dort laden
    und nicht mehr vom Pfad C:\...
    Kann mir vielleicht jemand sagen wie ich das machen muss ? ich kriegs nicht hin.. :/

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim path = "C:\Temp\Symbol.emf"
    3. Form1.CopyMetafile(path)
    4. End Sub
    5. Private Shared Sub CopyMetafile(ByVal path As String)
    6. Dim mf = New Metafile(path)
    7. NativeMethods.OpenClipboard(IntPtr.Zero)
    8. NativeMethods.EmptyClipboard()
    9. NativeMethods.SetClipboardData(NativeMethods.CF_ENHMETAFILE, mf.GetHenhmetafile())
    10. NativeMethods.CloseClipboard()
    11. End Sub


    Gruss Kimo

    CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    @kimo Du musst einen anderen MetaFile-Konstruktor verwenden. Probierma:
    docs.microsoft.com/de-de/dotne…maging_MetafileFrameUnit_
    Den Stream machst Du als MemoryStream mit dem Byte-Array der Ressourcen-Datei.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @kimo So was:

    VB.NET-Quellcode

    1. Dim ms = New MemoryStream(My.Ressources.MY_EMF)
    2. Dim mf = New Metafile(ms)
    und weiter im Text
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ja so gehts. Danke
    Eine Hürde habe ich aber noch:
    Nachdem ich die emf Datei aus den Resourcen geladen habe, müsste ich diese noch
    etwas abändern bevor sie in die Zwischenablage kopiert wird. Die emf
    Datei besteht eben aus einem Symbol und einer Zahl. Die Zahl müsste ich
    anpassen.
    Da ich mit VBA etwas besser klarkomme, hab ich es zuerst mal dort probiert allerdings noch mit Ein- und Ausgabepfad, aber es funktioniert:

    Quellcode

    1. Sub Editieren()
    2. Dim Var As String, P_In As String, P_Out As String, Edit As String
    3. P_In = "C:\Temp\Symbol.emf" 'Einlesen
    4. P_Out = "C:\Temp\Symbol_Neu.emf" 'Ausgeben
    5. Dim emf
    6. emf = FreeFile
    7. Open P_In For Binary As #emf
    8. Var = Space$(LOF(emf))
    9. Get #emf, , Var
    10. Edit = Replace(Var, "1" & Chr(0) & "2" & Chr(0) & "3", _
    11. "1" & Chr(0) & "5" & Chr(0) & "6")
    12. Dim emf_2
    13. emf_2 = FreeFile
    14. Open P_Out For Output As emf_2
    15. Print #emf_2, Edit
    16. Close emf_2
    17. Close emf
    18. End Sub


    Bei Versuchen mit VB wird die Datei unbrauchbar.. warscheinlich weil diese in Text konvertiert wird ??

    VB.NET-Quellcode

    1. Dim Textdatei As String = IO.File.ReadAllText("C:\Temp\Symbol.emf")
    2. Textdatei = Textdatei.Replace("1" & Chr(0) & "2" & Chr(0) & "3", "1" & Chr(0) & "5" & Chr(0) & "6")
    3. IO.File.WriteAllText("C:\Temp\Symbol_Neu.emf", Textdatei)


    Habe die emf Datei mal mit hochgeladen..

    Danke !
    Dateien
    • Symbol.zip

      (652 Byte, 54 mal heruntergeladen, zuletzt: )
    Dann probier doch IO.File.ReadAllBytes statt IO.File.ReadAllText
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    geschafft ! :thumbsup:


    VB.NET-Quellcode

    1. Dim bytes() As Byte = IO.File.ReadAllBytes("C:\Temp\Symbol.emf")
    2. Dim txt = System.Text.Encoding.Default.GetString(bytes)
    3. txt = txt.Replace("1" & Chr(0) & "2" & Chr(0) & "3", "1" & Chr(0) & "5" & Chr(0) & "6")
    4. bytes = System.Text.Encoding.Default.GetBytes(txt)
    5. IO.File.WriteAllBytes("C:\Temp\Symbol_Neu.emf", bytes)


    jetzt muss das nur noch zwischen Resourcendatei und Zwischenablage.... ?(
    Kann mir vielleicht jemand erklären warum

    VB.NET-Quellcode

    1. Dim bytes() As Byte = IO.File.ReadAllBytes("C:\Temp\Symbol.emf")

    funktioniert, und

    VB.NET-Quellcode

    1. Dim bytes() As Byte = IO.File.ReadAllBytes(My.Resources.Symbol)

    nicht funktioniert ?
    wo ist der Unterschied ob eine Datei aus einem Verzeichnis oder aus den Resourcen kommt ?

    Danke

    kimo schrieb:

    müsste ich diese noch
    etwas abändern
    Fang an mit einer vollständigen und belastbaren Aufgabenstellung!
    IO.File.ReadAllBytes(...) verlangt als Argument eine Datei.
    Frage an kimo:
    Welchen Datentyp hat My.Resources.Symbol?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Welchen Datentyp hat My.Resources.Symbol?


    Die Datei ist vom Typ emf "erweiteres Metafile" Die Datei habe ich in Beitrag 5 im Anhang hochgeladen.
    Das Ziel soll sein, dass diese Datei aus den Resourcen geladen wird. Dann wird die Datei unsichtbar geöffnet und die Nummer angepasst, und dann der Inhalt in die
    Zwischenablage kopiert so dass der Anwender in einem externen Programm diese mit "Ctr. + V" einfügen kann.
    Das meiste haben wir ja bereits zusammengeschustert.. Das müsste jetzt halt nur noch alles unter ein Dach was mir aber nicht gelingt.

    Gruss Kimo
    @kimo Du hast die einfache Frage nicht beantwortet. X(
    Warum erstellst Du nicht einfach eine neue EMF, die Deinen Bedürfnissen entspricht?
    Das ist bei Deinem Inhalt wesentlich einfacher, als eine bestehende EMF zu editieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    kimo schrieb:

    welche Frage habe ich nicht beantwortet ??

    RodFromGermany schrieb:

    Welchen Datentyp hat My.Resources.Symbol?

    =====
    Ich kann ja nicht tausend Symbole erstellen und in die Resourcen einbinden.
    :S
    Du sollst gar kein Symbol in die Ressourcen einbinden, Du sollst die EMF jedes mal neu erstellen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    @kimo Du hast die Frage NICHT beantwortet, denn Du hast sie nicht verstanden.
    My.Ressources.Symbol ist keine Datei, sondern eine programminterne Instanz, deren Inhalt eine Datei ist.
    Wäre es eine Datei, würde ja Dein Snippet 2 in Post #8 funktionieren.
    Auch sollst Du keine Datei erstellen, sondern eine MetaFile-Instanz, das ist äquivalent zu einer Instanz der Klasse Bitmap.
    Irgendwie habe ich das Gefühl, dass Du von uns ausschließlich Deine Hausaufgaben gemacht haben willst und keinerlei Interesse daran hast, an Deinem Problem zu lernen, um beim nächsten Mal Dein nächstes Problem allein zu lösen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @kimo Dann fang doch mal mit etwas einfacheren Sachen an: [Sammelthread] Programmieren, aber was? (Programmideen)
    und wenn Du dann etwas frisch bist, wage Dich an Dein Problem.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hab jetzt versucht die Grafik per Code zu zeichnen...

    VB.NET-Quellcode

    1. Dim formgraphics As Graphics = CreateGraphics()
    2. Dim hdc As IntPtr = formgraphics.GetHdc()
    3. Dim mf As Metafile = New Metafile("C:\Temp\Symbol.emf", hdc)
    4. Dim MetaGraphics As Graphics = Graphics.FromImage(mf)
    5. MetaGraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    6. MetaGraphics.DrawLine(Pens.Black, 100, 100, 200, 200)


    funktioniert auch.

    wäre vielleicht jemand so nett und sagt mir wie ich das ins clipboard speichere statt in ein Verzeichnis ?