Вы можете использовать локальную переменную Static
, чтобы «запомнить», был ли обработчик хотя бы один раз или нет:
Private Sub SWName_Field_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Static executed As Boolean
If Not executed Then
SWName_Field.Text = ""
executed = True
End If
End Sub
Состояние локальной Static
привязано к вашему UserForm
] instance - значение будет «запомнено» до тех пор, пока экземпляр формы жив.
Это означает, что если вы показываете экземпляр формы по умолчанию , состояние не обязательно будет сброшено. Вы захотите убедиться, что вы получаете новое состояние формы по умолчанию каждый раз, когда форма показывается, а не только в первый раз - для этого вы New
заполняете форму:
With New UserForm1
.Show
End With
Если вы просто делаете [ 117], то вы не контролируете, когда создается экземпляр формы, как это делает VBA.
Вы также захотите контролировать, когда экземпляр формы будет уничтожен - вы можете сделать это, обработав событие формы QueryClose
:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = VbQueryClose.vbFormControlMenu Then
Cancel = True ' cancel the destruction of the object
Me.Hide ' hide the instance instead
End If
End Sub
При этом объект будет уничтожен, когда выполнение достигнет End With
. Без него объект будет уничтожен, если пользователь нажмет кнопку «X», и вы, вероятно, не захотите, чтобы это произошло (особенно если вам нужно получить доступ к состоянию формы после ее закрытия).
Вот то, как алгоритм работает:
initialize hash to 0
for each byte
shift hash 4 bits to left (with rotate)
hash = hash XOR character
визуально (16-разрядная версия):
00110000 = '0'
00110001 = '1'
00110010 = '2'
00110011 = '3'
0100 0011 = '4'
00110101 = '5'
====================
01000110001000010000 (and then this will be 'rotated'
so that it lines up with the end)
giving:
00100001000001000110
То, что это означает, - то, что, если Вы имеете строки той же длины и являетесь главным образом тем же, затем по крайней мере в одном случае, более низкие 4 бита символьных и верхних 4 битов следующего символа xor друг друга должны быть уникальными. Однако метод засовывания числа на 32 бита в таблицу мог бы быть еще более слабым, означая, что это требует, чтобы lower4 xor upper4 конкретного местоположения в строке (модификация 8 символов) был уникален.
Из того, что я понимаю просто чтения записи Bugzilla, декларации ошибки, когда две отличных проблемы происходят:
Так в основном, если у Вас есть страница с двумя очень похожими URL, это могло бы произойти на некоторых версиях Firefox. Этого обычно не будет происходить на различных страницах, я ожидал бы, с тех пор FF будет иметь время для сбрасывания записей в диск, избегающий проблемы синхронизации.
Таким образом, если у Вас есть несколько ресурсов (сценарии, изображения, и т.д.), которые все загружаются из той же страницы, удостоверьтесь, что у них есть выполнение 9 символов, которые полностью отличаются. Одним путем Вы могли бы удостовериться, что это путем добавления querystring (что Вы игнорируете) со случайным битом данных, чего-то как:
This bug was a major issue for my site: http://worldofsolitaire.com
I worked around it a long time ago by using a conditional rule in an .htaccess file that would disable ALL caching of images on the site for Firefox users. This was a horrible thing to need to do, but at the time I couldn't track down the bug within Firefox and having the site be slightly slower is better than showing duplicate/corrupted images.
When I read in the linked bug that it was fixed in the latest Firefox releases, I changed the conditional on April 19th 2009 (yesterday) to only disable caching for Firefox 2 users.
A few hours later I've received over 10 e-mails from Firefox 3 users (confirmed) that they were seeing duplicate images. So this issue is STILL a problem in Firefox 3.
I decided to create a simple Linux test program that would allow me to check URL's to see if they are generating the same cache hash keys.
To compile in any Linux system: g++ -o ffgenhash ffgenhash.cpp
Here is the code (save to file ffgenhash.cpp)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ULONG_MAX 0xFFFFFFFF
#define PR_ROTATE_LEFT32(a, bits) (((a) << (bits)) | ((a) >> (32 - (bits))))
unsigned long ffgenhash(const char * key)
{
unsigned long h=0;
for(const unsigned char * s = (unsigned char *) key; *s != '\0'; ++s)
{
h = PR_ROTATE_LEFT32(h, 4) ^ *s;
}
return (h==0 ? ULONG_MAX : h);
}
int main(int argc, char ** argv)
{
printf("%d\n", ffgenhash(argv[1]));
return 0;
}
As you can see, here are two real life URL's that generate the same cache hash key:
./ffgenhash "http://worldofsolitaire.com/decks/paris/5/12c.png"
1087949033
./ffgenhash "http://worldofsolitaire.com/decks/paris/5/13s.png"
1087949033
Since I pre-load these images in a Javascript loop, trying to use some sort of empty