Гость avb_constructor Опубликовано 20 января, 2007 Жалоба Поделиться Опубликовано 20 января, 2007 (изменено) У нас на работе при разработке одного изделия возникла необходимость рассчитать развертку криволинейной поверхности (а именно, длину дуги окружности). Это нужно было, чтобы разработать фотошаблон для покраски, скажем так, "гнутой" детали (нужно было определить габаритный размер фотошаблона, который и равен длине дуги). После некоторых мучений я создал на VB программку, которая сама считает длину дуги, причем рассматриваются три случая: 1. когда хорда параллельна одной из осей координат и ее концы симметричны относительно другой оси; 2. когда хорда непараллельна осям координат, но известна ее проекция на ось X; 3. когда известна ее проекция на ось Y. И во всех трех случаях известен радиус дуги (это, в общем-то, обязательный параметр при конструировании изделий). Народ, прошу, зацените мое творчество. А еще есть просьба подсказать: 1. как создается обработчик ошибок компиляции; 2. как в Visual Basic'e можно было бы задать запись в текстовый файл. Я пробовал, у меня не получилось ни то, ни другое. У меня тут еще одна проблема есть, но о ней скажу после того, как вы поглядите мою прогу и ее исходники. Изменено 22 января, 2007 пользователем avb_constructor Ссылка на комментарий Поделиться на другие сайты Поделиться
neic Опубликовано 22 января, 2007 Жалоба Поделиться Опубликовано 22 января, 2007 1) Не понял, ты о On Error или самой компиляции в *.exe? 2) Для записи a = FreeFile Open 'путь к файлу' For Output(или Append) as a Print #a, 'что надо впихнуть в файл' Close #a Для четния a = FreeFile Open 'путь к файлу' For Input as a Print #a, 'что надо впихнуть в файл' Close #a П.с. Output - для перезаписи файла, Append - для добавления к файлу Ошибка в чтении!!! Надо так a = FreeFile Open 'путь к файлу' For Input as a textfile = Input(LOF(a),a) Close #a Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость avb_constructor Опубликовано 22 января, 2007 Жалоба Поделиться Опубликовано 22 января, 2007 1) Не понял, ты о On Error или самой компиляции в *.exe? Я про On Error. А проблема, о которой я написал: У меня тут еще одна проблема есть, но о ней скажу после того, как вы поглядите мою прогу и ее исходники проявилась только в профессиональной винде, в домашней этого не оказалось. Видно, профессионалка оказалась кривая. Ссылка на комментарий Поделиться на другие сайты Поделиться
neic Опубликовано 22 января, 2007 Жалоба Поделиться Опубликовано 22 января, 2007 Посмотрел я твой исходник... Да поработать надо! Ошибку не увидел (разве что номер 5, подробнее см. ниже). Насчёт On Error что тебе не понятно? On Error Resume Next - пропустить все ошибки On Error GoTo 'индфикатор': - пропустить от ... 'индфикатор': до Err.Number - получить номер ошибки Вообщем ошибка 5 у тебя появляется, потому что из "-" нельзя вычитать корень И ещё зачем тебе 3 окна("... нельзя вводить <=0...") ошибок? Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость avb_constructor Опубликовано 23 января, 2007 Жалоба Поделиться Опубликовано 23 января, 2007 Насчёт On Error что тебе не понятно? Я, кстати, с ним уже вчера разобрался, только было уже поздно, поэтому не выложил более новую версию. И ещё зачем тебе 3 окна("... нельзя вводить <=0...") ошибок? Я тоже думал над тем, как упростить прогу: как из трех окон оставить два или вообще одно. Но пока ничего не придумал. На счет того, что над прогой надо еще поработать, полностью согласен: 1. нужно сделать так, чтобы при выходе из окна с ошибкой (при возврате к окну вычислений) курсор оказывался в первом текстовом поле, а не на кнопке "Вычислить"; 2. при переходе от одного текстового поля к другому текст следующего текстового поля был выделен. Кстати, где и когда возникает ошибка 5? Я че-то не обнаружил такого. Ссылка на комментарий Поделиться на другие сайты Поделиться
neic Опубликовано 23 января, 2007 Жалоба Поделиться Опубликовано 23 января, 2007 Я, кстати, с ним уже вчера разобрался, только было уже поздно, поэтому не выложил более новую версию. Я тоже думал над тем, как упростить прогу: как из трех окон оставить два или вообще одно. Но пока ничего не придумал. На счет того, что над прогой надо еще поработать, полностью согласен: 1. нужно сделать так, чтобы при выходе из окна с ошибкой (при возврате к окну вычислений) курсор оказывался в первом текстовом поле, а не на кнопке "Вычислить"; 2. при переходе от одного текстового поля к другому текст следующего текстового поля был выделен. Кстати, где и когда возникает ошибка 5? Я че-то не обнаружил такого. Сделай проще: ...' когда происходит ошибка MsgBox "Так-то так-то",64,"Ошибка ввода" Text1.SetText Text1.SelLength = Len(Text1.Text) ... Чтобы при переходе на другой Text1,2,3,...,n выделялся текст Private Sub Text2_GotFocus() Text2.SelLength = Len(Text2.Text) End Sub Насчёт ошибки 5: Заходишь в первое окно (там первую Option1 когда выбираешь) вводишь Text1 = 22, а Text2 = 2... И вуаля ошибка намбер 5 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость avb_constructor Опубликовано 24 января, 2007 Жалоба Поделиться Опубликовано 24 января, 2007 (изменено) Ошибку 5 устранил, правда, появилась другая ошибка, и весьма странная. Почему-то прога не понимает, что проекция хорды, хоть и не может быть больше удвоенного значения радиуса (то бишь диаметра), но может быть больше самого радиуса, хотя в примере с самой хордой никаких ошибок нет :) . Я еще не производил (не знаю, как точно назвать, но...) пошаговую компиляцию с проверкой значений всех переменных на каждом шаге выполнения проги. Проверю, посмотрю, что там происходит. И пока еще не получается с записью в файл. neic, примеры, которые ты выложил, не прокатили, увы. Так что меня ждет попытка номер три. Да, и еще. Я убрал формы 5..7, заменив их на стандартные месседжбоксы Бейсика. А сейчас выкладываю, что получилось (версия 0.2.0). Надеюсь, что новых ошибок не навалял. Изменено 24 января, 2007 пользователем avb_constructor Ссылка на комментарий Поделиться на другие сайты Поделиться
neic Опубликовано 25 января, 2007 Жалоба Поделиться Опубликовано 25 января, 2007 Привет: Заметил ошибку =) Когда жму на вычислить (в обоих текстовых полях по 0-м) выходит ошибка, что типа нельзя использовать : Chr(13) + Chr(10) Нужно использовать vbcrlf. Хотя можно и по твоему, но это не грамотно и как показывает твоя прога ОШИБОЧНО! Вот тебе ещё подсказка: ...On Error Resume NExt...chisltext1 = Instr(1,text1,".") ' проверяем если точка в Text1chisltext2 = Instr(1,text2,".") ' проверяем если точка в Text2If chisltext1 > 0 then ' если в Text1 есть точка, то...ltext1 = Left(text1,chisltext1 - 1) ' отделяем левую сторонуrtext1 = Mid(text1,chisltext1 + 1) ' отделяем правую сторонуtext1 = ltext1 & "," & rtext1 ' соединяем с подменой на запятуюEnd IfIf chisltext2 > 0 then ' тоже самое что и Text1ltext2 = Left(text1,chisltext2 - 1)rtext2 = Mid(text1,chisltext2 + 1)text2 = ltext2 & "," & rtext2End If Это код выполняет подмен точки на запятую, это для того если я читать не умею(или не когда) ну и сервис ещё =) Насчёт записи, а что тебе не понятного? Допустим я хочу сохранить результат в папку с программой: 1-ый способ: ...' код вычисления a = FreeFile ' открываем файл Open App.path & "\result.txt" For Output as a ' ПЕРЕЗАПИСЫВАЕМ файл Print #a, Label8.caption ' записываем результат Close #a ' закрыть файл 2-ой способ: ...' код вычисления a = FreeFile ' открываем файл Open App.path & "\result.txt" For Append as a ' ДОПОЛНЯЕМ файл Print #a, Label8.caption ' записываем результат Close #a ' закрыть файл Для чтения используй: a = FreeFile ' открываем файл Open App.path & "\result.txt" For Input as a ' ЧИТАЕМ файл MsgBox "Предидущий результат был : " & Input(LOF(a),a) ' показываем результат Close #a ' закрыть файл Насчёт проверки : ставиш чек-пойнт слева от строки (там где отступ серый). Ставить чек-пойнт надо там от куда хочешь проверить. Управляющие клавиши : F8 - следующий шаг, F5 - продолжить или перейти к следующем чек-пойнту Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость avb_constructor Опубликовано 26 января, 2007 Жалоба Поделиться Опубликовано 26 января, 2007 А у тебя какая версия Visual Basic'a? Что-то я смотрю, у нас с тобой есть расхождения в синтаксисе проги: 1. у тебя это сочетание: Chr(13) + Chr(10) вызывает ошибку, а у меня нет; 2. у меня конкатенация идет через "+", а у тебя - через "&"; 3. у меня нет такой команды: a = FreeFile , а у тебя есть, но зато у меня есть другая команда создания экземпляра класса (если я правильно тебя понял): Set переменная = class , где class - это класс, из которого мы создаем экземпляр. Ссылка на комментарий Поделиться на другие сайты Поделиться
neic Опубликовано 26 января, 2007 Жалоба Поделиться Опубликовано 26 января, 2007 У меня VB6.0 (не больше не меньше) =) Используй vbсrlf потому, что пользователю будет не важно какой у тебя и у меня Васик =) a =FreeFile, это не класс и не команда! FreeFile указывает на свободный номер открытого файла, т.е. по другому можно сделать так: Open App.Patch & "\horda.txt" For Output as #1 Print #1, LAbel9.Caption Close #1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость avb_constructor Опубликовано 28 января, 2007 Жалоба Поделиться Опубликовано 28 января, 2007 (изменено) Пардон, на счет конкатенации был неправ: используется не "+", а "&". У меня получилась запись в текстовый файл, и именно так, как ты написал. Прежняя ошибка возникла оттого, что я путь записал не так. Что касается сервиса (с точкой), то че-то он пока не идет. Ладно, я пока отложу эту прогу в сторону, поскольку она не такая срочная: она нужна только мне, никто больше ею в обозримом будущем пользоваться не будет (да никто о ней и не знает, кроме нас с тобой и этого форума). А сейчас мне надо бы решить проблемы с другой прогой, которую я тоже пишу на VB. Как я уже писал выше, я работаю инженером-конструктором, выпускаю фотошаблоны на гибкие печатные платы, декоративные лицевые панели, мембранно-пленочные клавиатуры, а также чертежи на сами эти изделия и сборочные единицы, и на штанцформы, на которых они вырубаются. Кроме того, я делаю в CorelDRAW прогу для гравировки с использованием менеджера объектов последнего. Я работаю не только в Corel'e, но и в AutoCAD, Adobe Illustrator, SolidWorks. Во всей этой работе есть очень много рутины, которую я хотел бы автоматизировать. Три из перечисленных прог имеют встроенный VBA, которым я и хотел бы воспользоваться. Я хочу создать на "чистом" VB (т.е. в его отдельной среде программирования) что-то вроде оболочки, которая бы объединила все эти проги (в смысле, САПР и графические редакторы). Вполне возможно, что я еще включу сюда MS Office. Предполагается, что окошек будет гораздо больше, чем у рассмотренной нами выше проги. Но я в процессе создания этой программы забыл, что я хотел автоматизировать не только создание, но и редактирование графики. В результате я сначала создал окно, с которого начинается создание графики, а после создал окно, с которого должна начинаться вообще вся работа моей программы. Но VB начинает работу с того окна, которое было создано раньше. Как с помощью кода или панели "Свойства" изменить порядок загрузки окон при старте проги? Будет жаль переделывать все заново, с нуля. neic, ты, кстати, не сталкивался еще с такой проблемой, когда после включения компонентов (Ctrl+T) русский комментарий в проге становился нечитаемым (превратился бы в абракадабру)? Не знаешь, как из этого выйти? Изменено 28 января, 2007 пользователем avb_constructor Ссылка на комментарий Поделиться на другие сайты Поделиться
neic Опубликовано 28 января, 2007 Жалоба Поделиться Опубликовано 28 января, 2007 Насчёт начала старта с нужной формы: Project>Project1 Properties>там будет combobox Stratup Object>Нужная форма Насчёт Ctrl+T... чисто ради интереса попробовал, не у меня всё ОК Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти