Rekomendowane odpowiedzi

Opublikowano (edytowane)

W tym temacie chciałbym od podstaw rozpocząć tworzenie nakładki zawartej w jednym pliku z rozszerzeniem dll. Tematem nakładki będzie lista projektów. Temat ten ma za zadanie zachęcić niektórych forumowiczów (tych którzy się "zarażą") do tworzenia aplikacji uruchamianych bezpośrednio z ZwCAD-a i nauki C#. Kod programu będzie w pełni dostępny w tym temacie na zasadzie bierz i używaj , a jak chcesz to dodaj coś od siebie. Sam osobiście nie czuję się ekspertem, ale tym co już potrafię postaram się  dojść do ciekawego efektu.

Co będzie potrzebne:

Microsoft Visual Studio - polecam darmową wersję Community 2017, gdyż na nim będę pokazywał jak co zrobić.

Zw-CAD w zasadzie każdy.

Z  zainstalowaniem MVS2017 ,każdy sobie poradzi. Ponieważ to kombajn to zalecam instalować tylko biblioteki netfamework, czyli podstawowy pakiet.

Poniżej pierwsze kroki.

 

 

Edytowane przez Parikon
Opublikowano

Dzięki współpracy temat zawsze będzie miał obszerniejszą treść. Dokładnie tak jak pokazał @dmatusz3 wybieramy tylko Programowanie aplikacji klasycznych....

Mały komentarz do pierwszego filmu. Dodałem do odwołań projektu dwa niezbędne pliki, które znajdują się w katalogu ZwCAD-a.

Następny film pokazuje czynności jakie trzeba dalej wykonać aby kontynuować tworzenie nakładki. Przy czym nie ma potrzeby za dużo klepać kodu skoro już go gdzieś mamy, więc ja otworzyłem wcześniejszy projekt gdzie już podobny kod przećwiczyłem i dodałem go do projektu "projekt_forum.dll". "Zarażeni" skopiują sobie kod, który opublikuje pod filmem.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using zzr = ZwSoft.ZwCAD.Runtime;
using zza = ZwSoft.ZwCAD.ApplicationServices;
using System.Windows;

namespace projekt_forum.dll
{

    public partial class Window1 : Window
    {
        public Window1()
        {
            UserControl1 mojakontrolka = new UserControl1();
            //this.Content = mojakontrolka;
            //this.Content = mojakontrolka;
            this.Title = "Lista projektów";
            this.Width = 800;
            this.Height = 600;
            //this.MaxHeight = 240;
            //this.MinWidth = 250;
            this.MinHeight = 600;
            this.MinWidth = 800;
            this.AddChild(mojakontrolka);
            this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            this.WindowStyle = WindowStyle.ThreeDBorderWindow;
        }
    }

    public partial class Window2 : Window
    {
        public Window2()
        {
            UserControl2 mojakontrolka = new UserControl2();
            //this.Content = mojakontrolka;
            //this.Content = mojakontrolka;
            this.Title = "Lista projektów - formularz";
            int w = 600;
            int h = 220;
            this.Width = w;
            this.Height = h;
            this.MinWidth = w;
            this.MinHeight = h;
            this.MaxWidth = w;
            this.MaxHeight = h;
            this.AddChild(mojakontrolka);
            this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            this.WindowStyle = WindowStyle.ThreeDBorderWindow;
        }


    }

    public class Class1
    {
        [zzr.CommandMethod("PROJEKT_FORUM")]//komenda jaką wywołamy program w ZwCAD

        public void autocadokno()
        {
            Window1 win = new Window1();
            zza.Application.ShowModalWindow(win);//wywoła okno nr 1
        }
    }
}

 

Opublikowano

Na końcu ostatniego filmu w sprawozdaniu z kompilacji VS wyświetla ścieżkę gdzie znajduje się plik aplikacji. Wystarczy go teraz wczytać poleceniem netload i sprawdzić czy uruchomi się nam okno nakładki

 

Opublikowano

Informacji już było sporo, postanowiłem je zebrać wszystkie w jednym filmie.

 

Kilka uwag:

