powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Общие принципы построения приложения в FoxPro
24 сообщений из 424, страница 17 из 17
Общие принципы построения приложения в FoxPro
    #38161103
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Добавьте в вашу форму эту процедуру _DoSQLExec() и вызовите ее из этой же кнопки.
Это ж отстало-ущербное процедурное программирование

Как же свелое будущее:
sg12избавим наши формы от необходимости чуть не в каждой писать индивидуально эти же процедуры, от которых рябит в глазах.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161165
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12PaulWist

Что-то вы меня совсем запутали с этим 'НЕТУ алиаса'.
Добавьте в вашу форму эту процедуру _DoSQLExec() и вызовите ее из этой же кнопки.
Алиас появляется?

Ну, так дело не пойдёт, мы же вроде договорились, я написал тестовый пример, а вы модифицируете его и показываете результат,... те добавьте в форму процедуру и запостите код на форуме.

PS но не забудьте про парадигму ООП, что бы в итоге не вышло процедурного программирования :)
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161170
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T[Это ж отстало-ущербное процедурное программирование

Не спешите.
Надо сначала найти этот алиас.

ООП не означает наличие аллергии на процедурное программирование.
В фоксе ведь предусмотрено SET PROCEDURE TO, которым мы можем подключить (и подключаем) глобальный процедурный модуль mainutil.prg
А там мы можем на законных основаниях тоже глобально разместить эту процедуру DoSQLEXec().
И т.п., если возникнет в этом необходимость.

И если в форме этот алиас найдется, то эту процедуру мы можем глобально разместить в родительском классе без ущерба для здоровья.
Но пока разберемся с тем, что есть, не все еще потеряно.

RAZ_DVA_TRI
Вы не могли бы разместить здесь полностью этот свой код с картинки.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161174
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist

Давайте сначала найдем этот алиас.
Он появился?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161190
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12PaulWist

Давайте сначала найдем этот алиас.
Он появился?

Вы тестовый код-то запускали?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161261
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistsg12PaulWist

Давайте сначала найдем этот алиас.
Он появился?

Вы тестовый код-то запускали?

Нет. Я вам вполне доверяю.
Наоборот, у меня интерес, чтобы вы (и не только вы) нашли как можно больше ошибок и недоработок.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161282
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Наоборот, у меня интерес, чтобы вы (и не только вы) нашли как можно больше ошибок и недоработок.
Я нашел глобальный косяк. Ошибку проектирования ООП приложения. Вот он
Код: sql
1.
goSet.hSQL


Это же хэндл соединения. единственная связь с БД !!! Его надо максимально изолировать от остального кода приложения, а то вдруг какой криворучка напишет
Код: sql
1.
goSet.hSQL = .F.


и все. капец.

Инкапсуляцию в ООП ведь придумали не зря. Надо hSQL объявить PRIVATE и никуда не давать даже через методы goSet, а то криворучка напишет
Код: sql
1.
SqlDisconnect(goSet.Get_hSQL())


и опять капец.

Чего делать будем?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161310
alexzima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12, Ты гений
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161326
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЧего делать будем?

Если честно, то я и сам сомневаюсь, насколько целесообразно загонять хендл сервера в goSet - уж больно он перегружен параметрами и процедурами, которые с ними работают.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161352
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Dima TЧего делать будем?

Если честно, то я и сам сомневаюсь, насколько целесообразно загонять хендл сервера в goSet - уж больно он перегружен параметрами и процедурами, которые с ними работают.
и какие будут предложения?

Применение ООП это не только повторное использование кода. Второй плюс инкапсуляции снижение ошибок при командной разработке, тут опытный разработчик пишет ядро, инкапсулирует все критически важное в свои классы, защищая ядро от ошибок неопытного, которому доверено незначительная часть работы. А тут мы всем и вся хендл сервера раздаем. Может явно его закрывать никто не будет, но запросто могут, например, запрос сделать с докачкой (.FetchAsNeeded = .T.) и тут все работать перестанет пока результат не докачался.
Поэтому следуя правилам ООП надо прятать хэндл глубоко и доверять его использование только проверенному на 10 раз коду.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161659
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Если не та буква проставлена, то здесь вы отлаживаете раз и навсегда. Если же вы это делаете в приложении, то этим занимаетесь постоянно и каждый раз.Нет. Одну и ту же букву, дествительно, можно отладить либо "раз и навсегда", либо "постоянно". Но никакой разницы между тем, находится эта буква в одной большой процедуре под кейсом или же она находится в отдельной процедуре, нет. Если всё-таки разница есть, объясните подробнее, в чём же именно она заключается.

sg12В lcStr в приложении вы выставляете только те пункты, которые вам надо выбрать из DoSQL.
К примеру, ведь к серверу можно подсоединиться не только через строку.
Тогда будет так, с отлаженными кодами, они ведь кушать не просят:
CASE tcCase == 'Соединение'
CASE tcCase == 'Соединение2'
CASE tcCase == 'Соединение3'
В них и отрабатываются параметры соединений.
Забегая вперед - они тоже хранятся в приложении, в том же goApp.oInfo, но в другой процедуре ConnectList.
Но сама процедура их обработки находится в 'Соединении' и отлаживается тоже один раз.Отлично, см. выше, я уже упоминал, что можно сделать процедуру ConnectSQL. А в неё уже передавать... да хоть имя соединения, хоть напрямую его параметры - кто как посчитает нужным. И она точно так же "отлаживается один раз". В чём преимущество вашего подхода?
sg12Но теперь в приложении у вас уже появится выбор, в зависимости от задачи:
lcStr = 'Соединение'
или, а не "и"
lcStr = 'Соединение2'Что значит "или, а не и"? В моём варианте тоже есть выбор - какие параметры передадим в ConnectSQL, такое соединение и получим.
sg12Или, другой пример, в каком-то приложении вам необходимо обойтись без логина - вы просто не вписываете это слово в lcStr."без логина" - в смысле, без соединения с сервером? Отлично, я просто не буду вызывать в этом приложении ConnectSQL :)
Или это означало "используя некие дефолтные параметры соединения"? Опять же нет разницы, как к этим параметрам обращаться - из кейса или из отдельной процедуры.
sg12Коды вам в зубы - и вперед.Пока что эти коды основаны на идее, применять которую я не вижу особого смысла. Так что пытаться в зубы мне их совать ещё рановато - не возьму.
sg12Если код процедуры разрастется, то он разделяется на несколько процедур.Ну так а какой тогда вообще смысл в это горожении огорода с кейсами, если в конце концов всё равно приходится делить? Кстати, а по какому принципу делите? Что оставляете в "старой" процедуре, что в "новую" переходит?
sg12Сейчас основное - понять смысл преобразований+1
Я вот пока так и не понимаю. Точнее, "смысл" я понимаю, но не вижу существенных отличий в лучшую сторону от "не-дукейсового" подхода. Таких, чтобы всё бросать и срочно переписывать весь код.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161749
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12PaulWistпропущено...


