Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с проверкой.  (Прочитано 19315 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
TGrey[WoLf]
Постоялец

ua
Offline Offline
Пол: Мужской

« : 17-05-2007 01:45 » 

Добрый день. Хм вроде вчера создал эту тему а сегодня уже ее нету Здесь была моя ладья...
Ну да ладно напишу еще раз.
Делаю прогу которая должна переписывать файл. но также должна создавать сабменюшки. Создавать должна сама тоесть брать все инфу с файла. но до этого дело не доходит. Все время происходит глюк с проверкой. Сначала она работала только по именам кнопок но все таки сделал что проверяет по кепшионам.
Ну так вот. Программа дложна запрещать создание 2 кнопок с одинаковыми кепшинами. Тоесть при создании новой кнопки идет проверка по существующим кнопка а точнее их кепшионам. И если такое имя существует то выдать сообщение об ошибке.
Ну в общем делаю все вроде правильо с точки зрения моей логики но всеже все время мешает 1 недороботка которая берется непойму откуда.
в общем вот проверка:
Код:
void __fastcall TForm2::Button1Click(TObject *Sender)
{
int h,a;
a=0;
for (h=0; h<=Form1->pm->Items->Items[1]->Count - 1; h++)
if (nameedit->Text == Form1->pm->Items->Items[1]->Items[h]->Caption || nameedit->Text == "&" + Form1->pm->Items->Items[1]->Items[h]->Caption )
a=1;
else
a=0;
if (a==1)
{
MessageDlg("извините, но сервер с таким именем существует",mtWarning, TMsgDlgButtons() << mbOK, 0);
nameedit->Text="";
loginedit->Text="";
portedit->Text="";
Form2->Close();
}
else
{
TMenuItem *NewItem = new TMenuItem(Form1->pm);
NewItem->Caption = Form2->nameedit->Text;
Form1->pm->Items->Items[1]->Add(NewItem);

int i,j;
String s,s2;
FILE *fp;
fp = fopen("MainMenu.mm","w");
for ( i=0; i<=Form1->pm->Items->Count - 1;i++)
{
s=Form1->pm->Items->Items[i]->Caption;
fprintf(fp,"%d    %s\n", i,s);
}
fclose(fp);
FILE *fp2;
fp2=fopen("SubMenu.sub","w");
for (j=0; j<=Form1->pm->Items->Items[1]->Count - 1; j++)
{
s2=Form1->pm->Items->Items[1]->Items[j]->Caption;
fprintf(fp2,"%d    %s\n", j,s2);
}
fclose(fp2);
nameedit->Text="";
loginedit->Text="";
portedit->Text="";
a=0;
Form2->Close();
}
}
тоесть сначало проверяет все кнопки и если есть такое имя то делает а=1 а потом идет проверка на а.
но вот для само проверки решил сделать кнопку которая записывает в файл № и кепшион кнопок сабменю и тут ты выяснилось:
Делаю первую кнопку UО в файл записывается
0     UO
Вот тут уже при след. создании кнопки должна идти проверка. И если я сново напиши UO то должно появится сообщение. НО когда я пишу еще раз UO и смотрю на кнопку то вижу что созданы две полность одинаковые кнопки НО проверив файл там нечто другое
0  &UO
1  UO
откуда берется этот символ??
Если еще раз написать UO тогда ввообще получается
0  &UO
1  U&O
2  UO
И вот только после этого если я начну создавать кнопку с именем &UO или U&O я получаю сообщение что кнопка существует. А при создании просто UO создаются все новые кнопки.

Не моглибы подсказать в чем загвоздка и что я неверно делаю?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 17-05-2007 05:00 » 

ААААААААААААА Улыбаюсь
Жесткач код Улыбаюсь
помню сам подобное, когда-то творил на билдере

Код:
for (h=0; h<=Form1->pm->Items->Items[1]->Count - 1; h++)
    if (nameedit->Text == Form1->pm->Items->Items[1]->Items[h]->Caption || nameedit->Text == "&" + Form1->pm->Items->Items[1]->Items[h]->Caption )
a=1;
else
a=0;
if (a==1)
{
циклы можно перерывать по break
внутри if цикла можно сразу выполнять
MessageDlg("извините, но сервер с таким именем существует",mtWarning, TMsgDlgButtons() << mbOK, 0);
nameedit->Text="";
loginedit->Text="";
portedit->Text="";
Form2->Close();
return; // <<---- это важно
и работать с файлом, непонятно зачем сначала проставлять флажок а потом сразу же проверять
еще такой момент если у тебя 2 кнопки UO1 и UO2 ты пытаешь проверить есть ли кнопка UO1 то у тебя флажек сбросится, как раз потому что ты не прервал цикл как-только выставился флаг
решения 2
1. for (h=0; h<Form1->pm->Items->Items[1]->Count && !a; h++)
2. делать a=true; break;

Еще
Попробуй следующем образом
разбей свою функцию на несколько
одна проверяет, одна пишет одна еше что-то пишет.
и отформатируй код, а то ведь сам запутаешься.

Давай весь код.

кстати значек & может быть просто частью подписи к кнопке. возможно перед сравнением имеет смысл удалить все символы & из названия и перед запись делать тоже самое?
Записан

Странно всё это....
TGrey[WoLf]
Постоялец

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 18-05-2007 01:14 » 

Я знаю что их можно прерывать только непойму зачем?
Незнаю в общем вот исходник. Если знаешь как помоч то подскажи то эта проверка меня убивает... А мне еще предстоит задавать вопросы по созданию сабиеню из файла если у меня не получится Скромно так...
и я непонял что ты имешь ввиду за флаг? То я делал для себя. Можно сказать у меня есть эта програмулина та что я делал до этого но она меняет только 2 сервера и я решил ее модифицировать для множества. Вот от туда и остался флаг поскоьку оно не проверяло на наличие одинаковых имен. Если есть вариант получше то предлагай буду благодарен.
Код я пишу для себя и в нем не путаюсь. Кстати с Борландом знаком только поверхостно. Если не сложно подскажи как в нем описывать функции. Я так понимаю где-то внизу всего кода? И описываются ли они так же как и в С или есть борландовские примочки?
в общем вот скачай глянь.
http://rapidshare.com/files/31914605/update.rar.html
Только сильных наворотов не делай а то я непойму потом ничего)
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 18-05-2007 05:15 » new

вот попробуй, билдера нет доступа с работы к rapidshare нет. поправил кое, что. тип MainMenuItemsType сам подмени на правильный.
Код:
void __fastcall TForm2::Button1Click(TObject *Sender)
{
MainMenuItemsType *mainItems = Form1->pm->Items;
for (int h=0; h< mainItems->Items[1]->Count; ++h)
if (nameedit->Text == mainItems->Items[1]->Items[h]->Caption || nameedit->Text == "&" + mainItems->Items[1]->Items[h]->Caption )
{
MessageDlg("извините, но сервер с таким именем существует",mtWarning, TMsgDlgButtons() << mbOK, 0);
nameedit->Text="";
loginedit->Text="";
portedit->Text="";
Form2->Close();
return;
}

TMenuItem *NewItem = new TMenuItem(Form1->pm);
NewItem->Caption = Form2->nameedit->Text;
mainItems->Items[1]->Add(NewItem);

FILE *fp;
fp = fopen("MainMenu.mm","w");
for (int i=0; i<mainItems->Count; ++i)
fprintf(fp,"%d    %s\n", i, mainItems->Items[i]->Caption);
fclose(fp);

fp=fopen("SubMenu.sub","w");
for (j=0; j<mainItems->Items[1]->Count; j++)
fprintf(fp2,"%d    %s\n", j, mainItems->Items[1]->Items[j]->Caption);
fclose(fp2);


nameedit->Text="";
loginedit->Text="";
portedit->Text="";
Form2->Close();
}

флаг это твоя переменная "a"
возможно имеет смысл тебе переделать алгоритм на рекурсивный что-бы проходить по всем веткам главного меню, а не только по первой.
Записан

Странно всё это....
TGrey[WoLf]
Постоялец

ua
Offline Offline
Пол: Мужской

« Ответ #4 : 19-05-2007 00:48 » 

В том то и дело что только по 1 ветке. Зачем проверять все если эти кнопку добавляются в Сабменю к меню с интексом 1. Тоесть Сервера->
остальные и смысла проверять нету.
Извени но я невижу разницы в проверке?! Как я понял ты только сократил текст обозначив все то через 1 переменную mainitems.
Разве что если я правильно понимаю ты расчитываешь на return но тогда уже можно и делать как ты говорил выбивать из цыкла break.
Но всеравно раз проверка осталась преждней она так и будет неправильно считать.
Как так можно вообще считать?
Идет ведь проверка с 0 элемента....
Если стоит
0 UO
Какого бреда оно при следующем создании кнопки с таким же именем не выдает сообщение а делает
0 &UO
1 UO
Вот блин лажа.
Записан
TGrey[WoLf]
Постоялец

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 19-05-2007 01:20 » 

Не поверишь... Посидем по раскинув мозгами верный вариант оказался такой:
Код:
if ("&"+nameedit->Text == Form1->pm->Items->Items[1]->Items[h]->Caption || nameedit->Text == "&" + Form1->pm->Items->Items[1]->Items[h]->Caption )
Вот как раз то... "&" + nameedit->text.
Но всетки я так и непонял почему оно его вообще приписывает...(
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 19-05-2007 04:57 » 

может там свойство какое нибудь есть для автовыбора символа горячей клавиши ? И его нуна отклю...
Записан

TGrey[WoLf]
Постоялец

ua
Offline Offline
Пол: Мужской

« Ответ #7 : 20-05-2007 01:22 » 

Та сам об этом уже думал так и ненашел что можно отключить...
Но вот потом начал тестить вроде как бы все работало... Но тут сново БАГ.
оно не проверяло по регистру букв поэтому я при проверке все возвожу в верхний регистр т оно проверяет в нем.
Но тут сново прикол...
Если вводить похожие фразык примеру Forum  Forumm Forummm то оно их записывает как
0 Forum
Потом
0 Forum
1 &Forumm
Потом
0 Forum
1 &Forumm
2 F&orummm
Вот блин обидно то как...
Я незнаком с работой со строками но может как нибуть сделать проверку на нахождение этого символа и удаление его... но это так только ИМХО на практике может получится иначе либо вообще его не будет определять.
в общем если не сложно подкиньте команды для поиска символа и удаление его.
Я пробовал с одной StrScan(String *s, char *c)
но не помогает... А если и так то все равно незнаю позицию с которой удалять.
Записан
TGrey[WoLf]
Постоялец

ua
Offline Offline
Пол: Мужской

« Ответ #8 : 30-05-2007 01:15 » 

Тю это  что настолько ужастная загадка и никто из продвинутых програмистов незнает ПОЧЕМУ?
Ну подскажите хоть варианты какие-то. Если надо могу выложить проэкт чтобы у вас была возможность посмотреть непосредственно у себя на компе...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 30-05-2007 03:10 » 

TGrey[WoLf], выложи, если небольшой.
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 30-05-2007 04:07 » 

TGrey[WoLf], & говорит какой символ поле этого значка будет горячей клавишей для этого пукта меню. Видимо он проставляется при создании пункта, если пукты меню начинаются одинаково. Хотя это конечно ИМХО.

Поудаляй их нафик или разберись откуда берутся.
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 30-05-2007 04:43 » 

да по любому какой то флажок... Читай мануал внимательнее
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #12 : 30-05-2007 09:57 » 

это точно признак того, что можно вызвать пункт меню например по Alt-F, если название меню &Form
буква F при этом будет подчеркнута в меню
может у пенкта меню, есть метод для получения названия без подчёркивания.
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 30-05-2007 10:02 » 

LogRus, не, я имею в виду флаги при создании меню какие то надо сбросить
Записан

TGrey[WoLf]
Постоялец

ua
Offline Offline
Пол: Мужской

« Ответ #14 : 31-05-2007 01:20 » 

О вроде нашел... В PopMenu поставить AutoHotKeys c maAutomatical Ha maManual.
Сейчас протестил вроде не добавляет...  Улыбаюсь)
« Последнее редактирование: 31-05-2007 01:27 от TGrey[WoLf] » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #15 : 31-05-2007 05:03 » 

Алексей1153++, да чегото я не понял. Улыбаюсь
TGrey[WoLf], молодчина Улыбаюсь
Записан

Странно всё это....
TGrey[WoLf]
Постоялец

ua
Offline Offline
Пол: Мужской

« Ответ #16 : 01-06-2007 00:23 » 

Вот блин такая мелоч а может запороть весь проэкт... Я непредставляю чтобы делал если бы у меня было раз в 10 кода больше чем сейчас))
Теперь можно делать дальше.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #17 : 01-06-2007 04:52 » 

TGrey[WoLf], пиши автотесты Улыбаюсь
Записан

Странно всё это....
TGrey[WoLf]
Постоялец

ua
Offline Offline
Пол: Мужской

« Ответ #18 : 08-06-2007 00:50 » 

Что за автотесты?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #19 : 08-06-2007 06:41 » 

Обычные автотесты, пишеш автотест на все свои функции или много мелких тестов
обычно выгдит примерно как вызов с различнми параметрами функций с последующей проверкой результатов
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines