[VBA] Szkic w UserForm


Rekomendowane odpowiedzi

Witam, robię aplikację VBA w ZWCad.

Zastanawia mnie, czy jest możliwość szkicowania prostych obiektów podczas obsługi UserForm przez użytkownika.

Dla przykładu otwieramy UserForm i do wpisania mamy 2 pola tekstowe: szerokość i wysokość prostokąta. Powyżej tych pól tekstowych mamy mały obszar ze szkicem, który pokazuje nam, jak ten prostokąt będzie wyglądał. Po każdorazowej zmianie jednego z pól zmieniają się proporcje prostokąta. Taki efekt osiągnąłem podczas pracy w JavaScript - Canvas.

Edytowane przez pop3k
Odnośnik do komentarza
Udostępnij na innych stronach

Czy to koniecznie musi być w VBA?

Wygląda na to, że to nie jest możliwe w VBA. Jedyne co mi przychodzi do głowy to wstawić do UserForm kontrolkę typu Image i wyświetlić Obrazek prostokąta w kontrolce Image, ale to taka dość karkołomna metoda. Może lepiej zrobić to w .Net VB, tam przypuszczam że będzie to łatwiejsze.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Takie coś naskrobałem na szybko w C#. Oczywiście kod jest siermiężny ale działa. Polecam używanie wysokopoziomowych języków .NET przy zabawach z WF ew. WPF. VBA miewa braki, aczkolwiek ma niezaprzeczalną zaletę, że jest "na pokładzie" i nie potrzeba zewnętrznego kompilatora.

rectangle.thumb.gif.09e8864630781f9d7e8683a28e2730db.gif

ZwForm.rar

Odnośnik do komentarza
Udostępnij na innych stronach

Bomba, domyśliłem się, że nie zrobię tego w VBA. Choć miałem nadzieję, że istnieje jakaś dodatkowa biblioteka.

Kupiłem 2 kursy na Udemy dla vb.net. Będzie trochę czasu (hehe, dobre), to usiądę do nauki. Podpowiedzcie tylko, która biblioteka (pod czym szukać w przyszłości) byłaby odpowiedzialna za samo rysowanie/szkicowanie w WPF (okienkach jak to perlon wykonał). Wiem, że w JavaScript jest Canvas.

 

PS. projekt_forum.dll już raz przerabiałem. Szkoda, że temat nie jest kontynuowany. Na pewno wrócę jeszcze do niego przy nauce.

Edytowane przez pop3k
Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli chcesz "oskryptować" ZwCad-a proponuje abyś wybrał język C#. W zasadzie będziesz mógł tworzyć rozwinięte programy. A narzędzia do tego są ogólnodostępne. Co prawda zamknięte, ale ZwCad-a też mogą "zwinąć" w pewnym momencie.

Jeśli przerobiłeś projekt_forum.dll to wiesz jak utworzyć okno. Chociaż to co pokazałem może być nieprofesjonalne, ale ja też za programistę się nie uważam. 😉 

Ja w zasadzie do rysowania wykorzystuję przestrzeń udostępnianą przez ZwCad. Ale możesz szkicować w oknie  wykorzystując System.Windows,Shape.

// Add the Polyline Element
myPolyline = new Polyline();
myPolyline.Stroke = System.Windows.Media.Brushes.SlateGray;
myPolyline.StrokeThickness = 2;
myPolyline.FillRule = FillRule.EvenOdd;
System.Windows.Point Point4 = new System.Windows.Point(1, 50);
System.Windows.Point Point5 = new System.Windows.Point(10, 80);
System.Windows.Point Point6 = new System.Windows.Point(20, 40);
PointCollection myPointCollection2 = new PointCollection();
myPointCollection2.Add(Point4);
myPointCollection2.Add(Point5);
myPointCollection2.Add(Point6);
myPolyline.Points = myPointCollection2;
myGrid.Children.Add(myPolyline);

https://docs.microsoft.com/en-us/dotnet/api/system.windows.shapes?view=netcore-3.1

Zatem robisz to tak w przykładzie projekt_forum.dll.

Gdzieś w oknie dodajesz kontrolkę Canvas. W kodzie wpf będzie to np.<Canvas x:Name="Plotno" HorizontalAlignment="Left" Height="60" Margin="18,158,0,0" VerticalAlignment="Top" Width="160"/>

Nazwałem kontrolkę "Plotno". Teraz w tej kontrolce możesz narysować przykładowo prostokąt. Przy czym jak ten prostokąt ma się pojawić po kliknięciu przycisku do dodaj kod do zdarzenia kliknięcia przycisku. Jak od razu przy uruchomieniu programu, to dodaj do zdarzenia uruchomienia programu:

 // Add a Rectangle Element
                    System.Windows.Shapes.Rectangle myRect = new System.Windows.Shapes.Rectangle();
                    myRect.Stroke = System.Windows.Media.Brushes.Black;
                    myRect.Fill = System.Windows.Media.Brushes.SkyBlue;
                    myRect.HorizontalAlignment = HorizontalAlignment.Left;
                    myRect.VerticalAlignment = VerticalAlignment.Center;
                    myRect.Height = 50;
                    myRect.Width = 50;
                    Plotno.Children.Add(myRect);

Oczywiście można to oprogramować dalej i prostokąt będzie przyjmował kształty wybranych z bazy danych prostokątów.

Pojawi się taki kwadracik jak poniżej. Przy czym nie przybiera on kształtu odpowiedniego do długości B i L, gdyż jeszcze tego nie oprogramowałem. Sorry, że piszę tak jak do kogoś całkiem nie obytego z programowaniem, ale jak już piszę, to i komuś takiemu może się przyda.

image.png.693b502e2c921933302a34f0dc2b2063.png

Edytowane przez Parikon
Odnośnik do komentarza
Udostępnij na innych stronach

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