mojaSymfonia FORUM
https://forum.mix-soft.pl/

FileDlg z definicją katalogu
https://forum.mix-soft.pl/viewtopic.php?f=15&t=6627
Strona 1 z 1

Autor:  iredy [ 2015-05-06, 23:43 ]
Tytuł:  FileDlg z definicją katalogu

Witam,
Pytanie krótkie, jak w tytule - czy jest jakaś możliwość podania domyślnego katalogu, otwieranego poleceniem FileDlg? Coś na kształt FileDialogKD z Kadr i Płac? Chodzi mi o programy handlowe (Handel, Faktura)... Z góry dzięki za odpowiedź.

/pozdr
irek

Autor:  alan0z [ 2015-05-26, 18:18 ]
Tytuł:  Re: FileDlg z definicją katalogu

Niegdyś, mimo wielu prób, nigdy nie udało mi się uzyskać funkcjonalności opisanej w temacie.
Będę wdzięczny za informacje, jeśli komukolwiek działa "otwieranie pliku" z podaniem domyślnej ścieżki w HMF i HMP (niekoniecznie za pomocą wbudowanego FileDlg ;) )
Pzdr.

Autor:  rafal [ 2015-05-29, 17:01 ]
Tytuł:  Re: FileDlg z definicją katalogu

Poniżej przykład jak można to zrealizować.

Działa domyślna ścieżka i multiselect (opcjonalnie).
Niestety okno nie jest modalne.

Załącznik:
hmopenfile01.jpg
hmopenfile01.jpg [ 98.86 KiB | Przeglądany 6604 razy ]


Załącznik:
hmopenfile02.jpg
hmopenfile02.jpg [ 63.78 KiB | Przeglądany 6604 razy ]


Można dalej rozbudować ten skrypt o przykładowo nadawanie tytułu okna, różnego rodzaju validacje itp... . W sumie o to wszystko co daje nam OpenFileDialog w C# -> https://msdn.microsoft.com/pl-pl/librar ... 10%29.aspx

Może uda Wam się to jakoś udoskonalić.

Kod:


