Odgovori 
Dijalog

Poštovanje,
Da li neko zna deo koda kojim bi sadržaj iz Text polja sa dijaloga prebacio
u npr. ćeliju A1 u Listu1?
Unpred hvala,
stevanović Valdisav
Citiraj ovu poruku u odgovoru

Vladislav Stevanovic wrote:
> Poštovanje,
> Da li neko zna deo koda kojim bi sadržaj iz Text polja sa dijaloga prebacio
> u npr. ćeliju A1 u Listu1?
> Unpred hvala,
> stevanović Valdisav
>
Ako se secam dobro iz vremena kada sam radio sa MS Office-om (VBA),
dovoljno je u Cell(A1).value upisati vrednost (.value) tog text polja.

Cell(A1).value := Text1.value

Ovo je naravno samo indikativno, ne znam pravu sintaksu.

Ljubomir
Citiraj ovu poruku u odgovoru

EVO ga:

sub ubaci
Dim oSheet,Cell, polje
polje = oDlg.getControl("polje1")
oSheet = ThisComponent.Sheets.getByName("List1")
cell = oSheet.getCellByPosition(0, 0)
cell.String = polje.Text
end sub
Citiraj ovu poruku u odgovoru

Vladislav Stevanovic wrote:
> cell = oSheet.getCellByPosition(0, 0)
Bilo bi bolje da odmah u startu koristite referencu po
oSheet.GetCellByName("A1") ByPosition, bice vam lakse da pratite a i
kopiranje koda ce biti mnogo lakse.

Jos ako Sub primi varijablu onda mozete iznova da koritite isti kod samo
pozivanjem na njega.

Sub Ubaci(Celija As String)
Dim oSheet,Cell, polje
polje = oDlg.getControl("polje1")
oSheet = ThisComponent.Sheets.getByName("List1")
cell = oSheet.getCellByName(Celija)
cell.String = polje.Text
End sub

a pozivate sa:

Ubaci("A1")

I ako se ne varam, koristenjem RangeByName mozete da popunjavate jednu
ali i vise celija istovremeno:

Ubaci("A1:B2")


Ljubomir Ljubojevic
PL Computers
Srbobran
Citiraj ovu poruku u odgovoru

Hvala Ljubomire. I sam sam u međuvremenu promenio
sa getByPosition na getByName.
Međutim, ovo sa varijablom ću da probam,
nisam ranije radio na taj način.


Srdačan pozdrav,
Stevanović Vladislav
Citiraj ovu poruku u odgovoru

Nastavio sam
sa radom u vezi dijaloga. Napravio sam dijalog1 i dijalog2 koji se poziva dugmetom na dijalogu1. Dijalog2 služi za podešavanje dijaloga1.
Prvi problem je bio je kada gasim dijalog2, gasi se i dijalog1. To sam rešio posebnim definisanjem listinera za dijalog2. Sada se gasi samo dijalog2 a dijalog1 ostaje prisutan.
Međutim, kada iz dijaloga1 uključim dijalog2, pa kliknem mišem na dijalog1, i želim da ugasim dijalog1, to je nemoguće, dugme na njemu za to kao da ne radi, a ostala dugmad za neke druge akcije rade! Ni gašenje na X u desnom gornjem uglu ne radi. Tek kada kliknem na dijalog2, i kada želim da ugasim dijalog2 opcija gašenja prozora radi ali ne samo za dijalog2, što bi trebalo, već se gase oba prozora!
Molim za pomoć iskusnije u ovome, jer ovo prevazilazi moje znanje. Korišćeni kodovi za podizanje dijaloga 1 (OpenDialog) i dijaloga2 (OpenDialog2) i gašenje istih su:

Sub OpenDialog
lFinished = False
version = " 0.1"
DialogLibraries.LoadLibrary("MAKROI")
oDlg = createUnoDialog(DialogLibraries.MAKROI.Dialog1)
oDlg.Title = "Kancelarija" & version
 
oDlg.setVisible( True )
oListener = CreateUnoListener("oDlg_", "com.sun.star.awt.XTopWindowListener")
oDlg.addTopWindowListener(oListener)
 
