Даже не знаю с чего начать
Да, чтобы можно было функции указывать любую форму, т.е. достаточно было передать ссылку на форму.
ОК! Надо попоробовать, я согласен с твоей концепцией написания програм, все исходники должны бить универсальными!
Да, чтобы можно было функции указывать любую форму, т.е. достаточно было передать ссылку на форму.
Что-то у меня не получается, намекни в каком направление двигатся?
Что-то у меня не получается, намекни в каком направление двигатся?
Наконец то восстановили инет на работе и я смог вылезти на форум :)
Для начала можно ничего особенно в твоих функциях не менять, кроме обращений к контролам на форме.
Список явных обращений заменяем на цикл по коллекции Me.Controls
Наконец то восстановили инет на работе и я смог вылезти на форум :)
Для начала можно ничего особенно в твоих функциях не менять, кроме обращений к контролам на форме.
Список явных обращений заменяем на цикл по коллекции Me.Controls
Я себе именно так и представлял но у меня что-то не получается это реализовать, было бы хорошо пример посмотреть! Если не трудно то покажи.
' тип для хранения коэффицентов контрола
Type tpSizeCtl
xDist As Double ' расстояние между контролом и формой:
yDist As Double ' по X и Y
xSize As Double ' размеры контрола:
ySize As Double ' по X и Y
End Type
Public Sub Initialisation_Resize2(fForm As Form)
Dim i As Long
If Dir$(PathINI) = "" Then
'Вычисление коэффициентов элементов управления формы
' очищаем массив
ReDim arCtl(0)
For i = 0 To fForm.Controls.Count - 1
ReDim Preserve arCtl(i)
arCtl(i).xDist = fForm.Controls(i).Left / fForm.Width
arCtl(i).yDist = fForm.Controls(i).Top / fForm.Height
arCtl(i).xSize = fForm.Controls(i).Width / fForm.Width
arCtl(i).ySize = fForm.Controls(i).Height / fForm.Height
Next i
Else
'Чтение коэфициентов размеров элементов формы
......
End If
End Sub
Public Sub Save_Resize()
'Запись размеров елементов формы
For i = 0 To fForm.Controls.Count - 1
Call WriteINI(fForm.Controls(i).Name, "Width", fForm.Controls(i).Width)
Call WriteINI(fForm.Controls(i).Name, "Height", fForm.Controls(i).Height)
Call WriteINI(fForm.Controls(i).Name, "Left", fForm.Controls(i).Left)
Call WriteINI(fForm.Controls(i).Name, "Top", fForm.Controls(i).Top)
Next i
End Sub
Если взять твой код за основу то примерно так:
' тип для хранения коэффицентов контрола
Type tpSizeCtl
xDist As Double ' расстояние между контролом и формой:
yDist As Double ' по X и Y
xSize As Double ' размеры контрола:
ySize As Double ' по X и Y
End Type
Public Sub Initialisation_Resize2(fForm As Form)
Dim i As Long
If Dir$(PathINI) = "" Then
'Вычисление коэффициентов элементов управления формы
' очищаем массив
ReDim arCtl(0)
For i = 0 To fForm.Controls.Count - 1
ReDim Preserve arCtl(i)
arCtl(i).xDist = fForm.Controls(i).Left / fForm.Width
arCtl(i).yDist = fForm.Controls(i).Top / fForm.Height
arCtl(i).xSize = fForm.Controls(i).Width / fForm.Width
arCtl(i).ySize = fForm.Controls(i).Height / fForm.Height
Next i
Else
'Чтение коэфициентов размеров элементов формы
......
End If
End Sub
Public Sub Save_Resize()
'Запись размеров елементов формы
For i = 0 To fForm.Controls.Count - 1
Call WriteINI(fForm.Controls(i).Name, "Width", fForm.Controls(i).Width)
Call WriteINI(fForm.Controls(i).Name, "Height", fForm.Controls(i).Height)
Call WriteINI(fForm.Controls(i).Name, "Left", fForm.Controls(i).Left)
Call WriteINI(fForm.Controls(i).Name, "Top", fForm.Controls(i).Top)
Next i
End Sub
Да после твоей проги я понял сколько мне еще нужно учится! Мне нужно разобратся во всем этом, но со временем сейчас напряг, как только освобожусь от роботы ты сразу увидеш результат!!! Спасибо
Ок.
Лови результат! Я переделал модуль modResize в своей програме учитывая твои рекомендации. Ты знаеш я шокирован насколько все спростилось, сам модуль стал в раза три меньше ну что требовалось сделать УНИВЕРСАЛЬНЫМ!(хотя возможно не оптимальным) он в вложеных файлах. Если есть еще кой какие задачки то бросай!Спасибо!
ОК, Сергей, перехвати, пожалуста, у меня хотя бы на время эту тему. А то сейчас я защищался, тут ещё отпуск близится и надо все проекты передавать перед отпуском, а со 2 числа меня вообще не будет, а так не хочется делать долгий перерыв в задачках! Перехвати тему, если не трудно! ОК?
Теперь, к чему я веду.
На задачках, которые реально пригодятся как "просто для себя", так и в плане использования в проектах в будущем, я пытаюсь показать разные интересные приёмы программирования так, чтобы уважаемый Andi_SPAWN сам их решал - так лучше всего, на мой взгляд, запоминается,и привести это всё к написанию универсального калькулятора, который будет считать гору всякой всячины. Это как бы конец первого этапа.
Как только появишся сразу дай знать!
Потом вторым этапом хочу начать разбор работы с БД... Это очень пригодится ещё... Но, в принципе, 2 этап будет ещё не скоро, я успею вернуться...
Подхватишь на 3-4 недельки тему, ок?
ОК, Сергей, перехвати, пожалуста, у меня хотя бы на время эту тему. А то сейчас я защищался, тут ещё отпуск близится и надо все проекты передавать перед отпуском, а со 2 числа меня вообще не будет, а так не хочется делать долгий перерыв в задачках! Перехвати тему, если не трудно! ОК?
Теперь, к чему я веду.
На задачках, которые реально пригодятся как "просто для себя", так и в плане использования в проектах в будущем, я пытаюсь показать разные интересные приёмы программирования так, чтобы уважаемый Andi_SPAWN сам их решал - так лучше всего, на мой взгляд, запоминается,и привести это всё к написанию универсального калькулятора, который будет считать гору всякой всячины. Это как бы конец первого этапа.
Потом вторым этапом хочу начать разбор работы с БД... Это очень пригодится ещё... Но, в принципе, 2 этап будет ещё не скоро, я успею вернуться...
Подхватишь на 3-4 недельки тему, ок?
Как только появишся то сразу дай знать!
Как только появишся то сразу дай знать!
Я с утра на работе гляну, ща уже поздновато, токо ночью дошел до дома :)
Я с утра на работе гляну, ща уже поздновато, токо ночью дошел до дома :)
Блин, набрал целый трактат, а комп. в перезагрузку ушел...
придется заново набирать
ReDim Preserve arCtl(i)
приведет к тому, что внутри цикла у нас постоянно переопределяться массив с данными. Происходить это будет следующим образом: сначала веделится пустой кусок памяти нужного большего размера, потому туда будут скопированы данные из старого массива и наконец старый массив будет удален, а память из под него освобождена. Понятно, что в цикле с увеличением самого массива вся эта операция по ReDim Preserve.... будет требовать все больше и больше времени (наверное по экспоненте) и при большом кол-ве элементов массива очень сильно может затормозить программу. Так писать можно только, если:
1. Неизвестно заранее макс. кол-во элементов массива.
2. Массив будет маленьким.
Если массив будет большим, то тогда быстрее будет вхолостую пробежать массив для определения верхн. границы массива, потом объявить массив нужной размерности и начать основной цикл по заполнению массива уже известной величины.
Т.о. образом лучше переделать код так:
Erase arCtl
' иниц. массива
ReDim Preserve arCtl(fForm.Controls.Count)
For i = 0 To fForm.Controls.Count - 1
arCtl(i)......
..........
Некоторая оптимизация по коду. Я там поспешил и оставил одну, не очень хорошую строчку:
ReDim Preserve arCtl(i)
приведет к тому, что внутри цикла у нас постоянно переопределяться массив с данными. Происходить это будет следующим образом: сначала веделится пустой кусок памяти нужного большего размера, потому туда будут скопированы данные из старого массива и наконец старый массив будет удален, а память из под него освобождена. Понятно, что в цикле с увеличением самого массива вся эта операция по ReDim Preserve.... будет требовать все больше и больше времени (наверное по экспоненте) и при большом кол-ве элементов массива очень сильно может затормозить программу. Так писать можно только, если:
1. Неизвестно заранее макс. кол-во элементов массива.
2. Массив будет маленьким.
Если массив будет большим, то тогда быстрее будет вхолостую пробежать массив для определения верхн. границы массива, потом объявить массив нужной размерности и начать основной цикл по заполнению массива уже известной величины.
Т.о. образом лучше переделать код так:
Erase arCtl
' иниц. массива
ReDim Preserve arCtl(fForm.Controls.Count)
For i = 0 To fForm.Controls.Count - 1
arCtl(i)......
..........
Приветствую! Да ты прав но для такого количества елементов как уменя это не ощутимо, да и вобще я даже не могу себе представить сколько должно быть елементов на форме щобы ощутимо замедлить выполнение проги (если тачка хорошая)? :???:
У меня к тебе такие вопросы:
1. В коллекции Control индекс елементов совпадает с их индексом проставленым в "свойствах"?
2. Я тут прочитал про подклучение *.dll к проекту и там упоминается об их регестрации, как это сделать? С помощю чего?
3. Усли есть какая-нибуть задачка то напиши!!!
ОК, Сергей, перехвати, пожалуста, у меня хотя бы на время эту тему. А то сейчас я защищался, тут ещё отпуск близится и надо все проекты передавать перед отпуском, а со 2 числа меня вообще не будет, а так не хочется делать долгий перерыв в задачках! Перехвати тему, если не трудно! ОК?
Теперь, к чему я веду.
На задачках, которые реально пригодятся как "просто для себя", так и в плане использования в проектах в будущем, я пытаюсь показать разные интересные приёмы программирования так, чтобы уважаемый Andi_SPAWN сам их решал - так лучше всего, на мой взгляд, запоминается,и привести это всё к написанию универсального калькулятора, который будет считать гору всякой всячины. Это как бы конец первого этапа.
Потом вторым этапом хочу начать разбор работы с БД... Это очень пригодится ещё... Но, в принципе, 2 этап будет ещё не скоро, я успею вернуться...
Подхватишь на 3-4 недельки тему, ок?
Привет рад тебя снова видеть на форуме, как отдохнул?
Я с нетерпением жду на продолжение ниших занятий, как у тебя со времене?
Напомню, что последняя задачка была по написанию проги "Транслитерация", которая могла бы ресайзится и сохранять изминения в инишник. По ходу дела Sergey SV, предложил сделать процедуру ресайза универсальной (так как моя была жостко привязана к моэй форме) с чем я успешно справился, все это есть в ранее вложеных файлах. Это кратко все, если есть что новое то бросай!!!
Привет рад тебя снова видеть на форуме, как отдохнул?
Я с нетерпением жду на продолжение ниших занятий, как у тебя со времене?
Напомню, что последняя задачка была по написанию проги "Транслитерация", которая могла бы ресайзится и сохранять изминения в инишник. По ходу дела Sergey SV, предложил сделать процедуру ресайза универсальной (так как моя была жостко привязана к моэй форме) с чем я успешно справился, все это есть в ранее вложеных файлах. Это кратко все, если есть что новое то бросай!!!
SORRY, сегодня пока подкинуть ничего не смогу - я сегодня бегу жену встречать. Где-то пару дней погляжу, что тут без меня произошло, а потом продолжим. ОК?
Приветствую! Да ты прав но для такого количества елементов как уменя это не ощутимо, да и вобще я даже не могу себе представить сколько должно быть елементов на форме щобы ощутимо замедлить выполнение проги (если тачка хорошая)? :???:
У меня к тебе такие вопросы:
1. В коллекции Control индекс елементов совпадает с их индексом проставленым в "свойствах"?
2. Я тут прочитал про подклучение *.dll к проекту и там упоминается об их регестрации, как это сделать? С помощю чего?
3. Усли есть какая-нибуть задачка то напиши!!!
Я тут тоже уезжал в отпуск так что не успел ответить на выпросы:
1. За номер в коллекции Controls контрола отвечает свойство Index, но токо в диспетчере свойств значение этого свойства не видно помойму, токо во время выполнения кода.
2. Подключение и регистрация Dll это два разных действия. Регистрировать Dll приходится когда она приходит на комп впервые. Ты конечно можешь просто скопировать файл Dll куда-нибудь в директорию, но токо Windows не будет знать об этой Dll ничего.
Dll это прежде всего библиотека, которая подкючается динамически. Причем динамическое подключение возложено на саму Windows. Т.е. программа говорит, хочу функцию Fun1 из библиотеки myDll.dll, тут Windows сразу озадачивается и начинает искать файл myDll.dll, чтобы его загрузить в память. Понятно дело, чтобы windows смогла его найти, ентот файл необходимо зарегистрировать (ну не будут же винды по всему диску его разыскивать). Эта регистрация подразумевает под собой заведение в реестре в спец. ветке новой ссылки на файл myDll.dll, так что теперь винда будет всегда знать где искать dll которую просят запущенные программы. Проблемы бывают только когда сам файл dll в тихую удаляют, а регистрацию (ключ в реестре) оставляют, тогда винда жестоко обламывается с загрузкой dll :)
Для регистрации dll в виндах есть спец. консл. утилита
regsvr32.exe
Вот так регистрим файл (кстати ocx, тоже надо регистрить):
regsvr32.exe Kalendar.ocx
А вот так снимаем регистрацию:
regsvr32.exe /u Kalendar.ocx
Понятно, что если dll уже зарегистрирована на компе, то тебе в своем коде регистр. заниматься не надо. Большинство программ инсталяторов также сами регистрять свои dll. Необходимость возникает только тогда, когда ты сам притащил на комп эту dll или она должна идти в комплекте с твоей прогой, которую ты хочешь поставить на другой комп, а инстятор ты делать не хочешь, тогда придется озаботиться...
SORRY, сегодня пока подкинуть ничего не смогу - я сегодня бегу жену встречать. Где-то пару дней погляжу, что тут без меня произошло, а потом продолжим. ОК?
Без проблем старик! 8)
если кто видел эту прогу про тринслитерацию...
я не понял.. как там работает режим моментальный???
вроде включаю его. если на англ. пишу то норм... все переделывает.
но стоит только на русский перейти, то уже не работает.
и наоборот...
там рандом какой -то =) или я просто спать хочу сильно =)
потом мне кажется, что нагляднее будет, когда вводишь англ текст, то кнопку Русский в Английский лучше сделать "серой". и наоборот....
+ прога виснет! если ввести англ. текст и нажать "исправить текст на английский"..
соответственно наоборот тоже виснет...
почему, не знаю... ибо код не смотрел пока.
(как работать с апи функциями в ВБ??? Подскажите плз! =) где найти список апи функций?)
старая тема.. но всё же...
если кто видел эту прогу про тринслитерацию...
я не понял.. как там работает режим моментальный???
вроде включаю его. если на англ. пишу то норм... все переделывает.
но стоит только на русский перейти, то уже не работает.
и наоборот...
там рандом какой -то =) или я просто спать хочу сильно =)
потом мне кажется, что нагляднее будет, когда вводишь англ текст, то кнопку Русский в Английский лучше сделать "серой". и наоборот....
+ прога виснет! если ввести англ. текст и нажать "исправить текст на английский"..
соответственно наоборот тоже виснет...
почему, не знаю... ибо код не смотрел пока.
(как работать с апи функциями в ВБ??? Подскажите плз! =) где найти список апи функций?)
Значит что касается "моментального режима":
если он у тебя не включон то после набора текста нужно постоянно нажимать кнопки "Русский в Английский" или "Английский в Русский" в зависимости от того какими буквами введен текст. Когда включить моментальный режим то такая потребность отпадает, но предварительно проге нужно указать режим транслитерации (текущей режим написан вверху), допустим включен "моментальный режим" + "Английский в Русский", тогда програма будет транслитерировать англ. букви в рус., если же при этом режиме ввести русские буквы то ничего не произойдет!
Что касается кнопок то согласен что нужно было сделать их серыми в зависимости от язика ввода, а виснит програма потому, що я не продумал ее дейстие в таких ситуациях как ты ей создавал в результета чего она входит в бесконечный цикл да и вобще прога далека от совершенства и была написана на колене из-за отсутсвия времени да и цели написания стояли совершенно другии.
Что же касается API-функций то могу подсказать вот что:
- список этих ф-й должен быть у тебя на машине. Запусти ...Common\Tools\Winapi\Apiload.exe там ты увидеш не только список но и синтаксис написания ф-й. Но этого мало потому что там нет описания ф-й, для этого я тебе порекомендую однин адресок http://www.vb.kiev.ua/ там есть даже примеры!