Вы тестовый код-то запускали?

Нет. Я вам вполне доверяю.
Наоборот, у меня интерес, чтобы вы (и не только вы) нашли как можно больше ошибок и недоработок.

1. У меня вопрос - а Вы умеете/знаете как запустить приведённый тестовый код? и если знаете, то что вам помешало это сделать?

2. Дык, я уже чуть ли не неделю пытаюсь получить код класса для SQLEXEC() написанный вами, а кода всё нет и нет,... обьясните, как можно найти ошибку, в том чего нет.

Судя по всему, такого кода вы никогда не писали, а честно признаться "религия" не позволяет хотя я могу ошибаться.

3. Главная ошибка в самом принципе построения, предложенный подход используется в процедурном программировании, в ООП совсем другие "парадигмы", причём вариантов реализации достаточно много, собственно об этом уже многие говорили, в том числе и ВладимирМ :)

То что Вы предлагаете - это бредсивкэйбл, через это проходят почти все новички,... ничего личного, просто констатация факта.

4. Если есть конкретные вопросы, то задавайте, лучше всего в таком виде: "я делаю так-то и так-то, получается то-то, а хочу получить то-то"

PS Ещё раз повторю, ничего личного. Удачи.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38162582
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist

Переход на избитые темы типа "СамТыКто" и "КтоТытакой" не является аргументом в таких вопросах.

Такой класс имеется в поставке VFP9, находится в FFC-dataquery.vcx-execsp, вполне доступен. Он тоже глобальный и перетаскивается мышкой на формы.

Я немного просмотрел материалы по этому вопросу. Проблема вами изложена достаточно четко, но она неоднозначна.
Во избежание казусов возможным решением является передача в процедуру goServer.DoSQLExec() как параметров DS или THISFORM, с последуюющей обработкой сессии. Т.е. примерно так, как на картинке несколькими постами выше.