Ścieżki do bibliotek ZWCADa dostępne są w katalogach, jak poniżej.

2017-11-17 08_24_42-Menadżer odwołań - ClassLibrary1.png

 

Przy tworzeniu nowej biblioteki w VS, powinna się ona nazywać projekt_forum tak jak na początku było założone. Jeśli wpiszemy inną nazwę to pojawią się błędy w kompilacji (skopiowany kod nie zadziała).

 

 

Opublikowano (edytowane)

@dmatusz3 zrobił trzy rzeczy inaczej niż ja.

Po pierwsze nazwę dla biblioteki class podał inną niż ja. Po drugie utworzył swoją bibliotekę pod wersją 4.6.1 Frameworku, a ja w wersji 4.0. Po trzecie skopiował całą zawartość kodu na raz

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//tu wkleiłem pierwszą część

namespace projekt_forum.dll
{

   //tu wkleiłem część
}

I  pokazał, że okno działa.

VS tworzy przestrzeń nazw o nazwie zgodnej z nazwą biblioteki klas jaka zostanie utworzona w pliku dll. Ja tworząc bibliotekę klas nazwałem ją projekt_forum.dll co da wynikowo plik projekt_forum.dll.dll. Nie wygląda to ładnie. Proponuję zatem tworzyć sobie dowolną nazwę biblioteki nazw. Ważne aby nie kopiować jak @dmatusz3 w jednym ciągu a tylko tak jak  pokazałem powyżej.

Edytowane przez Parikon
Opublikowano

Utworzyłem bibliotekę klas o nazwie projekt_forum i skopiowałem całość kodu dodanego kilka postów wyżej. Projekt skompilował się  bez problemu.

Teraz dodam kilka kontrolek wewnątrz kontrolki Usercontrol1, która znów wypełnia obiekt window1.

 

Opublikowano (edytowane)

Aby obiekt UserControli1 w pełni wypełniał okno trzeba go powiększyć lub w zakresie definiowania klasy Window1 wpisać, że zawartość okna ma go wypełniać w całości.

W klasie Window2 wysokość i szerokość okna będziemy podawać przy tworzeniu nowego okna.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using zzr = ZwSoft.ZwCAD.Runtime;
using zza = ZwSoft.ZwCAD.ApplicationServices;
using System.Windows;

namespace projekt_forum // zmieniłem tytuł przestrzeni nazw
  
{

    public partial class Window1 : Window
    {
        public Window1()
        {
            UserControl1 mojakontrolka = new UserControl1();
            //this.Content = mojakontrolka;
            //this.Content = mojakontrolka;
            this.Title = "Lista projektów";
            this.Width = 800;
            this.Height = 600;
            //this.MaxHeight = 240;
            //this.MinWidth = 250;
            this.MinHeight = 600;
            this.MinWidth = 800;
            this.AddChild(mojakontrolka);
          	//dodany kod
			//zawartość okna wypełnia w całości to okno
			this.HorizontalContentAlignment = HorizontalAlignment.Stretch;
            this.VerticalContentAlignment = VerticalAlignment.Stretch;
			// koniec dodany kod          
            this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            this.WindowStyle = WindowStyle.ThreeDBorderWindow;
        }
    }

    public partial class Window2 : Window
    {
        public Window2(int w, int h)// szerkość i wysokość zdefiniujemy przy tworzeniu okna 
        {
            UserControl2 mojakontrolka = new UserControl2();
            //this.Content = mojakontrolka;
            //this.Content = mojakontrolka;
            this.Title = "Lista projektów - formularz";            
            this.Width = w;
            this.Height = h;
            this.MinWidth = w;
            this.MinHeight = h;
            this.MaxWidth = w;
            this.MaxHeight = h;
            this.AddChild(mojakontrolka);
          	//dodany kod
			//zawartość okna wypełnia w całości to okno
			this.HorizontalContentAlignment = HorizontalAlignment.Stretch;
            this.VerticalContentAlignment = VerticalAlignment.Stretch;
          	//koniec dodany kod
            this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            this.WindowStyle = WindowStyle.ThreeDBorderWindow;
        }


    }

