Tips&Tricks
51 отговора
7243 прегледа
Закачена
Tips&Tricks
По предложение на проГЪРМИст (извинявам се за грешката, която допуснах) пускам тази тема, оставям я статична, и ще събираме в нея само тънкости и хитрости!
Кратко съдържание:
Четене и писане във файлове
Промяна на шрифта на контролите на Форма
Get Item from point in List box
XP style
Добавяне на 4ти бутон в titlebar
Konvertirane na Desetichni chisla v dvoichni
Promjana Resolucijata na ekrana!
Модул за ъпдейтване на приложението
Засега толкова. Добавяйте каквото мислите, че е интересно за обсъждане. ;о)
----------------------------------
помислих, хареса ми, помислих пак...
Кратко съдържание:
Четене и писане във файлове
Промяна на шрифта на контролите на Форма
Get Item from point in List box
XP style
Добавяне на 4ти бутон в titlebar
Konvertirane na Desetichni chisla v dvoichni
Promjana Resolucijata na ekrana!
Модул за ъпдейтване на приложението
Засега толкова. Добавяйте каквото мислите, че е интересно за обсъждане. ;о)
----------------------------------
помислих, хареса ми, помислих пак...
Редактирано от Щиpлиц на
Четене и писане във файлове
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Функция за четене на стойност от INI файл
Public Function Fun_ReadINIValue(strSection As String, _
strKey As String, _
strINIFileName, _
Optional strDefaultCaption As String = "") As String
Dim strRet As String
Dim lngSize As Long
Dim lngResult As Long
' Ако смятате че реда който ще прочитате е по-дълъг от 1024 символа, сменете цифрата в следващия ред
Const lngLongestValue As Long=1024
strRet = String(lngLongestValue, 0)
lngResult = GetPrivateProfileString(strSection, strKey, strDefaultCaption, strRet, lngLongestValue, strINIFileName)
strRet = Left$(strRet, lngResult)
Fun_GetCaption = Fun_ReadINIValue
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Процедура за запис на стойност в INI файл
Public Sub Sub_WriteINIValue(strSection As String, _
strKey As String, _
strValue As String, _
strINIFile As String)
WritePrivateProfileString strSection, strKey, strValue & Chr$(0), strINIFile
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Функция за четене на съдържанието на текстов файл
' Удобна е за не много големи файлове (например до 4000-5000 реда или 100-200 килобайта)
Public Function Fun_GetTextFileContents(strFileName As String) As String
Dim strLine As String
Dim strFileContents As String
Dim intFreeFile As Integer
Dim lngLOF As Long
intFreeFile = FreeFile()
Open strFileName For Input As #intFreeFile
lngLOF = LOF(intFreeFile)
If lngLOF > 0 Then
Do While Not EOF(intFreeFile)
Line Input #intFreeFile, strLine
strFileContents = strFileContents & strLine & vbCrLf
Loop
End If
Close #intFreeFile
Fun_GetTextFileContents = strFileContents
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Функция за четене от двоичен файл
' Ако за intFileNumber се изпрати 0, файла указан в strFileToOpen ще се
' отвори, ще се прочете и ще се затвори
' Ако за intFileNumber се изпрати >0, това значи че файл с такъв номер вече е
' отворен от друго място в програмата. Той трябва да е отворен "For Binary"
' Функцията връща броя на прочетените байтове а в параметъра byteData() е
' прочетеното съдържание
' Ако няма достатъчно данни (например ако са заявени да се прочетат
' например 1000 байта от отместване 500 а файла е с размер само 1300
' байта), функцията връща 0
Public Function Fun_ReadFileData(intFileNumber As Integer, _
lngStart As Long, _
lngLength As Long, _
byteData() As Byte, _
Optional strFileToOpen As String) As Long
Dim lngFileLen As Long
Dim strTemp As String
Dim intI As Integer
Dim boolInternalFileOpen As Boolean
If intFileNumber = 0 Then
intFileNumber = FreeFile()
Open strFileToOpen For Binary Access As #intFileNumber
boolInternalFileOpen = True
End If
lngFileLen = LOF(intFileNumber)
' Да се прочете от файла само ако съществуват lngLength байта данни от отместване lngStart
If (lngFileLen >= lngStart And lngFileLen >= (lngStart + lngLength - 1) And lngStart > 0 And lngLength > 0) Then
ReDim byteData(lngLength - 1) As Byte
Get #intFileNumber, lngStart, byteData
If boolDecryptData = True Then
Call Sub_DecryptByteArray(byteData, pbytePass, boolUseDateTimeDecryption)
End If
Fun_ReadFileData = UBound(byteData) + 1
End If
If boolInternalFileOpen = True Then
Close #intFileNumber
End If
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Процедура за запис в двоичен файл
' Ако за intFileNumber се изпрати 0, файла ще се отвори, ще се прочете и ще се затвори
' Ако за intFileNumber се изпрати >0, това значи че файл с такъв номер вече е
' отворен от друго място в програмата. Той трябва да е отворен "For Binary"
' В lngStart се задава отместването спрямо началото на файла от където да се запише byteData
Public Sub Sub_WriteFileData(intFileNumber As Integer, _
lngStart As Long, _
byteData() As Byte, _
Optional strFileName As String="")
Dim boolInternalFileOpen As Boolean
If intFileNumber = 0 Then
intFileNumber = FreeFile()
Open strFileName For Binary Access As #intFileNumber
boolInternalFileOpen = True
End If
Put #intFileNumber, lngStart, byteData
If boolInternalFileOpen = True Then
Close #intFileNumber
End If
End Sub
Редактирано от Щиpлиц на
Промяна на шрифта на контролите на Форма
' Процедурата установява шрифта за всички обекти (контроли) върху Форма
' Може лесно да бъдат добавени и други свойства на шрифта
' Ако boolSetToAllForms = True ще се промени шрифта на всички обекти (контроли) върху всички Форми в проекта
' (правете това само ако всички форми от проекта са заредени)
' Ако някой от контролите има .Tag "FontLocked" неговия шрифт няма да се промени
' Пример: Call Sub_SetFont(Form1,"Tahoma",204,False) -> Ще промени шрифта на всички обекти (контроли) върху Form1
Public Sub Sub_SetFont( _
objTarget As Object, _
strFontName As String, _
intFontCharset As Integer, _
Optional boolSetToAllForms As Boolean = False)
On Error Resume Next
Dim objTargets As Object
Dim objTargetControls As Object
' Ако не е за всички Форми а само за objTarget
If boolSetToAllForms = False Then
For Each objTargetControls In objTarget.Controls
If objTargetControls.Tag <> "FontLocked" Then
objTargetControls.Font.Charset = intFontCharset
objTargetControls.Font.Name = strFontName
End If
Next
Else ' Ако е за всички Форми в проекта
For Each objTargets In VB.Forms
For Each objTargetControls In objTargets.Controls
If objTargetControls.Tag <> "FontLocked" Then
objTargetControls.Font.Charset = intFontCharset
objTargetControls.Font.Name = strFontName
End If
Next
Next
End If
End Sub
Редактирано от Щиpлиц на
Re: Промяна на шрифта на контролите на Форма
Дай малко повече потробности около приложението на тази функция, ако обичаш. Благодаря!
Бии, за да те уважават!
Бии, за да те уважават!
Re: Промяна на шрифта на контролите на Форма
Ами, най-вероятно аз лично бих го ползвал за Language Pack.
----------------------------------
помислих, хареса ми, помислих пак...
----------------------------------
помислих, хареса ми, помислих пак...
Re: Промяна на шрифта на контролите на Форма
Добре. Явно не зададох въпросът си правилно.
Исках да попитам как точно се организира едно приложение, когато в него трябва да има интерфейси на различни езици?
Дано да съм задал въпросът си по-добре.
Бии, за да те уважават!
Исках да попитам как точно се организира едно приложение, когато в него трябва да има интерфейси на различни езици?
Дано да съм задал въпросът си по-добре.
Бии, за да те уважават!
Re: Промяна на шрифта на контролите на Форма
Ами виж аз как съм го направил:
1. Тази процедура, която установява шрифта, и се предават два параметъра (може да се направи и с повече параметри ако е необходимо). Първия например е шрифта който да се "приложи" към обектите от формата а втория е "Script" на този език. Ако юзера иска да ползва езика по подразбиране на Windows за "Script" изпраща 0, аз за име на шрифт някой който му харесва :) Ако пък друг юзер иска български език, изпраща например "Arial" и "Script" 204 (Cyrillic) (Естествено това е възможно ако е добавено "Multilanguage support" и другите ала-бала на Windows за кирилизацията). Ако иска може да ползва шрифт който съдържа буквите от неговия език, ако Windows не разполага с такъв (съмнявам се че няма всички абуки които се ползват по света но както и да е:)
2. Имам една публична процедура с име Sub_LoadCaptions. На нея и се предава параметър кой език се ползва в момента и за коя форма става въпрос. Тя зарежда съответните надписи от файла (ИНИ файл например) с този език които се отнасят за формата и ги слага на контролите (по един ред код за всеки контрол).
И се прави следното:
Като се зареди някоя форма се извиква Sub_SetFont със съответните параметри (параметрите може и да са глобални променливи). След това се извиква Sub_LoadCaptions за да зареди надписите за тази форма от съответния език (файл).
По този начин не само че могат да се поддържат повече от един език за програмата, но и варианти на един и същ език. И при положение че надписите по програмата са в текстови файлове, юзера може да си ги променя както сметне за добре.
Идеята на процедурата Sub_SetFont е, че с нея могат да се сменят шрифтовете по програмата (това значи и използвания език) докато тя работи.
1. Тази процедура, която установява шрифта, и се предават два параметъра (може да се направи и с повече параметри ако е необходимо). Първия например е шрифта който да се "приложи" към обектите от формата а втория е "Script" на този език. Ако юзера иска да ползва езика по подразбиране на Windows за "Script" изпраща 0, аз за име на шрифт някой който му харесва :) Ако пък друг юзер иска български език, изпраща например "Arial" и "Script" 204 (Cyrillic) (Естествено това е възможно ако е добавено "Multilanguage support" и другите ала-бала на Windows за кирилизацията). Ако иска може да ползва шрифт който съдържа буквите от неговия език, ако Windows не разполага с такъв (съмнявам се че няма всички абуки които се ползват по света но както и да е:)
2. Имам една публична процедура с име Sub_LoadCaptions. На нея и се предава параметър кой език се ползва в момента и за коя форма става въпрос. Тя зарежда съответните надписи от файла (ИНИ файл например) с този език които се отнасят за формата и ги слага на контролите (по един ред код за всеки контрол).
И се прави следното:
Като се зареди някоя форма се извиква Sub_SetFont със съответните параметри (параметрите може и да са глобални променливи). След това се извиква Sub_LoadCaptions за да зареди надписите за тази форма от съответния език (файл).
По този начин не само че могат да се поддържат повече от един език за програмата, но и варианти на един и същ език. И при положение че надписите по програмата са в текстови файлове, юзера може да си ги променя както сметне за добре.
Идеята на процедурата Sub_SetFont е, че с нея могат да се сменят шрифтовете по програмата (това значи и използвания език) докато тя работи.
Re: Get Item from point in List box
Option Explicit
Private Declare Function SendMessage _
Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const LB_ITEMFROMPOINT = 425
Private Sub Form_Load()
Dim i As Long
For i = 0 To 10
List1.AddItem i
Next i
End Sub
Private Sub List1_MouseMove( _
Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim X_ As Integer, Y_ As Integer
Dim Coord As Long
Dim RetVal As Long
X_ = X \ Screen.TwipsPerPixelX
Y_ = Y \ Screen.TwipsPerPixelY
Coord = MakeDWord(X_, Y_)
RetVal = SendMessage( _
List1.hwnd, LB_ITEMFROMPOINT, 0&, Coord)
If HiWord(RetVal) = 1 Then
'Курсора е извън list box-a -> outside the client area
End If
If HiWord(RetVal) = 0 Then
Me.Caption = List1.List(LoWord(RetVal))
End If
End Sub
Function MakeDWord(LoWord As Integer, HiWord As Integer) As Long
MakeDWord = (HiWord * &H10000) Or (LoWord And &HFFFF&)
End Function
Function LoWord(DWord As Long) As Integer
If DWord And &H8000& Then ' &H8000& = &H00008000
LoWord = DWord Or &HFFFF0000
Else
LoWord = DWord And &HFFFF&
End If
End Function
Function HiWord(DWord As Long) As Integer
HiWord = (DWord And &HFFFF0000) \ &H10000
End Function
Редактирано от Щиpлиц на
Re: Промяна на шрифта на контролите на Форма
Братя незнам за вас ама аз писах едно програмче дето имаше меню на три езика: български, мъкедонски и швабски!!!
Възползвах се от Unicode и си го наплесках в едно ресурсно файлче и немах никакви грижи.
Държа да отбележа че не съм си превеждал аз менютата на различните от БГ езици!!!
Наведи главата защото прелитам ниско с асконата !!!
Възползвах се от Unicode и си го наплесках в едно ресурсно файлче и немах никакви грижи.
Държа да отбележа че не съм си превеждал аз менютата на различните от БГ езици!!!
Наведи главата защото прелитам ниско с асконата !!!
Re: Промяна на шрифта на контролите на Форма
То с ресурсен файл става лесно. Но ми се случва това:
Направил съм ресурсен файл с Български и Английски менюта. Вина ми е сетнат на Bulgarian заради кирилицата (не ползвам ФлексТъп). Но аз пък искам програмата да ми е с менюта на английски. Хммм, а как да я убедя да не си превключва сама на българските?
----------------------------------
помислих, хареса ми, помислих пак...
Направил съм ресурсен файл с Български и Английски менюта. Вина ми е сетнат на Bulgarian заради кирилицата (не ползвам ФлексТъп). Но аз пък искам програмата да ми е с менюта на английски. Хммм, а как да я убедя да не си превключва сама на българските?
----------------------------------
помислих, хареса ми, помислих пак...
Re: Промяна на шрифта на контролите на Форма
Хммм, ами аз пък се чудех как да я убедя да си прочете настройките от регионалниа лист и намерих некъв начин, ама аз доколкото си спомням при инсталациата питах на какъв език да е, и дори инсталациата си минаваше в избрания език, ще си потърся проекта и ще ти кажа как съм го направил
Наведи главата защото прелитам ниско с асконата !!!
Наведи главата защото прелитам ниско с асконата !!!
Re: Промяна на шрифта на контролите на Форма
По-добре е настройките на надписите (езиците) да е във файл, който е достъпен за клиента (най-добре текстов файл). Така той ще може да си променя надписите както му харесва - а когато езиците са в ресурсен файл, за всеки нов език (или всяка промяна в който и да е надпис) ще трябва да правиш друго EXE :)
Re: Промяна на шрифта на контролите на Форма
Здрасти,
Мен ме нямаше определено време и гледам нещо много спокойствие е настанало в тоя клуб, затова да ти наруша спокойствието като ти задам един въпрос и после да изчезвам, че няма време.
Въпросчето ще бъде елементарно и относно кода. Както се сещаш не съм го тествал тоя код, но като погледнах тази втората част нещо не ме кефи. Може и да бъркам, де. Та когато флага ти за сетване на всички форми е True би трябвало да се сетне шрифта на всички контроли във всички форми. Добре. Въпросът е:
Ако в един проект имаш и Юзерконтроли.
И тези Юзерконтроли имат много контроли в себе си и след това тези Юзерконтроли ги наредиш по формите, тази функция с boolSetToAllForms = True ще смени ли шрифта на контролите, които се намират в Юзерконтролите, които пък от своя страна се намират по формите?
И спокойно. Само питам, нали?
Бии, за да те уважават!
Мен ме нямаше определено време и гледам нещо много спокойствие е настанало в тоя клуб, затова да ти наруша спокойствието като ти задам един въпрос и после да изчезвам, че няма време.
Въпросчето ще бъде елементарно и относно кода. Както се сещаш не съм го тествал тоя код, но като погледнах тази втората част нещо не ме кефи. Може и да бъркам, де. Та когато флага ти за сетване на всички форми е True би трябвало да се сетне шрифта на всички контроли във всички форми. Добре. Въпросът е:
Ако в един проект имаш и Юзерконтроли.
И тези Юзерконтроли имат много контроли в себе си и след това тези Юзерконтроли ги наредиш по формите, тази функция с boolSetToAllForms = True ще смени ли шрифта на контролите, които се намират в Юзерконтролите, които пък от своя страна се намират по формите?
И спокойно. Само питам, нали?
Бии, за да те уважават!
Re: Промяна на шрифта на контролите на Форма
Няма да ги сетне много ясно :)
UserControl-a ако не ти предоставя методи с които да имаш достъп до контролите вътре в него как ще ги "достигнеш" без да ползваш например API функция за енумериране на child прозорците ? :) Това е все едно да извикаш Private Function/Sub/Property на някой UserControl/Class/ActiveX :)
Само за да разбереш какво имам впредвид - Стартирай ВБ с нов ЕХЕ проект. Добави един UserControl а в него сложи един CommandButton. Сложи този UserControl на формата и се опитай да напишеш UserControl1.Command1.Caption="Blah" :) Няма да стане... :)
Спокоен съм :)
UserControl-a ако не ти предоставя методи с които да имаш достъп до контролите вътре в него как ще ги "достигнеш" без да ползваш например API функция за енумериране на child прозорците ? :) Това е все едно да извикаш Private Function/Sub/Property на някой UserControl/Class/ActiveX :)
Само за да разбереш какво имам впредвид - Стартирай ВБ с нов ЕХЕ проект. Добави един UserControl а в него сложи един CommandButton. Сложи този UserControl на формата и се опитай да напишеш UserControl1.Command1.Caption="Blah" :) Няма да стане... :)
Спокоен съм :)
Re: Промяна на шрифта на контролите на Форма
Значи излиза, че тази функция няма да ми свърши никаква работа ако реша да си правя приложенията "интернационални", защото имам много UserControl-и в проектите?
И кво да правя ся?
Да махна UserControl-ите и да наредя всички контроли по няколко пъти по формите. Неееееее. Много работа.
Да. Сетих се. Сетих се.
Ще накарам потребителите да научат български, защото интерфейса ми е само на български. Най-бързо, най-лесно и най-удобно за мене,
ами за тях..........Ще бъдат очаровани,.............вероятно
Бии, за да те уважават!
И кво да правя ся?
Да махна UserControl-ите и да наредя всички контроли по няколко пъти по формите. Неееееее. Много работа.
Да. Сетих се. Сетих се.
Ще накарам потребителите да научат български, защото интерфейса ми е само на български. Най-бързо, най-лесно и най-удобно за мене,
ами за тях..........Ще бъдат очаровани,.............вероятно
Бии, за да те уважават!
Re: Промяна на шрифта на контролите на Форма
Не ве :)
Просто направи метод на твоите UserControl - и чрез който да може да се сменя шрифта на контролите вътре в него. Направи нещо като .ChangeAllFonts(objFont as StdFont) и вътре си напиши:
Set Command1.font=objFont
Set Command2.font=objFont
...
...
и т.н. изреди си всички контроли вътре в UserControl-a
И вече твоите UserControls ще предоставят метод чрез който да се сменя шрифта на контролите вътре в тях.
:))
Усещам някаква подигравка в думите които си написал :)
Обаче ти като не си предоставил интерфейс чрез който да се сменят контролите вътре в твоя UserControl никой не ти е виновен че шрифта им не може да се смени с един ред код - най-малкото пък можеш да се сърдиш на моя код за смяна на шрифта - при мен си работи идеално (и аз имам UserControl-и със други контроли в тях но съм си решил проблема - написал съм .SetAllFonts вътре в UserControl-a - вземи и ти да си напишеш).
Просто направи метод на твоите UserControl - и чрез който да може да се сменя шрифта на контролите вътре в него. Направи нещо като .ChangeAllFonts(objFont as StdFont) и вътре си напиши:
Set Command1.font=objFont
Set Command2.font=objFont
...
...
и т.н. изреди си всички контроли вътре в UserControl-a
И вече твоите UserControls ще предоставят метод чрез който да се сменя шрифта на контролите вътре в тях.
:))
Усещам някаква подигравка в думите които си написал :)
Обаче ти като не си предоставил интерфейс чрез който да се сменят контролите вътре в твоя UserControl никой не ти е виновен че шрифта им не може да се смени с един ред код - най-малкото пък можеш да се сърдиш на моя код за смяна на шрифта - при мен си работи идеално (и аз имам UserControl-и със други контроли в тях но съм си решил проблема - написал съм .SetAllFonts вътре в UserControl-a - вземи и ти да си напишеш).