Что говорит TextBox при нехватке памяти?...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Что говорит TextBox при нехватке памяти?...

Сообщение BV » 01.06.2005 (Ср) 11:12

В 9х системах при вставке текста в TextBox (в Блокноте Windows) иногда появляется сообщение ‘Недостаточно памяти для завершения операции...’, и текст не вставляется, тоже происходит и с VB TextBox’ом, но сообщения нет. Как мне узнать о такой нехватке памяти (повторюсь: замечал только в 9х системах) и сообщать, если текст невозможно вставить из буфера обмена?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.06.2005 (Ср) 11:35

Если размер больше 32767...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 01.06.2005 (Ср) 11:38

Так и я думал, но НЕТ! Там стоит закрыть другие приложения, текст начинает вставляться!...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.06.2005 (Ср) 11:41

Неа, не начинает...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 01.06.2005 (Ср) 11:54

Начинает! Ещё как начинает, и проблемы начинаются не с 32767 символов, а где-то с 64400 и до 71000... Это проверенно!

Если у тебя есть Win98, запусти Блокнот и проверь сам. Только кол-во символов перевалит 64000... начинается. :? Закрываем другие приложения - вставляется ещё 1000 - 5000 символов.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.06.2005 (Ср) 12:06

Edit controls on Windows NT/2000/XP: For single-line edit controls, the text limit is either 0x7FFFFFFE bytes or the value of the wParam parameter, whichever is smaller. For multiline edit controls, this value is either –1 bytes or the value of the wParam parameter, whichever is smaller.

Edit controls on Windows 95/98/Me: For single-line edit controls, the text limit is either 0x7FFE bytes or the value of the wParam parameter, whichever is smaller. For multiline edit controls, this value is either 0xFFFF bytes or the value of the wParam parameter, whichever is smaller.

Rich Edit: Supported in Rich Edit 1.0 and later. Use the message EM_EXLIMITTEXT for text length values greater than 64,000. For information about the compatibility of rich edit versions with the various system versions, see About Rich Edit Controls.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 01.06.2005 (Ср) 12:09

Мало того, что на английском, так и какие-то 0xFFF... Это сколько?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 01.06.2005 (Ср) 12:15

0xFF = &HFF = 255
0xFFF = &HFFF = 4095
0x7FFE = &H7FFE = 32766 (т.е. лимит типа Integer - 16 бит)
0x7FFFFFFE = &H7FFFFFFE = 2147483646 (т.е. лимит типа Long - 32 бита)
0xFFFF = &HFFFF& = 65535 (т.е. лимит типа UINT16)
Последний раз редактировалось hCORe 01.06.2005 (Ср) 12:17, всего редактировалось 1 раз.
Моду создают модоки, а распространяют модозвоны.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 01.06.2005 (Ср) 12:17

Дело не в ограничении по символам.

Я повторюсь: при ПЕЧАТАНИИ или ВСТАВКЕ текста иногда в Win98 SE появляется сообщение о нехватке памяти, однако, при закрытиии других программ, ТЕКСТ НАЧИНАЕТ ВСТАВЛЯТЬСЯ и ПЕЧАТАТЬСЯ, до, примерно 71000 символов (по крайней мере у меня)!

Как мне узнать (и возможно ли это), что памяти TextBox'у не хватает?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 01.06.2005 (Ср) 12:23

Я взял, запустил Virtual PC с Windows 98 SE, скопировал в буфер ровно 32767 символов командой
Код: Выделить всё
Clipboard.SetText String(32767, "A")

После чего запустил на виртуальном компе "Блокнот" и с наслаждением вставил туда текст. После чего выделил 10 символов и... "Блокнот" совершенно спокойно их вставил. И еще 10. И еще... В итоге имеем 32797 символа ровно. Странно, вроде бы, "Блокнот" так работать не должен. Ведь это же чистый Edit Control :shock:

Как узнать, что памяти не хватает? По ошибке "Out Of Memory" вызываемой TextBox'ом. Он ведь все равно не даст вставить больше 32767 символов. На любой системе, причем. Можно, конечно, CreateWindow с классом EDIT и плясать оттуда, но это уж слишком...
Моду создают модоки, а распространяют модозвоны.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 01.06.2005 (Ср) 12:28

Ахтунг какой то. Текст с наслаждением вставляют...

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 01.06.2005 (Ср) 12:41

2 hCORe

Ну как же у меня вставляется более 64000 символов?!!! И никакого 'out of memory'!
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 01.06.2005 (Ср) 12:43

Я сейчас в Win98, и при запущенном Netscape 7.2 и Winamp 5.9 вставляется 50 КБ текста... далее вылетает сообщение о недостатке памяти. Вот закрою браузер, уверен, что вставится ещё несколько КБ!.....

Ну как-то же даёт TextBox знать об этом? Или это просто функция Notepad'а Windows?


Если поможет, я вставляю (без наслаждения ;)) текст у себя с SendMessage и WM_PASTE... Ошибки при нехватке памяти не возникает...

Ну неужели никто не сталкивался с подобным поведением EDIT контрола?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.06.2005 (Ср) 14:49

Ещё раз внимательно прочитай то, что я постил выше.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 01.06.2005 (Ср) 15:01

Если не трудно, переведи на русский, пожалуйста.

Я половины терминов не понимаю.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.06.2005 (Ср) 15:08

На 95/98/Me, если multiline=false, то 32767, а если true, то 65535.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.06.2005 (Ср) 15:18

Разве? Помоему при Multiline=False лимит то ли на 2048, то ли на 4096 символов.
Lasciate ogni speranza, voi ch'entrate.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 01.06.2005 (Ср) 16:10

Ну а насчёт памяти?... Как узнавать-то?

Ведь бывает, что её нехватает и при 40 КБ текста... Интересная особенность...


Но если это только функция Блокнота, то тема закрыта, всем спасибо за помощь.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 143

    TopList