'Inside the Enter event
TextBox1.SelectAll();
хорошо, после попытки это вот - то, что Вы хотите:
Это выбрало весь текст на записи, но позволило мне выделять часть текста впоследствии или позволять Вам выделяться при первом щелчке.
запросом:
bool entered = false;
private void textBox1_Enter(object sender, EventArgs e)
{
entered = true;
textBox1.SelectAll(); //From Jakub's answer.
}
private void textBox1_Click(object sender, EventArgs e)
{
if (entered) textBox1.SelectAll();
entered = false;
}
private void textBox1_MouseMove(object sender, MouseEventArgs e)
{
if (entered) entered = false;
}
Для меня, переключение вкладок в управление выбирает весь текст.
Вы можете объявить их в заголовке с протоколом (но за пределами самого интерфейса протокола), а затем определить их в файле реализации для протокола (очевидно, у него не было бы раздел @implementation
- только ваши определения NSString
).
Или используйте отдельную пару .h / .m, предназначенную только для строковых констант (заголовок протокола может импортировать заголовок строковых констант) .
Вы сохраняете определение .h:
extern NSString * const MyPluginErrorDomain;
, но помещаете эту часть в отдельный файл .m, который включается в ваш фреймворк:
NSString * const MyPluginErrorDomain = @"MyPluginErrorDomain";
Таким образом, подключаемые модули все еще могут реализовывать интерфейс, но при компиляции они связываются или компилируются в другом вашем файле .m, поэтому они увидят значение MyPluginErrorDomain
.
В C ++ я бы объявил их в заголовке следующим образом:
const char * const MYPLUGIN_ERROR_DOMAIN = "MyPluginErrorDomain";
const char * const MYPLUGIN_FOO_DOMAIN = "MyPluginFooDomain";
Обратите внимание, что поскольку указатели const
, они будут локальными по отношению к единицам перевода заголовок #included, поэтому нет необходимости использовать extern
для предотвращения множественных ошибок определения.
Вы должны реализовать это как внешние строки, как в вашем примере:
extern NSString * const MyPluginErrorDomain;
или предоставить внешние функции, которые возвращают статические данные хранения. Например:
/* h */
extern NSString * MyPluginErrorDomain();
/* m */
NSString * MyPluginErrorDomain() {
static NSString * const s = @"MyPluginErrorDomain";
return s;
}
Причина в том, что строки и ключи часто используются и сравниваются по значению указателя или хеш-значению, а не по истинному сравнению строк (isEqualToString:).
На уровне реализации существует большая разница между:
В коде это означает, что когда сравниваемые строки определены в нескольких двоичных файлах:
Скажем, «MyPluginErrorDomain» и «key» имеют одинаковые строковые значения, но определены в разных двоичных файлах (т.е. на хосте плагина один в плагине).
/////// Pointer comparison (NSString)
BOOL a = [MyPluginErrorDomain isEqualToString:key];
BOOL b = MyPluginErrorDomain == key;
// c may be false because a may be true, in that they represent the same character sequence, but do not point to the same object
BOOL c = a == b;
/////// Hash use (NSString)
// This is true
BOOL d = [MyPluginErrorDomain hash] == [key hash];
// This is indicative if true
BOOL e = [MyPluginErrorDomain hash] == [someOtherStringKey hash];
// because
BOOL f = [MyPluginErrorDomain isEqualToString:someOtherStringKey];
// g may be false (though the hash code is 'generally' correct)
BOOL g = e == f;
Поэтому во многих случаях необходимо предоставить ключи. Это может показаться тривиальным моментом,