    public class Class1
    {
        [zzr.CommandMethod("PROJEKT_FORUM")]//komenda jaką wywołamy program w ZwCAD

        public void ZwCAD2018okno()//aminiłem nazwe metody
        {
            Window1 win = new Window1();
            zza.Application.ShowModalWindow(win);//wywoła okno nr 1
        }
    }
}

 

Edytowane przez Parikon
  • 2 tygodnie później...
Opublikowano

Teraz dodam zdarzenie ładowania kontrolki użytkownika. Gdy program będzie uruchamiany wywoływane będą metody jakie umieścimy w tym zdarzeniu.  Dodamy także kontrolkę DataGrid,  która służy do wyświetlania i przeglądania danych. Kontrolka DataGrid po wstawieniu ma tzw spinacze , którymi przypinamy ją do "rodzica". Dzięki temu będzie powiększać się wraz z powiększaniem okna.

 

  • 3 tygodnie później...
Opublikowano

Udało się wszystko zrobić według filmu, załączam plik z projektem projekt_forum.dll

Postaram się nieco "spłaszczyć" film do obrazków :)

 

W oknie i w zaznaczonym miejscu 

2017-12-27 10_47_33-projekt_forum - Microsoft Visual Studio.png

 

dopisujemy

2017-12-27 10_48_35-projekt_forum - Microsoft Visual Studio.png

 

Teraz dodajemy kontrolkę (pamiętając o dociągnięciu do krawędzi i kliknięciu na spinacze w celu zakotwienia krawędzi kontrolki do okna zewnętrznego).

2017-12-27 10_50_18-projekt_forum - Microsoft Visual Studio.png

 

i zmieniamy jej nazwę 

2017-12-27 10_51_56-projekt_forum - Microsoft Visual Studio.png

 

  • 3 tygodnie później...
  • 3 miesiące temu...
  • 6 miesięcy temu...
Opublikowano (edytowane)

Chciałbym dorzucić swoje uwagi w temacie architektury.

Proponowałbym na początek rozdzielenie projektu co najmniej na dwa moduły dll.

1. Core Aplikacji  obsługa domeny czyli co aplikacja ma robić. Może być w tym cała obsługa okien dialogowych, dostęp do bazy danych i co tam jeszcze się uda napisać

2. Moduł startowy : w zasadzie jedna klasa odpowiedzialna za uruchomienie Core

Struktura na obrazku na końcu posta.

Uzasadnienie :

Jądro aplikacji może wykonywać wszystkie swoje zadania nie mając świadomości istnienia platformy na jakiej jest wykonywane. W zasadzie otworzenie okna czy dostęp do bazy jest realizowany bez potrzeby angażowania ZwCAD'a. Łączenie jądra aplikacji z konkretną platformą ogranicza jego zastosowanie np. można przecież chcieć odpalić tą nakładkę na Auto... Brick... czy jakimś tam innym CAD w którym jest obsługa .NET albo bez użycia jakiejkolwiek platformy CAD.

 

Autostart w module ładowanym przez NETLOAD w środowiski ZwCAD:

using ProjektForum;
using ZwSoft.ZwCAD.Runtime;

namespace ProjectForumZwCAD
{
    public class Autostart : IExtensionApplication
    {
        
        public void Initialize()
        {
            var projektForum = new Start(); 
        }

        public void Terminate()
        {
            
        }
    }
}

Aplikacja zasadnicza (Core)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ProjektForum
{
    public class Start
    {
        public Form mainForm;

        public Start()
        {
            mainForm = new MainForm();
            mainForm.Show();
        }
    }
}

Starter aplikacji WinForm.

using ProjektForum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace ProjektForumWinApp
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}

Należy zwrócić uwagę, że jedyne miejsce gdzie odwołuję się do biblioteki ZwCAD to jest autostart  z namespace ProjectForumZwCAD.

Pytanie na marginesie. Jakiś w miarę funkcjonalny i darmowy program do nagrywania pulpitu komputera żeby wstawić to później na forum? Coś polecicie?

 

2018-11-13 10_29_33-ProjektForum1.png

Edytowane przez perlon

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie