|
Corel FORUM Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych |
|
Makra - Automatyczne uruchamianie makra
Kvokul - 21 Lipiec 2016, 12:09 Temat postu: Automatyczne uruchamianie makra Sumując - nie wiem jak wymusić na makrze, żeby się uruchamiało w momencie wczytania pliku (doszedłem do momentu, gdzie zadaje pytanie, ale wciąż się nie uruchamia).
Nie znalazłem na forum takiego tematu, jeżeli to mój błąd - to przepraszam.
Mam do napisania macro. Co ma robić to w sumie nieistotne (zawiera kilka zmian obiektów, dużo chowań i pokazywań, blkowania itd). W sumie doświadczenie z VBA mam głównie w programach microsoftu, ale to wszystko pokonałem łatwo dosyć. I wywróciłem się na ostatnim etapie (całe macro jest w zasadzie gotowe, albo tylko ma fragmenty do dopisania).
Kluczowe jest tu samo zlecenie, a ma działać tak:
Klient wysyła plik do swoich klientów, oni uruchamiają plik i od razu makro wyświetla UserForm, w którym klient sobie działa. Miałem nadzieję, że wrzucenie do projektu przy uruchomieniu userform.show zadziala, ale niestaty o ile dizala to na moim kompie, to u klienta musze recznie uruchomic macro, nawet jezeli jest zapisane w pliku. To z kolei jest niedopuszczalne.
Prosiłbym o jakąś pomoc - tak w zasadzie rozbijam się głównie o brak mojej wiedzy o tej konkretnej wersji VBA, pod officem byłoby to znacznie łatwiejsze dla mnie. Całość ma działąć w wersji od X6 w górę, acz oczywiście byłoby miło, gdyby na starszych też poszło.
Jeszcze jeden drobiazg - jak zapisać macro w pliku dla starszej wersji programu?
tomek123 - 25 Lipiec 2016, 13:45
Automatycznie u każdego się nie da uruchamiać, ponieważ makra mogą zawierać różne szkodliwe dla komputera użytkownika zapisy, czytaj wirusy.
Musisz każdemu klientowi napisać, jak ma uruchomić makro, czyli zmienić zabezpieczenia w Corelu, Excelu etc.
Tak to działa niestety i nic na to nie poradzisz, podziękuj tym co piszą wirusy.
Kvokul - 25 Lipiec 2016, 14:38
Dziękuję, pociągnijmy temat dalej i popatrzmy na niego z innej strony:
W Excelu nie mam problemu, żeby zrobić coś takiego, żę klient może uruchimić łatwo macro przy pomocy jednego przycisku, co więcej - przycisk ten może być na przykład graficzką umieszczoną wewnątrz arkusza. (dorzucić link do pliku?)
Jak złapię chwilkę, to spróbuje napisać na szybko macro (jako przykład), któro bedzie uruchamiać coś od razu, pytając tylko użytkownika, czy chce odpalenia. Jak zaznaczam - Corel się pyta, ale pomimo twierdzącej odpowiedzi - nie uruchamia.
Tutaj z grubsza chodzi o jakiś sposób uruchamiania, który nie będzie wymagał szukania po menu, gdzie w Corelu jest uruchamianie makr, bo jest to trochę kosmiczne.
Nie umiem przypisać makra do obiektu żadnego też - co byłoby rozwiązaniem.
Czy jest jakieś miejsce w systemi, gdzie dopisanie makra umożliwi uruchamianie go bez problemu? Mogę napisać mała apke, która tam bedzie przesyłać wszystkie pliki i dorzucić to do instalacji Corela u klientów - to nie problem, o ile będę znał ścieżki.
chezare - 1 Sierpień 2016, 11:25
Nie wiem czy nie przeceniasz swoich możliwości? Moja wiedza na ten temat jest praktycznie zerowa, ale na parę Twoich pytań odpowiedzieć chyba potrafię.
Zacznijmy od tego, że VBA w Corelu, to jest to samo VBA, co w programach Microsoftu.
Mechanizmy są takie same. Tak na marginesie, makra nie muszą być pisane w VBA.
Dokładnie tak samo jak w Corelu, taki np. Excel nie pozwoli uruchomić makra bez zgody użytkownika programu. Koledzy mają rację, programiści cały czas tworzą mechanizmy, które coś tam mają robić prostszym, ale nie brakuje chuliganów, którzy te same mechanizmy próbują wykorzystywać w niecnych celach. Stworzyło się błędne koło, jedni próbują pomagać, drudzy szkodzić, na co odpowiedzią tych pierwszych jest budowanie mechanizmów, które pozwalają wyłączać to co na początku stworzyli i to się raczej nie zmieni.
Musisz zauważyć subtelną różnicę między zgodą na uruchomienie mechanizmu obsługi makr, a samym uruchomieniem makra, to nie to samo, Corel, Excel nie pyta się czy może uruchomić makro, tylko pyta się czy może włączyć mechanizm, który pozwoli makro uruchomić.
Windows, aplikacje działające w tym systemie, ale dokładnie tak samo jest w innych systemach operacyjnych, potrafi zauważyć całą listę zdarzeń, kliknięcie przycisku, przeskalowanie okna, ruch myszy, czy otwarcie programu. Aplikacje pisane w Excelu czy Corelu też mają taką listę zdarzeń, część poleceń związana jest z takimi elementami jak właśnie przyciski, listy, przełączniki, a część z samym dokumentem, na tej liście znajdziesz pozycję związaną z np. otwieraniem dokumentu, aktywowaniem warstwy, itp., w aplikacjach Microsoftu jest dokładnie tak samo, nie każde makro się automatycznie uruchomi, nawet jak wyrazisz zgodę, na ich obsługę.
To jest standardowe ustawienie Corela. To powoduje, że Corel pyta się czy włączyć mechanizm obsługi makr. Ta zaznaczona opcja na dole powoduje z kolei, że Corel będzie widział skompilowane makra (gms), które będą widoczne na liście makr. Nie wiem jak jest w nowych wersjach Corela, piszę to co widzę w zabytkowej dwunastce.
W tym miejscu trzeba sobie uświadomić, że to co napiszesz i będzie elegancko śmigało u Ciebie, nie koniecznie ruszy u kogoś innego, posiadającego inną wersję programu.
Jeśli ktoś nic nie poprzestawiał w opcjach, które są na obrazku wyżej, a Twoje makro jest odpowiednio skonstruowane, to zgoda na obsługę makr, spowoduje jego uruchomienie. W załączniku jest dokument z dwunastki, który tak właśnie powinien zadziałać. Rozwiązanie problemu sprowadza się do:
Jeśli to ma być jakiś formularz, to lepszym rozwiązaniem byłoby stworzenie np. dokumentu pdf, który pozwala chować lub wyświetlać pewne elementy, wypełniać jakieś pola, czy tym podobne.
PS
Moje makro wygląda tak jak na obrazku wyżej, nie ma w nim żadnego złośliwego kodu, jak by się komuś jakaś krzywda stała, to ja nic nie wiem, nic nie widziałem i nic nie słyszałem.
Gdyby mnie ktoś przysłał dokument i nie wiedziałbyn, co w nim jest, to na pewno nie kliknąłbym, Enable…
Miłego dnia.
Kvokul - 1 Sierpień 2016, 15:29
1. Wyjaśnij mi co masz na myśli "Nie wiem czy nie przeceniasz swoich możliwości?"
Masz na myśli moją wiedzę, możliwości programu, czy jeszcze coś innego?
Od razu powiem, że VB,VBA nie są moimi ulubionymi językami programowania, ale bawię się w nie przy okazji większych innych projektów jakieś 20 lat, bo zawsze coś trzeba do Excela dorobić. Acz jest to moje pierwsze zabawne starcie z Corelem.
2. Dziękuję za próbę pomocy. To wszystko wiem... Odpowiedziałeś trochę nie na to pytanie, które zadałem - z resztą z braku mojej precyzji, wynikającej z nieznajomości Corela (biję się w piersi tutaj). Nigdy nie pytałem o możliwość uruchomienia bez pytania (to oczywiste). Zaznaczyłem wyraźnie, że cudo napisane przeze mnie działa u mnie, śmiga na innych komputerach, itd. Problemem jest to, że jak już zapyta, to nie zawsze się odpala, albo nie zawsze pyta.
Jak się okazuje na drodze do osiągniecia przez mnie sukcesu stał mały guziczek w
Narzędzia>Opcje>Obszar Roboczy>Opóźnij ładowanie ;)
On czasem blokuje, czasem nie blokuje działanie makra... ogólnie powodował chaos, ale jakby rozumiem, po co twórcy tego wspaniałego systemu takie cudo postawili. Wyłączenie powoduje zdjęcie problemów, zrozumienie działania anuluje chaos.
Całość jak już trochę poznałem corela będzie inaczej uruchamiana i będzie działać nie przy okazji pliku. Inna koncepcja, na pewno lepsza. Tą część pytania w zasadzie mi się rozwiązała.
3. Corel i MS - i tak i nie. Składnia, budowa języka - tak identyczne. Działanie natomiast... cóż inne obiekty i inne metody i ZERO dokumentacji.
Może tak: jak mam się dorwać do komórki w Excelu, to mi się Microsoft posika ze szczęścia jak dostanę 50 przykłądów, masę dokumentacji itd. Tutaj... cisza, spokój i wiatr wieje.
4. Nowy problem mi wyskoczył - skoro masz doświadczenie przy Corelu może będziesz w stanie mi pomóc na szybko - bo to pewnie łatwe, tylko ja mam problem z dorwaniem się do poszczególnych obiektów (brak dokumentacji w programowaniu obiektowym mnie zabija), a może gdzieś jeste jakaś dokumentacja do tego, ale nie znalazłem??? Będę bardzo wdzięczny, a widziałem sporo wpisów na forum masz.
W każdym razie:
Mam UserForm
UserForm ma dwa TextBoxy
Pracuje na pliku, kóry ma dwa teksty w jednej warstwie
Chciałbym, żeby zmiana w textboxie tekstu powodowała zmianę tekstu na obrazku, a zmiana drugiego tekstu w drugim textboxe drugiego.
Problemem jest to, jak wyszukać w page odpowiedni tekst. Tekstów tam jest dużo, a tylko jeden konkretny ma być mieniony. Nie wiem jakie są właściwości tekstu, czy też jak konkretny wydzielić z page, czy też z Layout. W sumie chyba z Layout? Ale w Layout też mam kilka tekstów, a mam podmienić tylko jeden. Każdy z nich jest odzielnym "tekst ozdobny" ale jaki to typ obiektu... nawet nie wiem. W excelu jest to banalne... tutaj - nie mam pojęcia.
Oszczędzisz mi mnóstwo czasu jeżeli wiesz jak to zrobić i będę bardzo wdzięczny za pomoc.
Jeszcze jedno napisałeś:
"Jeśli to ma być jakiś formularz, to lepszym rozwiązaniem byłoby stworzenie np. dokumentu pdf, który pozwala chować lub wyświetlać pewne elementy, wypełniać jakieś pola, czy tym podobne."
Masz na mysli jakieś konkretne rozwiązanie? Chętnie posłucham ;) Jakiś program, którym można łatwo robić gotowe elementy i potem tylko je zmieniać?
Od razu dodam, że problemem tutaj (jednym z wielu) jest to, że całość musi idealnie pasować do szablonów w które jest wdrukowywane. Z kilkoma drukarkami i pdf o dziwo mieliśmy wcześniej problem (już jeden edytor napisałem do tego niezależny i nie działa idealnie, ze względu na problemy z trafieniem gotowego obrazka w przygotowany obszar), gdyż czasem to działało, a czasem nie. Przesunięcie o 1mm - tutaj to duży błąd jest ;(
Zauważyłem, że zbyt często podchodzę nieco siłowo do róznych koncepcji - na przykłąd, gdy żona moja robi stronę, to zamiast poszukać gotowego modułu, szybciej, (ale nie zawsze lepiej) napisać mi dla niej fragment kodu niż znaleść gotowy moduł. A to czasem wyważanie otwartych drzwi.
Problem polega na tym, że to fragment większej całości, a integracja czasem potrafi bardzo boleć.
Ale też - specjalistą od druku nie jestem - jeżeli są do tego narzędzia to też będę wdzięczny. Ja się chętnie uczę ;)
No i dziękuję za odpisanie ;) Dyskusja zawsze pomaga.
chezare - 1 Sierpień 2016, 22:13
"Sumując - nie wiem jak wymusić na makrze, żeby się uruchamiało w momencie wczytania pliku (doszedłem do momentu, gdzie zadaje pytanie, ale wciąż się nie uruchamia)."
To prosty tekst, wątpię żebyś znalazł kogoś kto rozumie go inaczej niż ja zrozumiałem.
Odnośnie punktu pierwszego, to miałem na myśli to, że masz niewystarczającą wiedzę. Doszedłem do takiego wniosku po tym jak zdefiniowałeś problem i po tym jak napisałeś, że piszesz makra w Excelu od 20 lat. Pewnie się pomyliłem, ale do winy się nie za bardzo poczuwam. 20 lat nie robi na mnie specjalnego wrażenia, bo ja pisałem makra w arkuszu kalkulacyjnym, które składały się z kilkunastu tysięcy linijek kodu, kiedy nie było jeszcze Excela. Tutaj przypomnę, to co napisałem w poprzednim poście, nie wiem z czym się je VBA w Corelu, choć VBA z Excela nie sprawiało mi 20 lat temu większych problemów.
3. Różne obiekty i metody. W Wordzie też są inne obiekty niż w Excelu.
Zero dokumentacji. Tu się całkowicie mylisz. Klawisz F1 działa tak samo w Excelu jak w Corelu. Corel wyposażony jest w całkiem obszerny help dotyczący VBA, opatrzony wieloma przykładami, ale nie wyświetli się w pomocy uruchomionej z poziomu dokumentu, w Excelu jest zdaje się tak samo, trzeba szukać kiedy masz uruchomiony edytor VBA.
Żeby nie być gołosłownym przykład dotyczący jedynego polecenia jakiego użyłem w przykładzie.
Masz jednak rację, literatury na temat VBA i Excela jest nieporównywalnie więcej niż tej dotyczącej tego samego w Corelu.
4. Od dosyć dawna używam Corela i rzadko zdarza się, żeby program mnie czymś zaskoczył, ale jak już pisałem moja wiedza o VBA w tym programie jest żadna.
Wpisów faktycznie mam chyba na tym forum najwięcej, bo jak mogę, to pomagam, a jestem tu dosyć długo.
Napisałem o pdf, bo ten format od jakiegoś czasu pozwala tworzyć interaktywne dokumenty, takie pliki można również tworzyć z poziomu Corela, ale tutaj raczej trafiłem kulą w płot i nie będę się rozpisywał na ten temat, bo moja zabytkowa wersja Corela nie daje możliwości tworzenia takich plików, a podpierając się jedynie tym co zapamiętałem narobię tylko zamieszania zamiast pomóc.
Piszesz, że jednym z problemów jest to, że nadruk musi idealnie pasować do jakiegoś szablonu (wcześniej wydrukowanego, etykiet?) Tutaj też jakieś doświadczenie mam i niestety muszę Cię zmartwić, będą kłopoty.
To z czym się już zetknąłeś nie jest niczym nadzwyczajnym, dedykowane do takich celów programy najczęściej zaczynają działanie od prośby o skalibrowanie wydruku. Taka procedura polega z grubsza na tym, że drukuje się wzorcowe arkusze na których jakieś elementy są umieszczone w konkretnych miejscach. Operator programu musi ustalić o jakie wartości te elementy są przesunięte względem miejsca w którym powinny się znaleźć i wpisać te wartości. Przy właściwych wydrukach są one o te podane wartości przesuwane. W praktyce oznacza to, że każdy użytkownik Twojej aplikacji będzie musiał zrobić to samodzielnie zmieniając położenie drukowanej grafiki (co drukarka będzie inaczej).
Wracając do właściwego pytania, to trzeba się posłużyć jakąś charakterystyczną, unikalną cechą zmienianego tekstu, np. jeśli jest zielony, to szukamy zielonego i go zmieniamy. Jedną z właściwości każdego obiektu w Corelu jest jego nazwa. Nie ma to związku z rodzajem obiektu, prostokąt może się tak samo nazywać jak elipsa czy tekst.Standardowo ta wartość w momencie utworzenia obiektu jest pusta.
Jeśli nazwiesz zmieniane teksty w unikalny sposób (w Corelu wiele obiektów w jednym dokumencie może mieć takie same nazwy), to będziesz mógł interesujące obiekty znaleźć i zmienić.
Przy zdarzeniu zmiany zawartości pola tekstowego w formularzu, szukasz obiektu o określonej nazwie w dokumencie i zmieniasz tekst.
Procedura szukania może wyglądać jakoś tak:
Dim s As Shape
For Each s In ActivePage.FindShapes(, cdrTextShape)
If s.Name = "tekst_1" Then
MsgBox "Hurrrrra, znalazłem"
End If
Next s
Teraz się pewnie zapytasz, znalazłeś, ale jak zmienić?
Niestety, przez te parę minut wiedzy mi nie przybyło i póki co nie wiem, ale jeśli to Ci w czymś pomoże,
to jutro mogą wiedzieć.
Kvokul - 2 Sierpień 2016, 09:52
No właśnie VBA w Excelu nigdy jakoś mi kłopotu nie zrobiło. Corel sam w sobie mnie zawsze odrzucał i jego VBA też mi nie pomaga. Pomoc w programie i owszem jest, ale jak sam zauważyłeś, w porównaniu z tym co robi MS... to kropla w morzu.
Jeżeli chodzi o szablony - wydaje mi się, że najlepszym programem do tego byłby Acrobat Adobiego. Szczerze mówiąc mam na komputerze cały pakiet tego (firma się postarała zaprzyjaźniona), używam sporadycznie Photoshopa... Ale nie znalazłem możliwości takiej, by zrobić coś w rodzaju UserForma, tam chyba to musi być bezpośrednio w dokumencie zaszyte. Poczekam na grafika zaprzyjaźnionego i zawrócę mu głowę.
Właśnie możliwości nazwania obiektu mi brakowało. Nie skojarzyłem tego, że jak można nazwać warstwę, to obiekty przypisane do warstwy, Ale tu wychodzi moje ograniczenie w znajomości Corela (tak jak znajomość excela w pisaniu w VBA tamtejszym pomaga). Jest ot praktycznie moje pierwsze zetknięcie z tym programem.
Wiem właśnie, że trafianie to dramat, tu trafiasz w sedno. Temat był ruszany z kilku stron. Najśmieszniejsze jest to, że prościej mi było trafić aplikacją napisaną w JS (i działa to idealnie) niż aplikacją napisaną w C++, bo żaden język MS nie ma funkcji, która mogłaby bezbłędnie policzyć jaka będzie wielkość wydrukowanego obiektu. Głupie czcionki potrafią się rozjechać, bo żadna z trzech przewidzianych do liczenia ich długości funkcji nie działa poprawnie. Prześmieszne to jest.
Bardzo dziękuję za pomoc.
tomek123 - 3 Sierpień 2016, 10:41
Całą dokumentację do VBA w Corelu masz na stronie:
https://www.oberonplace.com/vba/draw10vba.htm
ewentualnie do Photoshopa jak ktoś potrzebuje
http://www.adobe.com/devn.../scripting.html
nic więcej nie potrzeba do szczęścia.
Kvokul - 3 Sierpień 2016, 11:26
Czegoś takiego mi brakowało. Dziękuję ślicznie. Rzeczywiście do Corela nic więcej nie trzeba.
Adobi mnie o tyle zaciekawił, ze zastanawiam się cz da sie zrobic talki pdf, żeby uzyszkodnik przed drukiem wybieral widoczne warstwy i dodawal elementy pisma. Ale na razie skończę tego corelka i potem pdfik. Adobi przynajmniej na ludzkiej stronie...
Bardzo dziekuje. Ogólnie sympatyczne forum - i skuteczne ;)
tomek123 - 3 Sierpień 2016, 14:46
Co do zmiany tekstu w dokumencie Corela to są 3 podstawowe sposoby:
1. po nazwie obiektu, tak jak kolega już opisał
2. po lokalizacji w dokumencie tekstu
3. ewentualnie po zawartości tekstu
tylko w ten sposób możesz zidentyfikować obiekt tekstowy, jeżeli wszystkie teksty są tak samo sformatowane oczywiście.
Opisz jaśniej, co dokładnie chcesz zmieniać za pomocą wpisu w textbox'ie, to podam Ci najlepszą metodę wraz z kodem. Możesz dać przykład, jak to ma działać, może tak będzie najlepiej, jakie to teksty przykładowo, jak to ma być zmieniane, cały obiekt zastępowany, czy tylko wyraz w tekście, za mało danych, żeby coś tutaj wkleić.
To miał na myśli chyba chezare, skoro zadał pytanie, czy nie przeceniasz swoich możliwości, bo może masz wiedzę, ale po opisie problemu wywnioskował, że pisze ktoś bez większego doświadczenia w programowaniu, bo to można poznać po sposobie formułowania problemu. Ktoś kto pisze kod, generalnie wyraża problem algorytmem, czyli prosto...
Wpisuję to, program robi to i to, potem pyta czy dobrze, jak nie to robi to i to itd... ;) jeżeli ktoś zna sposób to już nie musi później domyślać się niczego, tylko to napisać kodem.
Kvokul - 4 Sierpień 2016, 11:28
Chaos wynikał raczej jak z tego, żę Corel jest mi całkowicie obcy i tak na prawdę w momencie formułowania problemu nie do końca wiedziałem jak go opisać, ani jak nawet mogą nazywać się elementy do kórych się odnoszę. Jak przyznałem - opis był... delikatnie mówiąc kulawy. ;)
Prosto:
1. Ma pobrać tekst z TextBox (zrobione)
2. Wpisać do do określonego elementu tekstowego (zrobione)
3. Później muszę go wycentrować, sprawdzić, czy mieści się w określonej szerokości (jak nie to zmienić wielkość czcionki, tak by się mieścił). Być może przesunąć? Trochę komplikuje to fakt, że tych linijek będzie dużo, i wielkość wszystkich będzie się musiała zmieniać gdy inne będą się zmieniały, alee to kwestia dobrania algorytmu i jakby nie ma to znaczenia w dyskusji.
Obawiam się tego momentu, gdzie nastąpi sprawdzanie czy tekst się mieści w jakichś granicach, czy tez jaką ma szerokość w wydruku. Optymizmem nie napawa mnie to szczególnie po przejściach z VB (czy C++ - bez znaczenia), gdzie te funkcje działają kulawo (potrzebowałem policzyć wilekość tekstu o szerokości 1-5 metrów, niezależnie od czcionki i wielkości w punktach... i jak się okazuje, każda funkcja wymyślona przez MS jest to w stanie zrobić tylko z przybliżeniem i to niezbyt sensownym), ale może w Corelu i jego VBA jest to jakoś lepiej zrobione. Podejrzewam też, że zmiana wielkości czcionek jest prostsza niż zmiana samego tekstu.
Dzięki Wam moje problemy się zmniejszyły, oczywiście nie pomaga to, że robię ten cały skryp z doskoku i nie mogę się na nim skupić tak jak on na to zasługuje.
Tekst edytuję w zależności od tego jak daleko jestem... obecnie szukam możliwości sprawdzenia jak szeroki obecnie jest tekst i zmiany czcionek odpowiednio.
chezare - 4 Sierpień 2016, 14:57
W Corelu z całą pewnością będziesz mógł ustalić jaką długość ma tekst, z dokładnością do tysięcznych części milimetra i to będzie się zgadzało ze stanem faktycznym, ale obawiam się, że wcześniej będziesz musiał zamienić go na krzywe, a ponieważ może zaistnieć konieczność zmiany jego wielkości, to trzeba to zrobić na kopii, albo cofnąć operację zamiany na krzywe, po ustaleniu szukanej wartości.
Łatwiej z pewnością byłoby gdyby znaki w foncie miały jednakową szerokość.
Nie wiem co to za zadanie wymagające aż takiej precyzji, ale wygląda mi to na dzielenie włosa na czworo.
Dodatkowo jak już to wszystko ustalisz, to zostanie taki drobiazg jak trafienie wydrukiem w odpowiednie miejsce, jak to jest konkretna drukarka, to nie ma problemu, jak będą dwie różne, to teoretycznie już masz problem i nie za bardzo masz możliwość jego rozwiązania.
Ja bym raczej zostawił sobie jakiś margines na niedokładności, niż kombinował jak ustawiać wielkości tekstów co do mikrona, to jest moim zdaniem droga donikąd.
Kvokul - 4 Sierpień 2016, 16:24
Oczekuję dosyć konkretnej pomocy, opinie na temat pracy i jej celowości są mi zbedne. Jedyne z czym zgodzę się w Twojej wypowiedzi to fakt, żę nie masz pojęcia co robię i w którym miejscu mojej pracy jakiej dokładnosci potrzebuję.
Ten konkretny element może mieć pewne odchylenia, nawet do 10% wielkości, byle by był secentrowany.
Drukarki nie stanowią problemu.
Zastanawia mnie użycie AlignAndDistribute, ale jak widzę w stosunku do Shape jest to trudne i uzależnione od wersji... przyjdzie i tak to liczyć na piechotę. Z resztą ustalenia wielkości jest tu kluczowe jeżeli mam okreslić potem jak i co się gdzie mieści. Kilka pomysłów mam zobaczymy.
chezare - 4 Sierpień 2016, 19:12
Ponieważ masz dosyć mizerne obycie z Corelem, to Ci powiem co robi Align and Distribute, ustawia położenie jednego elementu w stosunku do innego, może to być zarówno jakiś obiekt, albo np. strona w dokumencie, może też ustawiać odległości między elementami.
Jeśli chodzi o tekst, to jest cała paleta poleceń które wyrównują tekst do lewej, prawej, środka, albo rozciągają go od marginesu do marginesu, tak jak w innych programach.
Ponieważ mam ciekawsze zajęcia niż domyślanie się do czego Ci to potrzebne, to znikam i już się nie odzywam.
Cysorz - 5 Sierpień 2016, 00:26
Kvokul - masz dosyć "kontrowersyjne" podejście do ludzi, których prosisz o pomoc a oni Ci jej udzielają lub przynajmniej próbują...
Kvokul - 5 Sierpień 2016, 09:51
A/ Podeście:
Już wyjaśniam podejście, jest ono proste:
1. Jedni ludzie starają się pomóc i jestem im bardzo wdzięczny. Pomoc coś wnosi, Tomek i Chazare na początku bardzo mi pomogli i jestem bardzo wdzięczny. Szczerze mówić - nie ruszyłbym bez tego, albo zajęłoby mi to MNÓSTWO czasu.
2. Drudzy nie wnoszą do dyskusji i komentują celowość pracy, a ten konkretny wpis Chazare, właśnie taki był, jak i Twój Cesorzu. Zbyt wiele dyskusji na forach umyka w kierunku takim, że zamiast konkretnych odpowiedzi na konkretne pytania zawiązuje się dyskusja na temat celu zadania, lub wpada w rozważania jak się to odbywa na innych systemach (na tym forum szczególnie często widzę "ale w photoshopie to się robi tak"). Tu cel jest jasny i konkretny bardzo.
Chezare - jeżeli Cię uraziłem - przykro mi, na prawdę, bo wcześniej mi pomogłeś bardzo. A przedostatni wpis... no cóż - mogę zmienić zleceniodawcę i rzucić projekt, którego Corel jest matuleńkim fragmentem, albo nauczyć się podstaw Corela (co czynię). Problem polega na tym, że nie widzę celu opowiadania o całości pracy którą robię, jest tego sporo i dotyczy kilku rozwiązań, szkoda Waszego cennego czasu. Mój ostry ton z części wynikał z tego, że w pierwszej chwili nie zauważyłem, żę odpowiedż na temat celowości wytoczyła ta sama osoba, która najpierw realnie pomogła. Przepraszam więc Cię szczerze - masz rację uniosłem się.
B/ Skrót projektu:
Może streszczę? Mam obrazek w Corelu składający się z warstw. Część z nich musi trafiać co do ułamka milimetra, część się musi wyświetlać, część znikać, część skalować, całość musi być tak napisana, żeby osoba nie mająca ŻADNEGO pojęcia o VBA była w stanie dołączyć kolejne elementy do projektu, jeżeli będzie skończony. Całość wdrukowywane jest (lub wygrzewana) w gotowe szablony. Te elementy które są wiodące dla projektu muszą idelanie pasować do szablonu. Corel to ułatwia, bo przynajmniej grafiki nim ustawione będą tam gdzie potrzeba i jak ktoś tylko potrafi obsłużyć drukarkę, to da radę. To samo byłoby z .PDF, ale niestety w szablonie są elementy zmienne, a - jak pisałem - nie wiem czy da się zrobić coś takiego, żeby poza wpisaniem lub wybraniem tekstu, szablon mógł sterować wyświetlaniem warstwi. Jeżeli tak - po Corelu .pdf będzie następny. Ale w Acrobacie nie zauważyłem takiej możliwości. Tak na prawdę to ideałem byłoby gdyby to zrobić tak, że Corel pobiera wszystkie dane do projektu z centralnej bazy danych i wrzuca na gołą "kartkę" ale to jeszcze chwila i to nie będzie problemem, o ile moje założenie, że obsługuje SQL tak jak excell się sprawdzi.
Podobne projekty robiłem w JS i VB (jak ktoś woli C# i C++ - bo to teraz jedna cholera). W JS robi się to przyjemnie, w MSowych wynalazkach jest to... delitaknie mówiąc denerwujące. Z samym VBA mam duże doświadczenie, od lat, ale nigdy nie był dla mnie znaczący. Specjalizuję się w T-SQL i PHP (ja wiem, że to dziwne połączenie, ale człowiek robi to na co są zlecenia), chociaż ostatnio wychodzi, że to bardziej integracja różnych rzeczy i pisanie nietypowych elementów na zamówienie, ciągłe zmiany w stosowanym języku nie pomagają.
Z uwagi na treść pracy i umowę z klientem - nie mogę gotowych plików nigdzie umieścić, żeby je pokazać, żęby była jasność (byłyby tu w pierwszym poście).
C/ Streszczenie zadania:
Część dotycząca tekstu - cóż - ma się tekst zmieścić na wyznaczonym obszarze i ma być na nim wycentrowany. Jak się nie mieści, trzeba zmniejszyć czcionkę. Precyzja - 10% jak pisałem jest wystarczająca.
Może tak: wyobraźmy sobie, żę mamy UserForma, w którym jest TextBox. Zadanie jest następujące: wpisany text w textboxie ma się pojawić w konkretnym nazwanym Shape (dzięki Wam wiem, że to Shape i się w nim pojawia), scentrowany do środka strony i napisany dużą czcionką. Jeżeli będzie przekraczał jakieś 70% szerokości strony, to ma się zmniejszyć czcionka, na tyle, żeby nie przekraczał. Precyzja tutaj ma być znikoma - w każdym razie w porównaniuz innymi częściami projektu.
Zakładam, że zadanie nie jest jakieś koszmarnie trudne, na oko głównym moim problemem w tym momencie jest to, że w wersji X6 nie można było jeszcze użyć AlignAndDistribute do Shape (w każdym razie tak doczytałem, jeżeli błędnie - popracie mnie), z kolei metody związane z Shape do X6, nie chcą działać na późniejszych wersjach. Gdyby to działało - jupi jestem w domu. Właśnie się zastanawiam, czy nie zrobić tego tak, żę aktywuję shade i wykonam na nim operację przez AlignAndDistribute - bo do zaznaczonego obiektu już tego w X6 użyć można.
D/ Podsumowanie:
Mogę zrobić przykład jakiś i umieść podobnego zadania. Nie mogę natomiast powiedzieć klientowi, żęby spadał na drzewo, ze względu na to, że jest to tylko fragmencik pracy dla niego, do tego dla niego ważnej. Uznajmy to za tak naprawdę dodatek...
I tak - zdaję sobie sprawę z koszmarnych moich ograniczeń jeżeli chodzi o Corela. Jak mówię - pierwszy raz w życiu robię na nim cokolwiek, jakiekolwiek pojęcia są dla mnie obce, połaczenie dwóch plików, gdzie w jednym i w drugim były warstwy, zajęło mi godzine - bo kopiowałem warstwę po warstwie nie potrafiwszy skopiować 20-30 warstw na raz. I nie mówię, że jestem miszczem Corela, za to z samym programowaniem problemu raczej nie mam w kilku językach - co podkreślam głwonie dlatego, żeby osoby pomagające mi miały łatwiej w odpowiadaniu i nie musiały marnować czasu na próby wytłumaczenia mi podstaw. Pomimo dziwnego czasem stylu mojego opisu (wynikającego z braku wiedzy o Corelu co podkreślam) bardziej cenię kawałek konkretnego kodu niż opisówkę.
I tak - za każdą pomoc jestem BARDZO wdzięczny, bo to dzięki Wam projekt ruszył. Jeżeli tego nie widać - to nie wiem co mam jeszcze zrobić. Podziękował, przeprosił jeżęli uraził.
E/ konkretne pytanie do Chezare (lub kogoś innego kto ma pomysł):
Chezare: wiem do czego służy AlignAndDistribute, tylko, że ono za cholere nie chce mi działać z obiektem Shape na wersji X6. Może tak: bo przyszedł czas konkretów:
Takie coś działa:
Kod: |
Dim OrigSelection As ShapeRange
Set OrigSelection = ActiveSelectionRange
OrigSelection.AlignAndDistribute 0, 3, 2, 0, False, 2
|
Takie nie działa:
Kod: |
ActivePage.Shapes("nazwaShape").AlignAndDistribute 0, 3, 2, 0, False, 2
|
Swoją drogą chyba bym śię zdziwił, gdyby to tak zadziałało. Zapewne mozna jakoś zmusić mój dzielny Shape, by stał się ActiveSelectionRange i pewnie jest to łatwe... ale jeszcze nie wiem jak. Dodatkowo jak widzę dla takiego cuda mam wszytkie możliwe funkcje do sprawdzania szerokości i pozycji jakich potrzebuję. Czy takie same możliwośc daje mi coś innego dla Shape?
I jak to w obiektowym programowaniu, zapewne okaże się, że załatwia to jedna linijka kodu, tylko trzeba wymyślić jaka.
Mam nadzieję, że wyjaśniłem nieporozumienia i mogę liczyć na Waszą dalszą, jakże dla mnie cenną, pomoc..
Kvokul - 5 Sierpień 2016, 11:11
Centrowanie działa... oczywiście można było to osiągnąć odpowiednio w samym Corelu ustawiając tekst, czego nie wiedziałem.
Jeszcze tylko wielkość czcionek dobrać i et voilà!
Dziękuję za pomoc i jeżeli ktoś mi podpowie jak wielkość czcionek dobrać, to będę wdzięczny.
tomek123 - 6 Sierpień 2016, 00:44
Dodajesz do projektu formatkę
Na formatce umieszczasz pole tekstowe 'TextBox1' i przycisk 'CommandButton1'
Klikasz dwukrotnie na przycisk 'CommandButton1' wchodząc do kodu formatki
Wklejasz:
Kod: | Private Sub CommandButton1_Click()
Dim size#: size = TextBox1.Text
FontSize size
End Sub
Public Function FontSize(size#)
'sprawdzenie, czy cos jest zaznaczone
If Not ActiveSelection.SizeWidth > 0 Then MsgBox "Nic nie jest zaznaczone...": Exit Function
'sprawdzenie, czy zaznaczony obiekt to tekst
If Not ActiveShape.Type = cdrTextShape Then MsgBox "zaznaczony obiekt nie jest tekstem...": Exit Function
'zadeklarować konkretny zaznaczony tekstu jako obiekt Shape [s]
Dim s As Shape: Set s = ActiveShape
s.Text.Story.size = size 'za pomocą właściwości tego obiektu ustalić wielkosc czcionki
End Function |
Dobrze ustawić sobie domyślnie wartość pola tekstowego [Text] na jakąś wielkość czcionki, np 24.
Obiekt Shape to podstawowy obiekt w Corelu, najczęściej używany.
Jeżeli chcesz manipulować wielkością obiektu to np:
s.SizeWidth = 50
lub
s.SizeHeight = 20
albo
s.SetSize 50,20
lub pozycją
s.PositionX = 0 albo s.PositionY = 20
albo
s.SetPosition 0,20
Jeżeli chcesz wszystko w milimetrach musisz użyć w kodzie formuły
ActiveDocument.Unit = cdrMillimeter
jeżeli w metrach
ActiveDocument.Unit = cdrMeter
itp.
Shape ma wiele właściwości i metod, których najbardziej potrzebujesz
Obiekt ShapeRange to obiekt już pomocniczy (kilka Shape), służący do bardziej skomplikowanych operacji, jak grupowanie, łączenie, wyliczanie itp.
Kvokul - 6 Sierpień 2016, 12:24
Dziękuję. Właśnie dziś rano się przez to przebiłem wreszcie na spokojnie i rzeczywiście Shape ma multum możliwości - tak jak piszesz i on mi wystarczy do wszystkigo co robię w tym projekcie. Z uwagi na to, że część projektu wyświetlała i chowała i przetwarzała warstwy, nie wiem czy nie przepisze tego w całości tak, żeby wszystkie możliwe operacja były na Shape.
Wielkość czcionek załatwiłem, wszystko gra już. Twój przykład pokazał mi jak zrobić końcówkę, czyli określić te wielkości w konkretnym wymiarowaniu.
Tak na prawdę najbardziej mi pomogłeś na początku wskazując na jakim w ogóle obiekcie muszę pracować.
Bardzo dziękuję, bardzo mi pomogłeś! Bez Ciebie robiłbym to nie wiem ile czasu.
Corel ma zadziwiająca właściwość... czasem nie wiem czemu nie mogę zapisać projektu, pisze mi, że jest jakaś czynność w trakcie, szkoda, że nie wiem jak sprawdzić jaka.
Jedno pytanie, bardzo ważne - na jakich wersjach Corela to możę działać, czy są jakieś na których może nie ruszyć? Sam mam możliwość sprzwdzenia na X6 i X7 tylko...
grzjanik - 19 Kwiecień 2018, 10:13 Temat postu: Automat Witam Panowie.
Pod tym artykułem (Automatyczna) podałem jak ma się uruchamiać makro gdy otwieramy plik u Klienta.
W przykładzie jest automatyczna data, ale kod makra może być dowolny.
Pozdrawiam
GrzJanik
|
|