While Not lFinished
Wait 100
Wend
oDlg.setVisible( False )
End Sub
 
 
Sub CloseDialog()
  lFinished = True  
End Sub
 
Sub CloseDialog2()
  llFinished = True 
End Sub
 
Sub OpenDialog2
 
llFinished = False
version = " 0.1"
DialogLibraries.LoadLibrary("MAKROI")
oDlg = createUnoDialog(DialogLibraries.MAKROI.Dialog2)
oDlg.Title = "Kancelarija" & version
 
oDlg.setVisible( True )
ooListener = CreateUnoListener("oDlg_", "com.sun.star.awt.XTopWindowListener")
oDlg.addTopWindowListener(ooListener)
 
While Not llFinished
Wait 100
Wend 
oDlg.setVisible( False )
End Sub

Citiraj ovu poruku u odgovoru

Da rezimiramo, da u proceduri OpenDialog prikažete prozorče MAKROI.Dialog1 koje učitate funkicjom createUnoDialog() nad objektom prozorčeta (to što funkcija vrati kao rezultat) biste pozvali metod execute kao oDlg.execute(). Problem je što ova funkcija blokira izvršavanje drugog koda dok se prozor ne zatvori, a ako sam razumeo vi biste da se makro nastavi neometano?

Zato ćete prozor da učitate, ali nećete da ga izvršite već samo prikažete (oDlg.setVisible(True)). Međutim čim se makro završi i prozorčić će nestati. Jedno rešenje je da u makro dodate beskonačnu petlju koja će da radi sve dok ne poželite da zatvorite prozorčić.

Prirodno je da ova petlja bude u funkciji koja otvara prozorče (dakle ova funkcija će blokirati izvršavanje koda ispod njenog poziva dok se prozorče ne zatvori). Pri tome kroz posebnu globalnu promenljivu definišemo uslov za prekid i napravimo funkicju CloseDialog1 koja će da je odgovarajuće postavi.

dim dialog1_finished as Boolean
 
Sub OpenDialog1
  dim dialog1 as Object
  DialogLibraries.LoadLibrary("MAKROI")
  dialog1 = createUnoDialog(DialogLibraries.MAKROI.Dialog1)
 
  dialog1.setVisible(True)   ' prikaži prozor
  dialog1_finished = False   ' postavi uslov čekanja tako da prozorče ostane
  While Not dialog1_finished ' čekaj dok neko ne postavi dialog1_finished na True
    Wait 100 ' odmori 100ms da se procesor ne umori vrteći praznu petlju
  Wend
  dialog1.setVisible(False)  ' sakrij prozor
 
End Sub
 
Sub CloseDialog1
  dialog1_finished = True    ' samo "podesimo" uslov prekida petlje
End Sub


Za drugi prozor pravite drugu uslovnu promenljivu. Međutim nema potrebe za dve while petlje. Dovoljno je podesiti jednu koja će da proverava da li su i dialog1_finished i dialog2_finished tačni ili šta već ima smisla kao uslov za kraj makroa u vašem programu. Umesto u OpenDialog1 i OpenDialog2 proceduru, petlju stavite u funkciju iz koje otvarate prvi prozor, nakon što otvorite prozor. Ona na taj način čeka dok se makro ne završi zatvaranjem oba prozora.

Listener vam omogućava da se "zakačite" na događaje iz pokrenutog prozorčeta. com.sun.star.awt.XTopWindowListener interfejs podržava windowActivated, windowDeactivated (fokusiran, defokusiran), windowOpened, windowClosing, windowClosed (otvoren, zatvaranje, zatvoren), windowMinimized, windowNormalized (smanjen, vraćen) i disposing (uništen iza zatvaranja). Listener vam omogućava da pozovete vaše procedure na neki od ovih događaja.

Vama će Listener trebati da definišete proceduru za windowClosing kako biste iz nje pozvali CloseDialog1 da zatvori prozorče. U protivnom klik na dugme za zatvaranje prozora neće raditi.

Prvi argument listenera jeste prefiks imena procedura koje će biti pozvane za dato prozorče. Kako za prvo treba pozvati CloseDialog1, a za drugo CloseDialog2 treba da definišete dve grupe procedura. Dakle nakon setVisible(True):

