Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
ChaynikSoft Гость
|
Добавлено: Пт Май 24 2002 11:28 Заголовок сообщения: Разъясните пожалуйста как ............... (С++builder) |
|
|
Здравствуйте господа программисты! Прошу помощи в разъяснении следующего вопроса: У меня есть некая процедура, которая смотрит Edit1, где указан путь к файлу, процедура берет его и работает с файлом. После работы заканчивается. Мне нужно чтоб эта процедура обработало, таким образом, несколько файлов (4 шт.). Я поместил в форму 4 компонента (Edit1-Edit4) в которых определил пути к файлам. Как мне написать код? Ведь, если я буду писать один код, но с разными путями четыре раза, это не правильно и сильно много кода. Как делают в таких случаях? Используют переменные? |
|
Вернуться к началу |
|
|
Adil Гость
|
Добавлено: Пт Май 24 2002 12:00 Заголовок сообщения: Re: Разъясните пожалуйста как ............... (С++builder) |
|
|
Да, используют переменные и функции. Нечто, вроде: //----------------------------- void __fastcall Form1::BtnFileJobClick(TSender*) { ' FuncFileJob(Edit1->Text); ' FuncFileJob(Edit2->Text); ' FuncFileJob(Edit3->Text); ' FuncFileJob(Edit4->Text); } //----------------------------- void __fastcall Form1::FuncFileJob(AnsiString & FileName) { ' if(FileExists(FileName)) ' { ' //нечто делаем ' } ' else ' ShowMessage(AnsiString("Error file name: ")+FileName); } Удачи. |
|
Вернуться к началу |
|
|
ChaynikSoft Гость
|
Добавлено: Сб Май 25 2002 09:33 Заголовок сообщения: Re: Разъясните пожалуйста как ............... (С++builder) |
|
|
Да, это понятно, а как после обработки первого файла подставить второй. использовать переход по меткам? Я чего то недопонимаю. |
|
Вернуться к началу |
|
|
Adil Гость
|
Добавлено: Сб Май 25 2002 11:47 Заголовок сообщения: Re: Разъясните пожалуйста как ............... (С++builder) |
|
|
>Да, это понятно, а как после обработки >первого файла подставить второй. >использовать переход по меткам?
>Я чего то недопонимаю Так, это уже я чего-то недопонимаю. Ты имеешь в виду это место: { ' //нечто делам } (?)
Если ты хочешь по-разному обрабатывать разные файлы, то и код обработки у тебя будет разный, ех., разные функции: //----------------------------- void __fastcall Form1::BtnFileJobClick(TSender*) { ' FuncFileJob01(Edit1->Text); ' FuncFileJob02(Edit2->Text); ' FuncFileJob02(Edit3->Text); ' FuncFileJob04(Edit4->Text); } //----------------------------- void __fastcall Form1::FuncFileJob01(AnsiString & FileName){...} //----------------------------- void __fastcall Form1::FuncFileJob02(AnsiString & FileName){...} //----------------------------- void __fastcall Form1::FuncFileJob02(AnsiString & FileName){...} //----------------------------- void __fastcall Form1::FuncFileJob03(AnsiString & FileName){...} //-----------------------------
Или ты что-то другое имешь ввиду? Удачи. |
|
Вернуться к началу |
|
|
ChaynikSoft Гость
|
Добавлено: Сб Май 25 2002 12:48 Заголовок сообщения: Re: Разъясните пожалуйста как ............... (С++builder) |
|
|
Скажем я пишу так: void __fastcall Form1::BtnFileJobClick(TSender*) если (галочка1->отмечена) { выполняю для одного файла. ........ процедура ........ ..........Edit1->Text; ......... } далее проверяю если (галочка2->отмечена) { .... процедура .... процедура одинакова для ......... Edit2->Text; } далее проверяю если (галочка3->отмечена) { .... процедура .... процедура одинакова для ......... Edit3->Text; }
Так вот процедуру переписывать каждый раз, или можно как то подставить только значения. Если подставлять, то как сказать, что нужно теперь процедуру начать сначала но с другой переменной. Или просто написать несколько раз одно и тоже но с разными названиями файлов. И по клику будет выполняться все последовательно. И не обращать внимание на то что много текста (кода) одинакового. |
|
Вернуться к началу |
|
|
Adil Гость
|
Добавлено: Сб Май 25 2002 19:10 Заголовок сообщения: Re: Разъясните ... |
|
|
Тогда так: //----------------------------- void __fastcall Form1::BtnFileJobClick(TSender*) { ' if(галочка1->отмечена) ' { ' FuncFileJob(Edit1->Text); ' } ' if (галочка2->отмечена) ' { .... процедура .... ' FuncFileJob(Edit2->Text); ' } ' if (галочка3->отмечена) ' { .... процедура .... ' FuncFileJob(Edit3->Text); ' } ' if (галочка4->отмечена) ' { .... процедура .... ' FuncFileJob(Edit4->Text); ' } }
//----------------------------- void __fastcall Form1::FuncFileJob(AnsiString & FileName) { ' if(FileExists(FileName)) ' { ' //нечто делаем ' } ' else ' ShowMessage(AnsiString("Error file name: ")+FileName); }
Удачи. |
|
Вернуться к началу |
|
|
ChaynikSoft Гость
|
Добавлено: Сб Май 25 2002 20:22 Заголовок сообщения: Re: Правильно ли понял? |
|
|
устанавливаю переменные AnsiString a1=Edit1->Text,a2=Edit2->Text,a3=Edit3->Text;
>>//на клике кнопки >>void __fastcall Form1::BtnFileJobClick(TSender*) Тут просто просто проверяем отмеченные птички и при каждом true передаем переменную в процедуру >>void __fastcall Form1::FuncFileJob(AnsiString & FileName)
Написать блок, так как Вы написали >>//----------------------------- >>void __fastcall Form1::FuncFileJob(AnsiString & FileName) >>{ >>' if(FileExists(FileName)) >>' { >>' //нечто делаем >>' } >>' else >>' ShowMessage(AnsiString("Error file name: ")+FileName); >>}
Вопросы: После отрабтки процедуры как она вернеться опять проверять птички. Честно, говоря ничего не понял! |
|
Вернуться к началу |
|
|
Adil Гость
|
Добавлено: Вс Май 26 2002 11:30 Заголовок сообщения: Re: Правильно ли понял? |
|
|
Боюсь, Вам все-таки придется прочесть хоть какую-нибудь книжку по программированию.
Что касается вызова функции. В любом процессоре есть специальная ячейка памяти (т.н. IP регистр), в которой храниться место в памяти компьютера (т.н. адрес), где описана следубщая команда процессору(т.е. которая будет выполнятьcя после завершения текущей команды). Поменять насильно значение в этом регистре нельзя. Обычно значение в нем изменяется очень грубо говоря на "1", т.е. команды выполняются последовательно одна за другой. Но есть команды, например, "GO TO ххх" или вызов функции, которые изменяют значение в этом регистре по-другому. Команда "GO TO ххх" просто заносит в этот регистр место (адрес) той команды, которая лежит по метке "ххх". При вызове же функции делается то же самое, но при этом запоминается место (адрес) той команды, которая выполнялась, если бы вызова не было (т.е. откуда произошел вызов). После того, как функция завершит свою работу без ошибок, этот адрес кладется обратно в IP, и таким образом процессор возвращается обратно.
Давай...те для наглядности считать, что адрес команды - это номер строки в Вашем коде. Это конечно, не так, но очень похоже по смыслу. Пусть где-то в коде в строке № 1001 Вы вызываете некую ф-цию:
1000: a="aaa"; 1001: FileJob1(...); 1002: b="bbb";
а сама функция FileJob1 лежит где-то на 2000 строке:
2000: FileJob(...) 2001: { 2002: //... 2003: }
Пусть в данный момент Вы находитесь на строке 1000 (значение IP == 1001) Поцессор выполняет присваивание a="aaa" и выполняет вызов функции: "прыгает" на строку 2000 - имя функции говорит, куда ему прыгать) и при этом запоминает, куда он должен вернуться (на строку после вызова - 1002: b="bbb"). После того, как процессор "пробежиться" по строкам 2001, 2002 и 2003, он достанет из памяти номер строки, куда он должен вернуться (1002) и прыгнет на эту строку. Если бы на 1002 строке находился бы вызов другой функции, ех. 1002: FileJob2(...); то процессор вернулся бы на эту строку, запомнил бы адрес следующей строки (1003) и прыгнул бы на строку, где находиться сама FileJob2(...) { } и т.д. Вот так, очень примитивно и грубо работает вызов функции - в двух словах при вызове функции процессор выполняет ее и возвращается обратно в место вызова. Попробуйте пробежаться отладчиком по Вашему коду - Вы это наглядно увидите.
А книжку прочитать обязательно надо!
Удачи. |
|
Вернуться к началу |
|
|
ChaynikSoft Гость
|
Добавлено: Вс Май 26 2002 18:34 Заголовок сообщения: Re: Правильно ли понял? |
|
|
Огромное спасибо за помощь, и терпение. Я читал книжку "С++Builder 5.0. Архангельского", но думаю что нужно другую. Так как в ней описывался язык и работа с программой С++В. Какую посоветуете попонятней. Спасибо за помощь. |
|
Вернуться к началу |
|
|
Adil Гость
|
Добавлено: Пн Май 27 2002 12:35 Заголовок сообщения: Re: Правильно ли понял? |
|
|
Да книжек много всяких - да же и не знаю какую рекомендовать. Для начала поищите для начинающих и такую, где описывается просто С и просто под ДОС, и где примеров побольше. Посидите за компом с этими примерами, попытайтесь их модифицировать - по-тихонечку разберетесь.
Удачи. |
|
Вернуться к началу |
|
|
ChaynikSoft Гость
|
Добавлено: Пн Май 27 2002 13:55 Заголовок сообщения: Ответ на: "Re: Правильно ли понял?- Adil- 27-05-2002 13:35" СПАСИБО! |
|
|
Огромное спасибо. |
|
Вернуться к началу |
|
|
|