Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблемы с MaskEdit 
V
    Опции темы
susanin
Дата 13.4.2007, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



имеется форма, но которой есть 2 компонента MaskEdit. необходимо, чтобы когда юзер нажимал первый раз Enter, то проверялось, есть ли в первом поле какая то надпись, и если есть, тоактивным бы становилась второй компонент, а если нету никакой записи, то выводилось бы сообщение...
я наклепал вот такой код, но что то он работает несовсеми так, как надо....
Код

void __fastcall TForm3::MaskEdit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if (Key==VK_RETURN && MaskEdit1->Text != "" ) MaskEdit2->SetFocus();
else
if (Key==VK_RETURN && MaskEdit1->Text == "" )
{
ShowMesage("Вы не ввели данные");
}
}

что у меня не так сделано?? подскажите пожалуйста!
PM MAIL   Вверх
Rodman
Дата 13.4.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Код

void __fastcall TForm3::MaskEdit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if (Key==VK_RETURN && (StrLen(MaskEdit1->Text) > 0) ) 
    MaskEdit2->SetFocus();
else
if ((Key==VK_RETURN) && (StrLen(MaskEdit1->Text) == 0) )
{
ShowMesage("Вы не ввели данные");
}
}

PM MAIL WWW Skype GTalk YIM MSN   Вверх
susanin
Дата 13.4.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



Rodman , выдал вот такие ошибки
[C++ Error] Unit3.cpp(27): E2034 Cannot convert 'AnsiString' to 'const char *'
[C++ Error] Unit3.cpp(27): E2342 Type mismatch in parameter 'Str' (wanted 'const char *', got 'AnsiString')
[C++ Error] Unit3.cpp(32): E2268 Call to undefined function 'ShowMesage'
как исправить?
PM MAIL   Вверх
Anikmar
Дата 14.4.2007, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



StrLen(MaskEdit1->Text)
Заменить на 
MaskEdit1->Text.Length()
или на 
StrLen(MaskEdit1->Text.c_str())

PM MAIL ICQ   Вверх
susanin
Дата 14.4.2007, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



Anikmar, сделал, но эффект тот же самый, что и с моим вариантом...при нажатии на Enter при пустом поле активным все равно становится второй компонент... я уж не знаю, что и делать! smile 
PM MAIL   Вверх
Anikmar
Дата 14.4.2007, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



А изначально где фокус?
Вы ставите обработчик нажатия клавиши на конкретный компонене MaskEdit. Т.е., чтобы обработчик сработал, необходим фокус именно на этом компоненте. Если обработка клавиши нужна в рамках формы, то попробуйте поставить обработчик на событие формы. Например, OnShortcut
PM MAIL ICQ   Вверх
susanin
Дата 14.4.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



Anikmar , изначально у меня на событии OnActivate у формы стоит MaskEdit1->SetFocus();
PM MAIL   Вверх
Klin
Дата 14.4.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Возможно не активен CanFocus или лучше сделать в событии OnPaint


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Klin
Дата 14.4.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



В никаких событиях прописывать ничего не надо, просто пишешь код в OnKeyDown:
Код

 if (Key == VK_RETURN)
  if (MaskEdit1->Text.Length()!=0) MaskEdit2->SetFocus();
  else ShowMessage("Данные не введены");



--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
susanin
Дата 15.4.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



Klin , все равно такая же история....давайте поподробней расскажу что у меня за история....
есть программа.... при ее открытии открываются 2 формы... активная форма, как раз та, на которой находятся компоненты MaskEdit. так вот вот...эта форма, как бы выполняет регистрацию пользователя...т.е. пользователь вволит свои данные, а потом в конце работы программы эти данные( фамилия, имя) выводятся на экран при выводе результатов... я хочу сделать, чтобы если пользователь не ввел в какое какое либо из полей данные, выводилось ссобщение о том что он не ввел данные...
вот код этой формы....
Код

#include <vcl.h>
#include <_str.h>
#pragma hdrstop

