Tips&Tricks

51 отговора 7243 прегледа Закачена
#1

Tips&Tricks

По предложение на проГЪРМИст (извинявам се за грешката, която допуснах) пускам тази тема, оставям я статична, и ще събираме в нея само тънкости и хитрости!


Кратко съдържание:
Четене и писане във файлове
Промяна на шрифта на контролите на Форма
Get Item from point in List box
XP style
Добавяне на 4ти бутон в titlebar
Konvertirane na Desetichni chisla v dvoichni
Promjana Resolucijata na ekrana!
Модул за ъпдейтване на приложението

Засега толкова. Добавяйте каквото мислите, че е интересно за обсъждане. ;о)

----------------------------------
помислих, хареса ми, помислих пак...

Редактирано от Щиpлиц на

Отговор
в отговор на Щиpлиц #2

Как да си направим shortcut

Така или така


Редактирано от killall на

Отговор
в отговор на Щиpлиц #3

Re: Tips&Tricks

Предложението не беше мое :)

Отговор
в отговор на Щиpлиц #4

Четене и писане във файлове


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' Функция за четене на стойност от 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лиц на

Отговор
в отговор на Гeoprи #6

Промяна на шрифта на контролите на Форма



' Процедурата установява шрифта за всички обекти (контроли) върху Форма
' Може лесно да бъдат добавени и други свойства на шрифта
' Ако 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лиц на

Отговор
в отговор на Гeoprи #7

Re: Промяна на шрифта на контролите на Форма

Дай малко повече потробности около приложението на тази функция, ако обичаш. Благодаря!

Бии, за да те уважават!
Отговор
в отговор на пpoГЪPMИcт #8

Re: Промяна на шрифта на контролите на Форма

Ами, най-вероятно аз лично бих го ползвал за Language Pack.

----------------------------------
помислих, хареса ми, помислих пак...
Отговор
в отговор на Щиpлиц #9

Re: Промяна на шрифта на контролите на Форма

Добре. Явно не зададох въпросът си правилно.
Исках да попитам как точно се организира едно приложение, когато в него трябва да има интерфейси на различни езици?

Дано да съм задал въпросът си по-добре.

Бии, за да те уважават!
Отговор
в отговор на Щиpлиц #10

Re: Промяна на шрифта на контролите на Форма

Точно !

Отговор
в отговор на пpoГЪPMИcт #11

Re: Промяна на шрифта на контролите на Форма

Ами виж аз как съм го направил:

1. Тази процедура, която установява шрифта, и се предават два параметъра (може да се направи и с повече параметри ако е необходимо). Първия например е шрифта който да се "приложи" към обектите от формата а втория е "Script" на този език. Ако юзера иска да ползва езика по подразбиране на Windows за "Script" изпраща 0, аз за име на шрифт някой който му харесва :) Ако пък друг юзер иска български език, изпраща например "Arial" и "Script" 204 (Cyrillic) (Естествено това е възможно ако е добавено "Multilanguage support" и другите ала-бала на Windows за кирилизацията). Ако иска може да ползва шрифт който съдържа буквите от неговия език, ако Windows не разполага с такъв (съмнявам се че няма всички абуки които се ползват по света но както и да е:)
2. Имам една публична процедура с име Sub_LoadCaptions. На нея и се предава параметър кой език се ползва в момента и за коя форма става въпрос. Тя зарежда съответните надписи от файла (ИНИ файл например) с този език които се отнасят за формата и ги слага на контролите (по един ред код за всеки контрол).

И се прави следното:
Като се зареди някоя форма се извиква Sub_SetFont със съответните параметри (параметрите може и да са глобални променливи). След това се извиква Sub_LoadCaptions за да зареди надписите за тази форма от съответния език (файл).

По този начин не само че могат да се поддържат повече от един език за програмата, но и варианти на един и същ език. И при положение че надписите по програмата са в текстови файлове, юзера може да си ги променя както сметне за добре.

Идеята на процедурата Sub_SetFont е, че с нея могат да се сменят шрифтовете по програмата (това значи и използвания език) докато тя работи.

Отговор
в отговор на Щиpлиц #12

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лиц на

Отговор
в отговор на Гeoprи #13

Re: Промяна на шрифта на контролите на Форма

Братя незнам за вас ама аз писах едно програмче дето имаше меню на три езика: български, мъкедонски и швабски!!!
Възползвах се от Unicode и си го наплесках в едно ресурсно файлче и немах никакви грижи.
Държа да отбележа че не съм си превеждал аз менютата на различните от БГ езици!!!

Наведи главата защото прелитам ниско с асконата !!!
Отговор
в отговор на Ascona83 #14

Re: Промяна на шрифта на контролите на Форма