int sub OpenFileDialog(string DomyslnyKatalog, string MaskiPlikow, int WybierzWiele, mapValue mvWybranePliki)   

   mvWybranePliki.Clear()

   dispatch fso = "Scripting.FileSystemObject"
   dispatch ws = "WScript.Shell"
   dispatch fld
   dispatch sfld
   
   
   // Katalog .NET - wymagamy wersji 4
   string netFolder = ws.RegRead("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\InstallPath")
   
   
   // zapisanie skryptu z zasobów do pliku Dialog.tmp
   int iSkrypt = open Katalog()+"Dialog.cs" for output
   
   string sLinia
   while zasoby(czytaj, sLinia)
      print #iSkrypt; sLinia
   wend
   
   Close(iSkrypt)
   
   // kompilacja skryptu do dialog.exe
   ws.Run(netFolder + "csc.exe /out:" + Katalog() + "Dialog.exe " + Katalog() + "Dialog.cs",0,1)
   
   // Wywołanie Dialog.exe z parametrami
   ws.Run((using Katalog() + "Dialog.exe \"%s\" \"%s\" \"%d\" \"%s\" \"%l\"", DomyslnyKatalog, MaskiPlikow, WybierzWiele, CurrentUser(),GetMainWindowHwnd() ),0,1)
   
   // odczyt listy polików z dialog.files
   int iWynik = open Katalog()+"Dialog_"+CurrentUser()+".files" for input

   while (Input #iWynik,sLinia)
      mvWybranePliki.Set( sLinia, 0 )   
   wend
endsub


// deklaracji mapy na wynik działania
mapValue mvListaPlikow
mvListaPlikow.Type(int)

// wywołanie okna
OpenFileDialog("c:\\windows","Handel (*.hm)|*.txt|All files (*.*)|*.*",1,mvListaPlikow)

// wypisanie wyniku

int i

for i = 1 to i > mvListaPlikow.Size()

   print mvListaPlikow.GetKey(i)   

next i


zasoby:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;

namespace FormOpenFileDialog
{
    public class Form1 : Form
    {

public class WindowWrapper : System.Windows.Forms.IWin32Window
    {
        public WindowWrapper(IntPtr handle)
        {
            _hwnd = handle;
        }

        public IntPtr Handle
        {
            get { return _hwnd; }
        }

        private IntPtr _hwnd;
    }

        public string sPath;
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

      IntPtr hSymfonia;
      int iSymfonia;

        const int SW_HIDE = 0;
        const int SW_SHOW = 5;

        public Form1()
        {
            this.Load += new EventHandler(form1_Load);
        }

        private void form1_Load(object sender, EventArgs e)
        {
            string[] args = Environment.GetCommandLineArgs();
      iSymfonia = Convert.ToInt32(args[5]);
      hSymfonia = (IntPtr)iSymfonia;
      WindowWrapper wrapper = new WindowWrapper(hSymfonia);

       string appPath = Path.GetDirectoryName(Application.ExecutablePath);
       StreamWriter tofile = new StreamWriter(appPath + "\\Dialog_"+ args[4] +".files");

            OpenFileDialog openFileDialog1 = new OpenFileDialog();


            openFileDialog1.InitialDirectory = args[1];
            openFileDialog1.Filter = args[2];
            openFileDialog1.FilterIndex = 2;
            openFileDialog1.RestoreDirectory = true;
   if (args[3] == "1") {
            openFileDialog1.Multiselect = true;
         }
         else
         {
            openFileDialog1.Multiselect = false;
         }

            if (openFileDialog1.ShowDialog(wrapper) == DialogResult.OK)
            {

          foreach (String file in openFileDialog1.FileNames)
              {

                      tofile.WriteLine(file);
         }
         tofile.Close();
            }

            this.Close();

        }


        [STAThread]
        static void Main()
        {
            var handle = GetConsoleWindow();
            ShowWindow(handle, SW_HIDE);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
    }
}


Autor:  rafal [ 2015-05-30, 23:01 ]
Tytuł:  Re: FileDlg z definicją katalogu

Wprowadziłem małą modyfikację do kodu wyżej i teraz Okno jest modalne.

Autor:  rafal [ 2015-05-30, 23:33 ]
Tytuł:  Re: FileDlg z definicją katalogu

zasoby: przeszkadzały w includowaniu i użyciu skryptu we własnych rozwiązaniach więc wydzieliłem skrypt c# do osobnego raportu.

Raport : Mix-soft FileDialog - include
Kod:
/"mixfdi.sci","Mix-soft FileDialog - Include",2400,0,1.0.0,SYSTEM
//"Raporty",1,14,62
limit 30000

int sub OpenFileDialog(string DomyslnyKatalog, string MaskiPlikow, int WybierzWiele, mapValue mvWybranePliki)   

   mvWybranePliki.Clear()

   dispatch ws = "WScript.Shell"
   
   // czyszczenie pliku z wynikiem
   int iWynik = open Katalog()+"Dialog_"+CurrentUser()+".files" for output   
   Close(iWynik)

   
   // Katalog .NET - wymagamy wersji 4
   string netFolder = ws.RegRead("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\InstallPath")
   
   // zapisanie skryptu z raportu Mix-soft OpenFileDialog c# do pliku Dialog.sc
   int b = Open Katalog()+"AMHM51pr.dat" for base "PR"
   int bErr
   BaseError( b, 4)

   SetKey ( b, "skrot" )
   SetKeySeg ( b, "skrot", "Mix-soft FileDialog - C#" )

   if GetRec ( b,EQ ) then error "Brak raportu : Mix-soft FileDialog - C#"

   buf = GetField(b, "dane")

   int iSkrypt = open Katalog()+"Dialog.cs" for output
   
   string sLinia
   
   print #iSkrypt; buf

   Close(iSkrypt)
   
   // kompilacja skryptu do dialog.exe
   ws.Run(netFolder + "csc.exe /out:" + Katalog() + "Dialog.exe " + Katalog() + "Dialog.cs",0,1)
   
   // Wywołanie Dialog.exe z parametrami
   ws.Run((using Katalog() + "Dialog.exe \"%s\" \"%s\" \"%d\" \"%s\" \"%l\"", DomyslnyKatalog, MaskiPlikow, WybierzWiele, CurrentUser(),GetMainWindowHwnd() ),0,1)
   
   // odczyt listy polików z dialog.files
   iWynik = open Katalog()+"Dialog_"+CurrentUser()+".files" for input

   while (Input #iWynik,sLinia)
      mvWybranePliki.Set( sLinia, 0 )   
   wend
endsub








Raport : Mix-soft FileDialog - C#
Kod:
//"mixfdc.sci","Mix-soft FileDialog - C#",2400,0,1.0.0,SYSTEM
//"Raporty",1,14,62
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;

namespace FormOpenFileDialog
{
    public class Form1 : Form
    {

public class WindowWrapper : System.Windows.Forms.IWin32Window
    {
        public WindowWrapper(IntPtr handle)
        {
            _hwnd = handle;
        }

        public IntPtr Handle
        {
            get { return _hwnd; }
        }

        private IntPtr _hwnd;
    }

        public string sPath;
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

      IntPtr hSymfonia;
      int iSymfonia;

        const int SW_HIDE = 0;
        const int SW_SHOW = 5;

        public Form1()
        {
            this.Load += new EventHandler(form1_Load);
        }

        private void form1_Load(object sender, EventArgs e)
        {
            string[] args = Environment.GetCommandLineArgs();
      iSymfonia = Convert.ToInt32(args[5]);
      hSymfonia = (IntPtr)iSymfonia;
      WindowWrapper wrapper = new WindowWrapper(hSymfonia);

       string appPath = Path.GetDirectoryName(Application.ExecutablePath);
       StreamWriter tofile = new StreamWriter(appPath + "\\Dialog_"+ args[4] +".files");

            OpenFileDialog openFileDialog1 = new OpenFileDialog();


            openFileDialog1.InitialDirectory = args[1];
            openFileDialog1.Filter = args[2];
            openFileDialog1.FilterIndex = 2;
            openFileDialog1.RestoreDirectory = true;
   if (args[3] == "1") {
            openFileDialog1.Multiselect = true;
         }
         else
         {
            openFileDialog1.Multiselect = false;
         }

            if (openFileDialog1.ShowDialog(wrapper) == DialogResult.OK)
            {

          foreach (String file in openFileDialog1.FileNames)
              {

                      tofile.WriteLine(file);
         }
         tofile.Close();
            }

            this.Close();

        }


        [STAThread]
        static void Main()
        {
            var handle = GetConsoleWindow();
            ShowWindow(handle, SW_HIDE);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
    }
}


i teraz jak użyć tego we własnych raportach

Raport : Mix-soft FileDialog - przykład
Kod:
#include "Mix-soft FileDialog - include"

// deklaracjia mapy na wynik działania
mapValue mvListaPlikow
mvListaPlikow.Type(int)

// wywołanie okna
OpenFileDialog("c:\\windows","Handel (*.hm)|*.txt|All files (*.*)|*.*",1,mvListaPlikow)

// wypisanie wyniku
int i
for i = 1 to i > mvListaPlikow.Size()
   print mvListaPlikow.GetKey(i)   
next i

Autor:  norro78 [ 2015-05-31, 20:15 ]
Tytuł:  Re: FileDlg z definicją katalogu

Nie prościej jest napisać kontrolkę w CSharp i potem użyć jej za pomocą dispatcha?

Autor:  rafal [ 2015-06-01, 06:46 ]
Tytuł:  Re: FileDlg z definicją katalogu

Zgadzam się. Prościej i bardziej elegancko.

Autor:  rafal [ 2018-12-31, 14:07 ]
Tytuł:  Re: FileDlg z definicją katalogu

tak wpisałeś?

Kod:
   ws.Run((using Katalog() + "Dialog.exe \"%s\" \"%s\" \"%d\" \"%s\" \"%l\"", DomyslnyKatalog, MaskiPlikow, WybierzWiele, CurrentUser(),0 ),0,1)


Nie podałeś modułu i wersji programu.

Autor:  zz [ 2019-01-03, 23:08 ]
Tytuł:  Re: FileDlg z definicją katalogu

dokładnie tak wpisałem

w temacie
http://www.forum.mojasymfonia.pl/viewtopic.php?f=15&t=8918
podałem wersję Symfonii

Strona 1 z 1 Strefa czasowa UTC+1godz. [letni]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/