listener = createUnoListener("dialog1_", "com.sun.star.awt.XTopWindowListener") 
dialog1.addTopWindowListener(listener)


i onda u kodu još:
Sub dialog1_windowClosing(oEv)
  CloseDialog1() ' mogli smo i direktno dialog1_finished = True, ali već
                  ' postoji procedura pa je bolje da ne dupliramo kod
End Sub
Sub dialog1_windowActivated(oEv)
End Sub
Sub dialog1_windowDeactivated(oEv)
End Sub
Sub dialog1_windowOpened(oEv)
End Sub
Sub dialog1_windowClosed(oEv)
End Sub
Sub dialog1_windowMinimized(oEv)
End Sub
Sub dialog1_windowNormalized(oEv)
End Sub
Sub dialog1_disposing(oEv)
End Sub



Ja bih međutim ostao pri varijanti da samo napravite prozorče i prikažete ga. Nikakvi listeneri, petlje, i nagomilan kod već najjednostavnije, korišćenjem gotovih rešenja. Onda logiku makroa vodite iz pokrenutog dijaloga. U ovom slučaju, to bi bilo:
Dim dialog1 As Object
 
Sub OpenDialog1
  DialogLibraries.LoadLibrary("MAKROI")
  dialog1 = createUnoDialog(DialogLibraries.MAKROI.Dialog1)
  dialog1.execute()
  dialog1.dispose()
End Sub


Razmislite i da dodelite pravo ime biblioteci (umesto sadašnjeg MAKROI) i prozorčićima (umesto Dialog1, Dialog2) jer će vam to pomoći da lakše čitate napisan kod.
Poseti veb stranicu korisnika
Citiraj ovu poruku u odgovoru

U pravu ste. Posmatrao sam CPU Usage u Windows Task Manager-u: kada se pokrene jedan ne-modalni dijalog koristi se oko par procenata kapaciteta, što nije strašno. Međutim, kada se otvori još jedan ne-modalni dijalog troši se 50% kapaciteta! I to na mašini Core 2 duo, sa dobrom radnom memorijom...
Međutim, kod ove aplikacije neophodno je da korisnik može da istovremeno radi i sa dijalogom i sa svojim dokumentom. Kompromis je da ne dozvolim da se mogu podići istovremeno dva takva prozora iz programa koji pišem. Moram naći rešenje da kada imam jedan dijalog otvoren (npr. dijalog kojim se popunjava nalog za prenos, i želim otvoriti dijalog sa kojim se podešavaju parametri prvog dijaloga, da se prvo jedan dijalog ugasi i odmah podigne drugi. Takođe treba naći rešenje da se ne može podići jedan isti dijalog dva puta u isto vreme. Ukoliko postoji neki primer, neki kod kod kojeg je ovo odrađeno, bio bih zahvalan, a verujem i zajednica, jer želim na kraju da ovaj program dam toj zajednici na besplatno korišćenje.
Citiraj ovu poruku u odgovoru

Mnogo lakše je pomoći ako je kod odmah tu, nego da se ja prvo mučim da smislim primere, pa da onda razgovaramo da li je to ono što je trebalo i kako to da ubacimo. Iz ove priče nije mi baš najjasnije u čemu je tačno problem i šta sa prozorčićima korisnik treba da radi.

U programiranju, uvek treba poći od jednostavne varijante, lepo razložiti zahtev na sitnije delove, i realizovati ih jedan po jedan. Najgore je kada se sistem zamisli pogrešno, a onda traže sve komplikovanija rešenja za pogrešan put.
Poseti veb stranicu korisnika
Citiraj ovu poruku u odgovoru

Hajde da ostane to još da se krčka u mojoj glavi, a što se tiče izgleda evo kako ti dijalozi izgledaju, pa sve molim za komentar i savete da bi bilo bolje.

Prilozi uz poruku .odg  Dijalozi.odg (Veličina: 208.5 kb)
Citiraj ovu poruku u odgovoru
Odgovori 




Kontakt | otvorenidokument.com | Povratak na vrh | Povratak na sadržaj | RSS