Symbol eXtension » Felhasználói felület

“Felhasználói felület” bejegyzések.

Szálban fut, de ablakot jelenít meg…

posted in: Felhasználói felület, Keretrendszer (Tags: , , , ) - No Comments

A SyX beépülők több helyen használhatnak szálakat működésük közben. A fejlesztő használhat “kézzel” szálakat, de az SaaS működés minden esetben szálban kerül kiszolgálásra. Ritkán, de előfordulhat, hogy a szál valamilyen felhasználói felületet is működtet. Példa erre, ha egy HTTP kérés hatására egy új számla ablak jelenik meg, amin még módosításokat lehet végezni.

Ennek a több szálas problémának a megoldására vezettük be a keretrendszerben az alábbi metódust:

InvokeThreadSafe(MethodInvoker invoker)

Az InvokeThreadSafe hívás során átadott (MethodInvoker-be beburkolt) metódus a főszálon, szinkronizáltan kerül végrehajtásra. Például egy újonnan, szálban létrehozott számla megjelenítise az alábbi módon valósítható meg:

InvokeThreadSafe(new MethodInvoker(so.Display)) //so.Display() beépített metódusa minden Entity-nek.

Műveleti gombok egyedi listákon

posted in: Felhasználói felület (Tags: , , ) - No Comments