#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
        : TForm(Owner)
{
EnableMenuItem(GetSystemMenu(Handle, 0), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
Label1->Caption="Ниже введите свои данные";
Label2->Caption="Фамилия";
Label3->Caption="Имя";
BitBtn1->Enabled=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm3::MaskEdit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if (Key == VK_RETURN)
  if (MaskEdit1->Text.Length()!=0) MaskEdit2->SetFocus();
  else ShowMessage("Вы не ввели фамилию");

}
//---------------------------------------------------------------------------

void __fastcall TForm3::MaskEdit2KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if (Key==VK_RETURN || MaskEdit2->Text=="")
   {
    ShowMessage("вы не ввели имя");
   }
else
BitBtn1->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm3::MaskEdit1KeyPress(TObject *Sender, char &Key)
{
if ( WideChar(Key)>=65 && WideChar(Key)<=122 || WideChar(Key)==32) Key=NULL;        
}
//---------------------------------------------------------------------------

void __fastcall TForm3::MaskEdit2KeyPress(TObject *Sender, char &Key)
{
if ( WideChar(Key)>=65 && WideChar(Key)<=122 || WideChar(Key)==32) Key=NULL;        
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

void __fastcall TForm3::FormActivate(TObject *Sender)
{
MaskEdit1->SetFocus();        
}
//---------------------------------------------------------------------------


так вот! когда пользователь не ввел в поле "имя" свое имя, то сообщение выводится, а когда не ввел фамилию, то активным становится второй MaskEdit, хотя вместо этого должно выводится сообщение о том, что он не ввел фамилию! помогите исправить, что у меня не так!!! я уж не знаю, что делать, вроде все варианты перепробовал!
PM MAIL   Вверх
Anikmar
Дата 15.4.2007, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



По-моему неправильное условие:
Код

if (Key==VK_RETURN || MaskEdit2->Text=="")
   {
    ShowMessage("вы не ввели имя");
   }
else


Надо так:
Код

if (Key==VK_RETURN && MaskEdit2->Text=="")
   {
    ShowMessage("вы не ввели имя");
   }


или так:
Код

if (Key==VK_RETURN)
  if (MaskEdit2->Text=="") ShowMessage("вы не ввели имя");
  else Все впорядке - идем дальше

PM MAIL ICQ   Вверх
susanin
Дата 15.4.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



Цитата(Anikmar @  15.4.2007,  22:00 Найти цитируемый пост)
Надо так:

код C++ Builder
1:
2:
3:
4:

if (Key==VK_RETURN && MaskEdit2->Text=="")
   {
    ShowMessage("вы не ввели имя");
   }

пробовал и так! но как ни странно, вашим методом она работает неправильно.... при нажатии на Enter тогда прост оактивируется кнопка BitBtn!!!


Это сообщение отредактировал(а) susanin - 15.4.2007, 22:04
PM MAIL   Вверх
Anikmar
Дата 15.4.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Там точно else не пропущен? Можно еще разок взглянуть на ваш код, который неправильно работает?
PM MAIL ICQ   Вверх
Klin
Дата 15.4.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Я уже писал, как нужно составить условие! Пожалуйста, программисты, будьте внимательны в вашем коде.
Вы пишете:
Код

 if (Key==VK_RETURN || MaskEdit2->Text=="")
   {
    ShowMessage("вы не ввели имя");
   }
 else
 BitBtn1->Enabled=true;

Здесь 2 ошибки:
 1) "||"  - означает "или", а нужно использовать "и" (&&)
 2) Перевожу ваш код:
Код

 если (клавиша это Enter и MaskEdit2->Текст является пустым) вывести сообщение;
 иначе BitBtn1 - можно использовать;

Ваша ошибка в не правильном условии, надо писать так:
Код

if (Key == VK_RETURN)
  if (MaskEdit2->Text.Length()!=0) BitBtn1->Enabled=true;
  else ShowMessage("Вы не ввели имя!");


Это сообщение отредактировал(а) Klin - 15.4.2007, 23:11


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Klin
Дата 15.4.2007, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Однако, я не считаю, ваш код полным, поскольку после того как пользователь ввел данные, то кнопка становится активной. После этого юзер может спокойно удалить все данные и наслаждаться своей смекалкой. Поэтому я предлагаю поступить так:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 BitBtn1->Enabled=false;
 MaskEdit2->OnChange = MaskEdit1->OnChange;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::MaskEdit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
 if (Key == VK_RETURN)
  if (MaskEdit1->Text.Length() != 0) MaskEdit2->SetFocus();
  else ShowMessage ("Вы не ввели фамилию!");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::MaskEdit2KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
 if (Key == VK_RETURN)
  if (MaskEdit2->Text.Length() != 0) BitBtn1->Enabled=true;
  else ShowMessage ("Вы не ввели имя!");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MaskEdit1KeyPress(TObject *Sender, char &Key)
{
if ( WideChar(Key)>=65 && WideChar(Key)<=122 || WideChar(Key)==32) Key=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MaskEdit2KeyPress(TObject *Sender, char &Key)
{
if ( WideChar(Key)>=65 && WideChar(Key)<=122 || WideChar(Key)==32) Key=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MaskEdit1Change(TObject *Sender)
{
 if (MaskEdit1->Text.Length() == 0 || MaskEdit2->Text.Length() == 0) BitBtn1->Enabled = false;
 else BitBtn1->Enabled = true;
}
//---------------------------------------------------------------------------



--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0947 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.