То с ресурсен файл става лесно. Но ми се случва това:

Направил съм ресурсен файл с Български и Английски менюта. Вина ми е сетнат на Bulgarian заради кирилицата (не ползвам ФлексТъп). Но аз пък искам програмата да ми е с менюта на английски. Хммм, а как да я убедя да не си превключва сама на българските?

----------------------------------
помислих, хареса ми, помислих пак...
Отговор
в отговор на Щиpлиц #15

Re: Промяна на шрифта на контролите на Форма

Хммм, ами аз пък се чудех как да я убедя да си прочете настройките от регионалниа лист и намерих некъв начин, ама аз доколкото си спомням при инсталациата питах на какъв език да е, и дори инсталациата си минаваше в избрания език, ще си потърся проекта и ще ти кажа как съм го направил

Наведи главата защото прелитам ниско с асконата !!!
Отговор
в отговор на Ascona83 #16

Re: Промяна на шрифта на контролите на Форма

По-добре е настройките на надписите (езиците) да е във файл, който е достъпен за клиента (най-добре текстов файл). Така той ще може да си променя надписите както му харесва - а когато езиците са в ресурсен файл, за всеки нов език (или всяка промяна в който и да е надпис) ще трябва да правиш друго EXE :)

Отговор
в отговор на Гeoprи #17

Re: Промяна на шрифта на контролите на Форма

Здрасти,
Мен ме нямаше определено време и гледам нещо много спокойствие е настанало в тоя клуб, затова да ти наруша спокойствието като ти задам един въпрос и после да изчезвам, че няма време.
Въпросчето ще бъде елементарно и относно кода. Както се сещаш не съм го тествал тоя код, но като погледнах тази втората част нещо не ме кефи. Може и да бъркам, де. Та когато флага ти за сетване на всички форми е True би трябвало да се сетне шрифта на всички контроли във всички форми. Добре. Въпросът е:
Ако в един проект имаш и Юзерконтроли.
И тези Юзерконтроли имат много контроли в себе си и след това тези Юзерконтроли ги наредиш по формите, тази функция с boolSetToAllForms = True ще смени ли шрифта на контролите, които се намират в Юзерконтролите, които пък от своя страна се намират по формите?

И спокойно. Само питам, нали?

Бии, за да те уважават!
Отговор
в отговор на пpoГЪPMИcт #18

Re: Промяна на шрифта на контролите на Форма

Няма да ги сетне много ясно :)
UserControl-a ако не ти предоставя методи с които да имаш достъп до контролите вътре в него как ще ги "достигнеш" без да ползваш например API функция за енумериране на child прозорците ? :) Това е все едно да извикаш Private Function/Sub/Property на някой UserControl/Class/ActiveX :)

Само за да разбереш какво имам впредвид - Стартирай ВБ с нов ЕХЕ проект. Добави един UserControl а в него сложи един CommandButton. Сложи този UserControl на формата и се опитай да напишеш UserControl1.Command1.Caption="Blah" :) Няма да стане... :)
Спокоен съм :)

Отговор
в отговор на Гeoprи #19

Re: Промяна на шрифта на контролите на Форма

Значи излиза, че тази функция няма да ми свърши никаква работа ако реша да си правя приложенията "интернационални", защото имам много UserControl-и в проектите?

И кво да правя ся?

Да махна UserControl-ите и да наредя всички контроли по няколко пъти по формите. Неееееее. Много работа.

Да. Сетих се. Сетих се.
Ще накарам потребителите да научат български, защото интерфейса ми е само на български. Най-бързо, най-лесно и най-удобно за мене,
ами за тях..........Ще бъдат очаровани,.............вероятно

Бии, за да те уважават!
Отговор
в отговор на пpoГЪPMИcт #20

Re: Промяна на шрифта на контролите на Форма

Не ве :)
Просто направи метод на твоите UserControl - и чрез който да може да се сменя шрифта на контролите вътре в него. Направи нещо като .ChangeAllFonts(objFont as StdFont) и вътре си напиши:

Set Command1.font=objFont
Set Command2.font=objFont
...
...
и т.н. изреди си всички контроли вътре в UserControl-a

И вече твоите UserControls ще предоставят метод чрез който да се сменя шрифта на контролите вътре в тях.

:))

Усещам някаква подигравка в думите които си написал :)

Обаче ти като не си предоставил интерфейс чрез който да се сменят контролите вътре в твоя UserControl никой не ти е виновен че шрифта им не може да се смени с един ред код - най-малкото пък можеш да се сърдиш на моя код за смяна на шрифта - при мен си работи идеално (и аз имам UserControl-и със други контроли в тях но съм си решил проблема - написал съм .SetAllFonts вътре в UserControl-a - вземи и ти да си напишеш).

Отговор