Еше один глобальный класс на основе Custom.
Создайте его под именем _mediator в новой библиотеке _custobj.vcx. Добавьте в него эту процедуру DoSQLExec(). Затем откройте свою форму и мышкой добавьте туда этот объект под именем oMediator.
Тогда строка вызова из кнопки примет вид THISFORM.oMediator.DoSQLExec().

Как видите, решений достаточно и нет необходимости в вашем классе.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38164009
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Есть предложение закрыть тему, так как посты постоянно переходят на обсуждение личных качеств участников дискуссии...
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38164155
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Ch

Вернемся к теме.
Вопрос: Что означает "правильно спроектированное приложение"?
Мое мнение - этот термин в Фоксе игнорируется и под этим понятием почти каждый понимает свое творчество.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38164162
RAZ_DVA_TRI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sg12RAZ_DVA_TRI
Вы не могли бы разместить здесь полностью этот свой код с картинки.

тама
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38164203
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RAZ_DVA_TRIsg12RAZ_DVA_TRI
Вы не могли бы разместить здесь полностью этот свой код с картинки.

тама

Спасибо. Емкое решение.

PaulWist
Вот еще код установки DS из поставки VFP9:

LOCAL liSession
liSession = SET("DATASESSION")
DO CASE
CASE VARTYPE(_SCREEN.ACTIVEFORM.DATASESSIONID) = "N" AND liSession # _SCREEN.ACTIVEFORM.DATASESSIONID
SET DATASESSION TO (_SCREEN.ACTIVEFORM.DATASESSIONID)

CASE VARTYPE(_SCREEN.ACTIVEFORM.PARENT.DATASESSIONID) = "N" AND liSession # _SCREEN.ACTIVEFORM.PARENT.DATASESSIONID
SET DATASESSION TO (_SCREEN.ACTIVEFORM.PARENT.DATASESSIONID)
OTHERWISE
* we're in the right datasession already
ENDCASE
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38165486
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Вопрос: Что означает "правильно спроектированное приложение"?
Мое мнение - этот термин в Фоксе игнорируется и под этим понятием почти каждый понимает свое творчество.
И как много "творчества" было проанализировано для столь серьезного заявления? Какая была репрезентативность выборки?

и неплохо было бы услышать с чем сравнивалось, т.е. что подразумевается под словами "Мое мнение".
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38166907
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tsg12Вопрос: Что означает "правильно спроектированное приложение"?
Мое мнение - этот термин в Фоксе игнорируется и под этим понятием почти каждый понимает свое творчество.
И как много "творчества" было проанализировано для столь серьезного заявления? Какая была репрезентативность выборки?

и неплохо было бы услышать с чем сравнивалось, т.е. что подразумевается под словами "Мое мнение".

Почему же вы так высокомерно ставите слово "творчество" в кавычки, скромностью вас не попрекнешь.

Я просматриваю и изучаю почти все, что более-менее связано с этой тематикой.
Что и вам уже советовал, чтобы не выдумывали новые теории.
Могу сказать, что отдельных решений очень много хороших, и по отдельности большинство вопросов было решено еще лет пять назад.
Но все они канули в пустоту из-за отсутствии в фОксе концепции программирования - некуда внедрять, у каждого свой паровоз.

Сравнивать - хотя бы здесь, с мнением поочередных ГУРУ.
Аргументов мизер, в основном абстрактный треп с передергиванием понятий.
Не говоря уже об основном козыре - примитивных комментариях моей личности.
Даже на примере вашего учебного SQLEXEC-чудо класса это видно.

Если вы опять рветесь "мериться", могу разнообразить.

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

Или вот вам начало кода универсального объекта oWinapi, работающего с winapi-функциями непосредственно в формате из MSDN.
DO CASE
CASE tcCase == 'Fun'
lcString = THIS.DoEx('List','Fun',tcName)
IF EMPTY(lcString)
MESSAGEBOX('Ошибка ввода. Функция не определена.')
RETURN .F.
ENDIF
THIS.DoEx('Object','Fun',lcNameObj)

WITH goWinapi
lcFile = GETWORDNUM(lcString,2,'~')
lcError = GETWORDNUM(lcString,3,'~')
lcResult = GETWORDNUM(lcString,4,'~')
lcReturn = GETWORDNUM(lcString,5,'~')
lcString = GETWORDNUM(lcString,7,'~')

lcDeclare = GETWORDNUM(lcString,1,'(')
lcDeclare = THIS.DoEx('Type','Declare',lcDeclare)

lcString = GETWORDNUM(GETWORDNUM(lcString,2,'('),1,')')
THIS.DoEx('Type','Fun',lcString)
lcStr = ''
FOR i = 1 TO ALEN(.aWinapi,1)
lcStr = lcStr + ',' + .aWinapi[1,1] + ' ' + IIF(.aWinapi[1,3],'@','') + ' ' + .aWinapi[1,2]
ENDFOR