Egyedi listák létrehozásakor (http://syx.symboltech.hu/fejlesztesi-kisokos/felhasznaloi-felulet/uj-lista-letrehozasa/) egyedi műveleti gombokra is szükség lehet. Ezeket tudjuk megvalósítani az lábbi módon.

        [MenuCustomListCommand(“Egyedi command”, “SampleCustomList”)]
        public void SampleCustomListEx(DataRow row)
        {
            MessageBox.Show(row[0].ToString());
        }

Hozzunk létre egy új metódust, amelynek egy paramétere van, amely egy DataRow (ebben fogjuk megkapni az éppen kiválasztott sort). A MenuCustomListCommand attribútum segítségével megadhatjuk, hogy mi legyen az új funkció neve és mely egyedi listán jelenjen meg.

Az egyedi listán egynél több művelet is elhelyezhető. A műveletek a deklarálásuk sorrendjében fognak megjelenni. Az első művelet lesz a kiemelt, amely lista ENTER vagy duplaklikk eseményére aktiválódik.

A műveletekhez a megszokott módon ikon (32×32) is rendelhető.

Az új művelet maga bármilyen C# kódrészlet lehet. Amennyiben itt egy újabb ablakot szeretnénk megjeleníteni (pl.: összesítő lista kibontása), úgy használhatjuk a this.DisplayCustomList(“Egyedi ablak”, image, datatable) metódust. Ez új ablakot jelenít meg az átadott elnevezéssel, ikonnal és adattartalommal.

Keresőfunkciók

posted in: Felhasználói felület (Tags: , , ) - No Comments

Az alábbi keresőfunkciók érhetőek el a SyX beépülők szintjén. Minden keresőfunkció azonos a Symbol Ügyvitelben használt kereső dialógus ablakokkal.

long? SearchCustomer()

Vevő kiválasztása füles keresővel

long? SearchSupplier()

Szállító kiválasztása füles keresővel

long? SearchProduct()

Termék kiválasztása füles keresővel

long? SearchMaintenanceProduct()

Javításra leadott termék kiválasztása füles keresővel

long? SearchLead()

Érdeklődő kiválasztása füles keresővel

long? SearchCampaign()

Kampány kiválasztása füles keresővel

long? SelectVoucherSequence(SymbolVoucherType symbolvouchertype)

Bizonylattömb kiválasztása adott bizonylattípushoz. Amennyiben egy ilyen bizonylattömb létezik, úgy a rendszer azt adja vissza. Több bizonylattömb esetén a felhasználónak lehetőséget biztosít a választásra.

Minden füles keresővel való kiválasztás NULL értéket ad vissza, ha a mégsem gombot nyomja meg a felhasználó. Amennyiben a visszaadott érték nem NULL, úgy egy long típusú (akár 64bites) értéket ad, amely a keresett adat egyedi azonosítója (table.ID). Ezt felhasználhatjuk az Entitásokon keresztüli műveleteknél.

Felhasználási javaslat:

  • Külső fájlból érkezett rendelés feldolgozása esetén nem azonosítható a vevő, ezért a vevőkereső funkcióval választunk a meglévő vevők közül.
  • Nem minden termék azonosítható, azért a termékválasztó segítségével pontosítjuk az adatokat.

Egyedi vezérlőelemek megjelenítése

posted in: Felhasználói felület (Tags: , , , ) - No Comments

Egyedi vezérlőelemek (célszerűen valamilyen System.Windows.Forms.Panel vagy UserControl leszármazott) főablakon történő megjelenítése is lehetőség van.

A megjelenítéshez hozzuk létre a megfelelő vezérlőt és hívjuk meg a megjelenítő metódust. Praktikus ellenőrizni, hogy a vezérlő már létezik-e.

        [MenuCommand(“HelloWorld: Control létrehozása”, MenuCommandLocation.Tools)]
        public void CreateAndDisplayControlUC()
        {
            if (ucdisplay != null) return;

            ucdisplay = new UCDisplay();
            this.DisplayMainFormControl(ucdisplay, “Próba Control”);
        }

A vezérlő elrejtésére is van megfelelő metódus. Ilyen esetben is ellenőrizzük, hogy a vezérlő létezik-e még.

        [MenuCommand(“HelloWorld: Control megszűntetése”, MenuCommandLocation.Tools)]
        public void HideControlUC()
        {
            if (ucdisplay != null)
            {
                this.HideMainFormControl(ucdisplay);
                ucdisplay = null;
            }
        }

A létrehozott és megjelenített vezérlő bármilyen egyéb vezérlp tárolására alkalmas. Amennyiben a megjelenített panel-en gombokat, grid-eket kívánunk megjelentetni, lehetőségünk van ezt design módban is megtenni a SyX fejlesztése közben.

A megjelenített vezérlő mozgathatóságáról és pozíciójának elmentéséről a keretrendszer gondoskodik.

A létrehozott vezérlő általánosságban megjeleníthető a StartUp() és elrejthető a ShutDown() metódusokban, ilyenkor a Symbol Ügyvitel futása közben állandóan látszik.

 

Felhasználási példák:

  • Tőzsdei grafikonokat megjelenítő UserControl létrehozása, megjelenítéskor (és adott időközönként rendszeresen) adatok lekérése az Interneten keresztül.
  • Külső állományok meglétének ellenőrzése és azok feldolgozása. Külső rendszerrel való együttműködéskor egy megosztott mappát figyelhet a SyX beépülő. Amikor abban megfelelő fájlok tűnnek fel (pl.: rendelés XML), azokat feldolgozásra meg lehet jeleníteni egy listában.
  • Menüpontoknál is elérhetőbb helyekre elhelyezett funkciók. Például az Email/SMS küldés funkció elhelyezhető a főablakon két nagy gombbal, a menüpontokban való keresgélés (shortcut is van!) helyett.

Új lista létrehozása

posted in: Felhasználói felület (Tags: , , , , , ) - No Comments

Új lista létrehozásával tetszőleges adatok jeleníthetőek meg a Symbol Ügyvitel megszokott listaablakain. A listaablakok lehetővé teszik az XLS mentést, a lista nyomtatását PDF, PNG, JPG formátumban, illetve az adatok elküldését e-mail üzenetben.

A lista létrehozásához két dolgot kell tennünk.

  • Hozzunk létre egy osztályt a PlugInListFilter osztályból származtatva. Ezáltal szűrőfeltételeket adhatunk a listához.
  • Hozzunk létre egy metódust, amelynek egyetlen paramétere egy PlugInListFilter-ből származó osztály, visszatérési értéke pedig DataTable.

Példa PlugInListFilter leszármazottra

        public class SampleListFilter : PlugInListFilter
        {
            private int i = 3;
            private string str = “AAA”;
            private PlugInDateInterval voucherdate =
               new PlugInDateInterval(
                   new DateTime(2011, 1, 1),
                   new DateTime(2011, 12, 31));
            private Customer customer;

            [PlugInFilterCaptionAttribute(“Szám”)]
            public int I { get { return i; } set { i = value; } }

            [PlugInFilterCaptionAttribute(“Név”)]
            public string Str { get { return str; } set { str = value; } }

            [PlugInFilterCaptionAttribute(“Dátum”)]
            public PlugInDateInterval VoucherDate
            { get { return voucherdate; } set { voucherdate = value; } }

            [PlugInFilterCaptionAttribute(“Vevő”)]
            public Customer Customer { get { return customer; } set { customer = value; } }
        }

A fenti példában a szűrőosztálynak egy szám, egy string, egy dátumintervallum és egy vevő a paraméterei. Ezek a lista megnyitása után, a CTRL+F billentyűvel a szokott módon elérhetőek. A keretrendszer felel érte, hogy a megfelelő adatmezőkhöz a megfelelő beviteli mezők jöjjenek létre: szám=spinedit, szöveg=textedit, dateinterval=intervallum választó, customer=vevőválasztó.

A szűrőosztályban lehetőség van alapértelmezett adatok megadásása is, dátum intervallum típusú mező megadása kötelező!

Példa egyedi listára

        [MenuCustomList(“Egyedi lista példa”, MenuCommandLocation.Tools)]
        public DataTable SampleCustomList(SampleListFilter filter)
        {
            string cmd = @”
                SELECT p.””Id”” AS “”Azonosító””, p.””Name”” AS “”Név””, p.””Code”” AS “”Kód””
                FROM “”Product”” p
                WHERE p.””Name”” LIKE ‘A%’
                      {0}
                ORDER BY 2″;

            List<string> where = new List<string>();
            if (!String.IsNullOrEmpty(filter.Str))
                where.Add(@”AND p.””Code”” NOT LIKE ‘%T'”);
            if (filter.Customer != null)
                where.Add(@”AND p.””Id”” == ” + filter.Customer.Id.ToString());
            if (filter.VoucherDate.Filled)
                where.Add(@”AND p.””CreateDateTime”” > ‘” + filter.VoucherDate.DateFrom + “‘”);

            using (EntityHandler handler = CreateEntityHandler(false))
                return handler.ExecuteQuery(String.Format(cmd, String.Join(” “, where.ToArray())));
        }

A példa alapján egy új menüpont jön létre az Esközök menüpontban. A lista megnyitása után a korábbi szűrőfeltételekkel dolgozhatunk. A lista adatainek lekérdezéséért az itt definiált egyedi SQL Select a felelős. Ebben a szűrőoszály mezőit felhasználhatjuk.

A végeredmény visszaadásához használjuk az EntityHandler megfelelő metódusát, amely DataTable típusú adatot ad vissza.

Keretrendszer beépített funkciói – Folyamatjelző

posted in: Felhasználói felület (Tags: ) - No Comments

A hosszabb műveletek alatt a rendszer lehetőséget nyújt folyamatjelző ablak megjelenítésére.Az egységes megjelenés érdekében célszerű az alábbi osztály használata:

using(ProgressForm prog = CreateProgressForm(“Folyamatjelzés folyamatban…”))

{

    for(int i=0;i<100;i++)

    {

        prog.UpdateStatus(String.Format(“{0}. lépés”, i));

        System.Threading.Thread.Sleep(50);

    }

}

A folyamatjelző ablak a Dispose() lefutása után (using!) automatikusan eltűnik.

Gyakori igény, hogy a folyamat közben a folyamatjelző csík átmenetileg eltűnjön, helyet adva valamilyen felhasználói tevékenységet igénylő ablaknak. Ebben segít a ProgressHider CreateProgressHider() metódus, amelyet szintén using kulcsszó mellett kell használni. A using idejére a folyamatjelző ablak elrejtésre kerül.

Keretrendszer beépített funkciói – Homokóra

posted in: Felhasználói felület (Tags: , ) - No Comments

A hosszabb műveletek alatt a rendszer lehetőséget nyújt a homokóra megjelenítésére. Hogy a megjelenített homokóra szinkronban legyen a Symbol Ügyvitel által megjelenített homokórával, célszerű az alábbi osztály használata:

using(CreateWaitCursor())

{

  hosszabb művelet…

}

A homokóra a Dispose() lefutása után (using!) automatikusan eltűnik.

Adathoz kötött ribbon gomb létrehozása

posted in: Felhasználói felület (Tags: , , ) - No Comments

Adathoz kötött ribbon gomb létrehozásához két lépés szükséges

  • Hozzunk létre egy tetszőleges nevű publikus metódust a főosztályban, amelynek egy paramétere van
  • Rendeljünk hozzá egy EntityCommand attribútumot. Az attribútum első paramétere a új menüpont neve, második paramétere az az adattípus, amelyhez az új menüpontot rendeljük. Ez lehet: Vevő, Szállító, Termék, Bizonylatok/bizonylattípusok

[EntityCommand(“Vevő keresése az interneten”, EntityCommandLocation.Customer)]
public void SearchCustomer(long id)

{

write code here…

}

Megjegyzések:

A főosztály GetMethodIcon metódusának felülírásával az újonnan létrehozott ribbon gombhoz ikont is rendelhetünk.

A ribbon gombhoz tartozó kód létrehozhat új ablakot vagy ablakokat.

Új menüpont létrehozása

posted in: Felhasználói felület (Tags: , , ) - No Comments

Új menüpont létrehozásához két lépés szükséges

  • Hozzunk létre egy tetszőleges nevű publikus metódust a főosztályban, amelynek nincs paramétere
  • Rendeljünk hozzá egy MenuCommand attribútumot. Az attribútum első paramétere a új menüpont neve, második opcionális paraméter az új menüpont helye. A második paraméter alapértelmezett értéke MenuCommandLocation.None, amely az új menüpontot a SyX főmenübe helyezi.

[MenuCommand(“HelloWorld: Homokóra menüpont”, MenuCommandLocation.Tools)]
public void UseWaitCursor()
{
    write code here…
}

Megjegyzések:

A főosztály GetMethodIcon metódusának felülírásával az újonnan létrehozott menüponthoz ikont is rendelhetünk.

Az új menüpont szerepelhet a Kedvencek menüben is.

A metódushoz tartozó kód létrehozhat új ablakot vagy ablakokat.

Amennyiben a menüpont neve sortörést tartalmaz (\n), úgy a menüpont almenü(k)ben jelenik meg.