|
[ mika @ 23.04.2004. 11:45 ] @
| Ćao!
Imam jedan projekat (ili "projekat", whatever :D), koji sam radio u Access-u, i pošto su apetiti korisnika baze porasli, dobio sam zahtev da aplikaciju (odnosno forme i dijaloge u njoj) prevedem na strani jezik. Dakle, ja sam mislio sledeće: da u jednoj tabeli sa strukturom (#id_pojma,sifra_pojma,srpski,engleski,german) držim pojmove, a da u svakoj formi u onLoad property-ju napravim proceduru koja će na osnovu nekog parametra (možda na startup formi) da pravi query i da za svaki Label pročita iz recordset-a pojam i zameni ga, po potrebi.
E sad, ovo sve šljaka ali interesuje me da li je to optimalno rešenje? Mislim, verovatno može i bolje, verovatno ima neko bolji/optimalniji prevod? Da li koristiti recordset-e, npr:
Code:
Set cn = CurrentProject.Connection
Set rst = New ADODB.Recordset
With rst
.ActiveConnection = cn
.Source = "SELECT srpski as izraz FROM recnik where sifra_pojma=" & Me!id_objekta
.LockType = adLockOptimistic
.CursorType = adOpenStatic
.Open
End With
Me![Label0].Caption = rst("izraz")
Naravno, to bi sve bilo u petlji, za sve labele u formi, i na osnovu izbora jezika bilo bi srpski, engleski, whatever.
Da li je optimalno rešenje? Ima li ko nešto da doda/predloži itd.? |
[ Zidar @ 23.04.2004. 13:47 ] @
Resenje je dobro ali ne i optimalno. Loop kroz sve labele i dugmice na formi sa menjanjem caption je OK.
Sta nije optimalno? Stuktura tvoje tabele. Ogranicio si se na tacno 3 jezika i svaki je u posebnom polju. Ako zelis da dodas jos neki jezik, nemas izbora osim da menjas tabelu, da dodajes polja. Sve i da ostanu samo 3 jezika, moras da imas 3 kverija koji citaju prevedene captions, po jedan za svaki jezik. Ako normalizujes tabelu, pa ona ima polja (#id_pojma, Language,AccessControlName, TranslatedText) i izgleda ovako:
1,"Eng","lblLabel1","English Text for label 1"
2,"Eng","lblLabel2","English Text for label 2"
3,"Eng","lblLabel3","English Text for label 3"
4,"Fre","lblLabel1","French Text for label 1"
5,"Fre","lblLabel2","French Text for label 2"
6,"Fre","lblLabel3","French Text for label 3"
7,"Ger","lblLabel1","German Text for label 1"
8,"Ger","lblLabel2","German Text for label 2"
9,"Ger","lblLabel3","German Text for label 3"
Na ovaj nacin mozes da dodajes jezike po volji, a kveri koji cita iz tabele je uvek isti, sa paramrtrom za Language.
Jos nesto bi bilo korisno da imas - proceduru koja olaksava odrzavanje tabele sa prevodima. Form i reporti se u aplikaciji manjaju, p-re ili kasnije. Dodaju se nove forme, novi reporti, dodaju se ili brisu kontrole. Mogao bi da napravis proceduru kojoj saljes kaomparametar ime forme/reporta i zeljeni jezik a onda procedura protrci kroz sve labele i dugmad na formi i ako se kontrola ne nalazi u tabeli tblTranslations, procedura doda nove rekorde u tabelu. Veruj mi, mnogo je lakse nego rucno odrzavati tabelu. Ako ti treba pomoc, odgovori na post, mislim da imam nesto slicno uradjeno od ranije.
:-)
[ mika @ 23.04.2004. 14:41 ] @
OK, na tabelu sam i mislio da sugerišete :D I možda na VBA kod.
Inače, ja sam tabelu tako zamislio u svojoj glavi pa sam je brže-bolje preneo na papir, jer mi takva struktura najlakše prikazuje sve reči, i olakšava održavanje baze, zato što kad menjam reč, "pored" nje imam već reč na drugom jeziku itd. Ali, jasno je da se takav "view" može postići i odgovarajućim upitom, nad tvojom tabelom. Malo komplikovanije, ali može. A da je tvoj predlog optimalniji - jeste, vidi se na prvi pogled, uz opasku da u mojoj tabeli može da stoji i : (#id_izraza, jezik_1, jezik_2, . . ., jezik_n), gde n<5, sigurno. Mada je jedan od uslova postojanje baze podataka, mogućnost beskonačnog dodavanja recorda, ne i kolona...
[ mika @ 11.05.2004. 10:11 ] @
Xm, malo sam se zapetljao sa ovim, i uopšte nemam ideju kako mogu sa jednom With strukturom da prođem kroz sve elemente na formi? Mislim, to mi je potrebno za željenu proceduru održavanja.
Dakle, scenario je sledeći: Dodam novu kontrolu na formu, pozovem proceduru koja prođe kroz sve elemente na formi i dodaje elemente u tabelu. Mislim, sve mi je to jasno, ali ne znam kako u VBA da implementiram to "trčanje" kroz formu? Neki prost kod koji recimo štampa sve elemente na formi bi mi dobro došao.
Hvala puno!
[ Zidar @ 11.05.2004. 14:55 ] @
Mozda ovo pomogne. Forma mora biti otvorena. Iz debug window startujes funkciju, ime forme je argument. Funkcija trci kroz kolekciju kontrola na formi i onda nesto radis sa tim kontrolama, na primer menjas im Caption property.
BEGIN
Code
Function ReadCaptions(frmName As String)
Dim ctl As Control
Dim frm As Form
'ControlType = INT, 100=label,109=text box, 104=button, 112=subform
DoCmd.OpenForm frmName
Set frm = Forms(frmName)
For Each ctl In frm
Debug.Print ctl.Name, ctl.ControlType; 'works ControlType=INT
If TypeOf ctl Is CommandButton Then
Debug.Print " ", "Command Button"
End If
If TypeOf ctl Is Label Then
Debug.Print " ", "Label"
End If
Next
End Function
/Code
END
Evo jos pa se snalazi:
BEGIN
code
Function ChangeSingleCaption(frmName As String, strlabelName As String, strNewName As String) As Boolean
Dim ctl As Control
Dim frm As Form
ChangeSingleCaption = False
Set frm = Forms(frmName)
frm.Controls(strlabelName).Caption = strNewName
Debug.Print frm.Controls(strlabelName).Caption
ChangeSingleCaption = True
End Function
Function ChangeAllCaptions(strFormName As String, intLang As Integer)
'Purpose: Translates labels and button captions for given form
'Called by: ThisModule.TranslateForm(frmName as string)<-- Form.OnOpen()
'Calls: ChangeSingleCaption
On Error GoTo Error_Handler
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
Set db = CurrentDb
strSQL = "SELECT FormName,CtlName, TheCaption " _
& " FROM _tsysFormLabels " _
& " WHERE FormName='" & strFormName & "'" _
& " AND LangString=" & intLang
Set rs = db.OpenRecordset(strSQL)
If rs.RecordCount = 0 Then
GoTo EXIT_HERE:
Else
With rs
.MoveFirst
Do While Not .EOF
Call ChangeSingleCaption(strFormName, !CtlName, !TheCaption)
.MoveNext
Loop
End With
End If
EXIT_HERE:
On Error Resume Next
rs.Close
Set db = Nothing
Exit Function
Error_Handler:
Select Case Err
Case Else
MsgBox "Error " & Err.Number & vbCrLf & Err.Description, vbOKOnly, "ChangeAllCaptions"
End Select
Resume EXIT_HERE:
End Function
Function TranslateForm(strFormName As String)
Dim intLang As Integer
intLang = DLookup("LanguageID", "_tblLocalSettings")
Call ChangeAllCaptions(strFormName, intLang)
End Function
/code
END
[ mika @ 12.05.2004. 14:44 ] @
Super,hvala puno, nekako u isto vreme kad si mi ti pisao izbunario sam i ja rešenje iz neke knjige i helpa u vidu sledećeg:
Code:
Sub Proba(frmName As String)
On Error GoTo Form_Err
Dim ctlControl As Control
For Each ctlControl In Forms!frmName.Controls
Debug.Print ctlControl.Caption, ctlControl.ControlType
Next
Form_Exit:
Exit Sub
Form_Err:
If Err.Number = 438 Then
Resume Next
Else
MsgBox Err.Description
Resume Form_Exit
End If
End Sub
E sad, ja sam uporno pisao ctlControl.Type umesto ctlControl.ControlType, to nisam nigde našao u dokumentaciji da postoji. Takođe, javlja se čudan error 438, koga sam ovim error handlerom eliminisao. Kako i zbog čega-ne znam. Sada je lako...
Uopšte, bitno mi je bilo samo da provalim da se pomoću for each... next strukture vrši pristupanje svakom elementu iz kolekcije (što i nije neka "provala"... ali ja i nisam neki VB "tata-mata-wannabe"), elem sad je sve OK, ostaje da dodatno razvijem ovu proceduricu i gotovo. Muče me samo još dva "crva": zašto se uvek javlja dotična greška, i zašto forma mora da bude otvorena, prilikom pristupa njenoj kolekciji kontrola. Mislim, ovaj kod mi ne radi nikako:
Code:
Dim frmCurrent As Form
Dim ctlControl As Control
For Each frmCurrent In Forms
For Each ctlControl In Forms!frmCurrent.Controls
'bilosta, npr:
Debug.Print ctlControl.Caption, ctlControl.ControlType
Next
Next
Any answers?
[ Zidar @ 12.05.2004. 16:54 ] @
Ovako:
Forms je Collection. Forme koje vidis u Forms window nisu clanovi kolekcije dok se ne otvore. DAO ne zna da forme postoje sve dok ih ne otvoris. Zato forma mora da bude otvorena da bi joj pristupio.
Greska 438 se javlja kad pokusas da citas property koji data kontrola ne poseduje. U tvom slucaju verovatno puca na 'Caption' jer nema svaka kontrola caption. Dobro ti je resenje da ignorises tu gresku, sad kad znas sta je u pitanju.
Evo ga malo izmenjen i dopunjen tvoj kod. Upotrebio sam With ...End With strukturu za ispis pojedinacnih property. na taj nacin, kada pukne znas tacno zbog cega je puklo. kad ih drzis sve u jednoj liniji ne znas koja property izaziva pucanje. Zapazi i malo prosiren error handler. Ignorise gresku 438 ali ima mogucnost da pokupi i druge greske koje se mogu javiti.
:-)
Code:
Function LoopKrozForme()
Dim frmCurrent As Form
Dim ctlControl As Control
Dim flgCollEmpty As Boolean
On Error GoTo ERROR_CODE
flgCollEmpty = True
For Each frmCurrent In Forms
Debug.Print "Form " & frmCurrent.Name & ", list of controls:"
Debug.Print "------------------------------------------------"
For Each ctlControl In frmCurrent.Controls
flgCollEmpty = False
'bilosta, npr:
With ctlControl
Debug.Print " Control name: " & .Name
Debug.Print " Control caption: " & .Caption
Debug.Print " Control type: " & .ControlType
Debug.Print
End With
Next
Debug.Print "------------------------------------------------"
Debug.Print
Next
If flgCollEmpty = True Then
MsgBox "There are no forms in the colelction!" & vbCrLf & _
"Forms must be Open in order to loop through the Forms collection."
End If
EXIT_HERE:
Exit Function
ERROR_CODE:
Select Case Err.Number
Case 438
Resume Next
Case Else
MsgBox Err.Description & vbCrLf & "in LoopKrozForme", _
Title:="ERROR " & Err.Number
Resume EXIT_HERE:
End Select
End Function
[ mika @ 13.05.2004. 08:33 ] @
Super, ovo sve šljaka, samo me interesuje zašto ovo neće da radi:
Code:
sub Proba(arg as string)
docmd.OpenForm(arg)
end sub
...Javi mi error? Kada bih uspeo ovo da odradim (da mi iz procedure otvara sve forme) onda ne bi bilo problema, ovako moram ručno da ih otvaram. I da na onOpen ili onLoad property stavim neku proceduru koja će u letu da prevodi formu, zavisno od stanja nekog listbox-a za jezike na main switchboard-u.
[ Zidar @ 13.05.2004. 15:17 ] @
Ne znam zasto ti kod sa Docmd.OpenForm (stArg) ne radi. Kopirao sam kod i kod mene radi. Da nije ime forme pogresno?
U svakom slucaju, ako hoces da radis prevodjenej formi, moje iskustvo je da je najefikasniji nacin onaj koji si naslutio ali ti se ne svidja. Za svaku formu koju zelis da prevedes, u OnLoad ubacis poziv funkcije koja prevodi natpise na formi. To je efikasnije nego na pocetku otvarati sve forme, prevesti pa onda poceti rad.
:-)
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|