lcDeclare = lcDeclare + ' IN ' + lcFile + ' AS ' + 'w_' + tcName + ' ' + SUBSTR(lcStr,2)
DECLARE &lcDeclare

lcStr = ''
FOR i = 1 TO ALEN(.aWinapi,1)
lcStr = lcStr + ',' + IIF(.aWinapi[1,3],'@','') + 'tuParam' + ALLTRIM(STR(i))
ENDFOR
lcStr = 'w_' + tcName + '(' + SUBSTR(lcStr,2) + ')'
luResult = &lcStr

IF !EMPTY(lcError) AND !EMPTY(lcResult) AND EVALUATE(lcResult)
THIS.DoError(lcError,lcResult)
ENDIF
CLEAR DLLS &lcAlias
ENDWITH

RELEASE goWinapi
RETURN EVALUATE(lcReturn)
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38166961
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Почему же вы так высокомерно ставите слово "творчество" в кавычки, скромностью вас не попрекнешь.

Я просматриваю и изучаю почти все, что более-менее связано с этой тематикой.
Что и вам уже советовал, чтобы не выдумывали новые теории.
Могу сказать, что отдельных решений очень много хороших, и по отдельности большинство вопросов было решено еще лет пять назад.
Но все они канули в пустоту из-за отсутствии в фОксе концепции программирования - некуда внедрять, у каждого свой паровоз.

Сравнивать - хотя бы здесь, с мнением поочередных ГУРУ.
Аргументов мизер, в основном абстрактный треп с передергиванием понятий.
Не говоря уже об основном козыре - примитивных комментариях моей личности.
Даже на примере вашего учебного SQLEXEC-чудо класса это видно.

Если вы опять рветесь "мериться", могу разнообразить.

К примеру, тот сайт, с которого вы так гордо сумели скопировать один пример, у меня почти весь давно уже находится в черновом классе.
Сумеете перевести хотя бы одну статью - покажу как это делается.
Потрясающий пример скромности :) Как обычно: в чужом глазу и т.д. И обязательные ГУРУ в тему и не в тему :)Или вот вам начало кода универсального объекта oWinapi, работающего с winapi-функциями непосредственно в формате из MSDN.
DO CASE
CASE tcCase == 'Fun'
...
DECLARE &lcDeclare
...
luResult = &lcStr
...
Еще одно потрясение :) Потрясающе по новизне, оригинальности, форматированию :)
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38167012
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И тут же следует подтверждение ПустоТрепа, даже попытка разнообразить не помогла.
Очень уж кому-то хочется, чтобы я его к гуру причислил.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38167120
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12

АнекдотНовичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!

Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.

Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!

Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?

Новичок: Чем мне нравиться этот форум - из двух ответов ниодного конкретного. Одни вопросы неподелу!

Старожил: Не нравится - тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят,
то лучше бы тебе сначала школу закончить.

Новичок: Не знаите - лучше молчите! У меня дедушка в деревянном доме живёт!
У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ!!! Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее!
Поэтому и спрашиваю!!! А от вас нормального ответа недождёшся!!!

Прохожий: Самое крепкое дерево - дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:

Новичок: Спасибо, братан! То что нужно!!!
Вы выступаете в роли автора проекта деревянного небоскреба. Проблема в том, что Вы сейчас просто не в состоянии понять то, что Вам пытаются объяснить. Но не потому, что это что-то сложное или заумное. А по той причине, что Вы уже придумали для себя некий примерный ответ и все то, что не попадает в Ваш "шаблон ответа" просто отбрасывается.

Вы не можете сейчас адекватно воспринять ответ, что "небоскребы из дерева не строят". Вы уже настроились на то, что Вам скажут породу дерева или способ его обработки. Любой другой вариант ответа воспринимается Вами как подколки, наезды, пустотреп и т.п. "Ведь у дедушки ничего не ломается!" Ну, что же, "берите дуб". Через год..полтора посмотрим, что у Вас получится...
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38167157
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ

И как вы мне прикажете воспринимать теперь эти ваши психологические опыты?
Детсад какой-то - дубы, сосны, колобка только не хватает.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38167302
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: По многочисленным просьбам участников форума я закрываю данный топик как потерявший конструктивность.
...
Рейтинг: 0 / 0
24 сообщений из 424, страница 17 из 17
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Общие принципы построения приложения в FoxPro
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]