PDA

View Full Version : آموزش: کار با فرم های HTML - (خواندن / نوشتن / رخدادها / validation) HTML Form in Ms-Access



mazoolagh
شنبه 14 بهمن 1402, 20:23 عصر
سطح آموزش حرفه ای و نیازمند تسلط به html/javascript/css هست.

اول اضافه کردن رفرنس:
155319

در یک فرم، کنترل web browser و سه textbox و دو button رو اضافه میکنیم:
155321

Option Compare Database
Option Explicit

Const HTML = _
"<!DOCTYPE html>" + _
"<!-- saved from url=(0016)http://localhost -->" + _
"<html lang='en'>" + _
"<head>" + _
"<meta http-equiv='X-UA-Compatible' content='IE=edge' />" + _
"<meta charset='utf-8' />" + _
"<meta name='viewport' content='width=device-width, initial-scale=1'>" + _
"</head>" + _
"<body>" + _
"<label for='Text1'>Text 1</label>" + _
"<input type='text' id='text1'><br/>" + _
"<label for='Text2'>Text 2</label>" + _
"<input type='text' id='text2'><br/>" + _
"<label for='Text3'>Text 3</label>" + _
"<input type='text' id='text3'>" + _
"</body>" + _
"</html>"

Private doc As New MSHTML.HTMLDocument

Private Sub Btn_Read_Click()
Me.Text1 = doc.getElementById("Text1").Value
Me.Text2 = doc.getElementById("Text2").Value
Me.Text3 = doc.getElementById("Text3").Value
End Sub

Private Sub Btn_Write_Click()
doc.getElementById("Text1").Value = Me.Text1
doc.getElementById("Text2").Value = Me.Text2
doc.getElementById("Text3").Value = Me.Text3
End Sub

Private Sub Form_Load()
Load_From_String
Set doc = WB.Object.Document
End Sub

Sub Load_From_String()
WB.Object.Navigate "about:blank"
Do While WB.ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop
WB.Object.Document.write HTML
End Sub


این بحث به تدریج کامل میشه.

moustafa
دوشنبه 16 بهمن 1402, 11:13 صبح
دستش شما درد نکنه مبحث بسیاز جالب و پرکاربردی میتونه باشه

mohammadsaleh
جمعه 20 بهمن 1402, 19:06 عصر
تشکر از استاد به خاطر طرح این موضوع. من سالها دنبال این بودم که اکسس را با فرمهای html استفاده کنم. البته در نهایت برای رسیدن به مقصودم از hta برای این کار استفاده کردم که بسیار زیبا و قشنگه. در مورد فایل استاد هم وقتی خواستم بازش کنم پیام زیر امد:
The active content in this file is blocked. Review your Trust Center settings or

عرض می کنم خدمت دوستان که برای رفع مشکل قبل از باز کردن روی فایل راست کلیک کنید و در تب جنرال تیک گزینه آنبلاک را فعال کنید

mazoolagh
چهارشنبه 25 بهمن 1402, 18:37 عصر
دستش شما درد نکنه مبحث بسیاز جالب و پرکاربردی میتونه باشه
ممنون از لطف شما،
امیدوارم سودمند باشه.

mazoolagh
چهارشنبه 25 بهمن 1402, 18:43 عصر
تشکر به خاطر طرح این موضوع. من سالها دنبال این بودم که اکسس را با فرمهای html استفاده کنم. البته در نهایت برای رسیدن به مقصودم از hta برای این کار استفاده کردم که بسیار زیبا و قشنگه. در مورد فایل استاد هم وقتی خواستم بازش کنم پیام زیر امد:
The active content in this file is blocked. Review your Trust Center settings or

عرض می کنم خدمت دوستان که برای رفع مشکل قبل از باز کردن روی فایل راست کلیک کنید و در تب جنرال تیک گزینه آنبلاک را فعال کنید
ممنون از لطف شما،
امیدوارم ضمن مشارکت در بحث، این جمع رو از تجربیات و دانسته های خودتون در زمینه hta بهره مند کنین.

mazoolagh
چهارشنبه 25 بهمن 1402, 21:37 عصر
برای تعامل با فرم html که در یک کنترل web browser لود شده،
لازم هست کار با رخدادهای این کنترل رو بلد باشیم.

بیشترین نیاز ما رخدادهای موس و کیبرد هستن: click,keydown,keyup,mowusedown,mouseup و ...
وقتی روی کنترل مرورگر کلیک میکنیم، میتونیم در رخداد onclick با پراپرتی activeelement بفهمیم که کدوم button کلیک یا کدوم فیلد focus شده.

همچنین میتونیم در vba با متد execscript یک کد جاوااسکریپت رو در مرورگر اجرا کنیم.

میتونیم با پراپرتی script مقدار یک متغیر جاوااسکریپت رو از سمت مرورگر بخونیم.

میتونیم از امکانات validation فرم های html برای ساده تر کردن کار استفاده کنیم،
و به جای پیام های مرورگر که بستگی به که کانفیگ مرورگر داره و معمولا انگلیسی هست،
پیام های سفارشی خودمون رو بذاریم.

میتونیم وضعیت validation فیلدها رو با رنگ و ... مشخص کنیم (بدون کد و فقط با css)

من اینها (همراه با چند مورد دیگه) رو در یک برنامه نمونه آماده کردم که میتونین تست کنین و ایده بگیرین.
نوشتن توضیحات زمانبر هست، میگذارم به عهده خودتون که نکاتش رو بپرسین.
و این که این نمونه رو سریع آماده کردم برای همین باحتمال زیاد ممکنه ایرادهایی داشته باشه چون فقط چند تست ساده کردم.

همچنین اگر نمونه های مفید دیگه ای دارین، یا مطلب تکمیلی، همینجا بگذارین تا همه استفاده کنن.

155363

155364

155365

155366

mazoolagh
چهارشنبه 25 بهمن 1402, 21:55 عصر
توضیح مختصر در مورد فایل پیوست:

در کنار برنامه نمونه html_form_2.accdb سه فولدر هم هست:
1- CSS برای نگهداری فایلهای stylesheet‌که یکی برای خود فرم و فیلدها و ... است و یکی فقط برای کلیدهای save و clear form
2- HTML برای نگهداری فایل Form2.html که طراحی فرم هست.
3- SCRIPTS‌ برای نگهداری کتابخانه JQuery - در بعضی از کدها از این کتابخانه استفاده کردم صرفا به منظور آموزش روش کار

و یک نکته مهم:
این که یک کاری شدنی باشه دلیل این نیست که حتما کار درستی هست!
استفاده از فرم html در برنامه های اکسس/اکسل الزاما نه تنها کدنویسی شما رو کمتر نمیکنه،
بلکه موجب پیچیده تر و سخت تر شدن نگهداری برنامه هم میشه.

به این مثل چاشنی خوراک نگاه کنین: شاید به مقدار کم خوب باشه!
اگر واقعا نیاز به چیزی دارین که در اکسس نیست باید سراغ تکنولوژی دیگه برین و وصله پینه نکنین،
بخصوص که کنترل مرورگروب در آفیس واقعا از رده خارج هست.

از این آموزش فقط برای ایده گرفتن یا بعنوان یک چیز fun استفاده کنین!

mazoolagh
چهارشنبه 25 بهمن 1402, 21:57 عصر
کدهای فرم اکسس

Option Compare Database
Option Explicit

Private WithEvents btn_save As MSHTML.HTMLButtonElement
Private WithEvents fldtext As MSHTML.HTMLInputTextElement
Private WithEvents Doc As MSHTML.HTMLDocument
Private Window As MSHTML.HTMLWindow2
Private Sub Form_Load()
Me.WB.ControlSource = "=""" & CurrentProject.Path & "\HTML" & "Form2.html" & """"
WaitUntilReady
Set Doc = WB.Object.Document
Set Window = Doc.parentWindow
Set fldtext = Doc.getElementById("fld_text")
Set btn_save = Doc.getElementById("btn_save")
End Sub
Private Function fldtext_focus()

PersianKeyboard
End Function

Private Function btn_save_onclick() As Boolean
Window.execScript "validate(); var isvalid = $('form')[0].checkValidity();"
WaitUntilReady
Me.IsValid = Doc.Script.IsValid
Read_Fields
End Function

Private Sub Btn_Write_Click()
SetValue "fld_text", "ãÊä äãæäå"
SetValue "fld_textarea", "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod"
SetValue "fld_password", "1A2b3C#‎‎!"
SetValue "fld_email", "mazoolagh@hotmail.com"
SetValue "fld_url", "https://microsoft.com"
SetValue "fld_select", "gl"
SetValue "fld_list", "Condiments"
SetChecked "fld_checkbox", True
SetChecked "fld_checkbox_group_1", True
SetChecked "fld_checkbox_group_2", False
SetChecked "fld_checkbox_group_3", False
SetChecked "fld_checkbox_group_4", False
SetChecked "fld_checkbox_group_5", False
SetChecked "fld_radio_group_1", True
SetValue "fld_range", "64"
Window.execScript "$('#fld_checkbox_group_1').trigger('change');"
Window.execScript "$('#fld_radio_group_1').trigger('change');"
Window.execScript "$('#fld_range').trigger('change');"
Window.execScript "validate();"
WaitUntilReady
End Sub

Sub Read_Fields()
Me.TextBox = GetValue("fld_text")
Me.TextArea = GetValue("fld_textarea")
Me.Password = GetValue("fld_password")
Me.Email = GetValue("fld_email")
Me.URL = GetValue("fld_url")
Me.File.RowSource = GetValue("fld_file")
Me.SelectValue = GetValue("fld_select")
Dim fld_select As MSHTML.HTMLSelectElement
Set fld_select = Doc.getElementById("fld_select")
Me.Select_Text = fld_select.options(fld_select.selectedIndex).text
Me.List = GetValue("fld_list")
Me.CheckBox = (Doc.getElementById("fld_checkbox").Checked)
Me.CheckBoxGroupValues = GetValue("fld_checkbox_group_values")
Me.CheckBoxGroupTexts = GetValue("fld_checkbox_group_texts")

Dim radio As MSHTML.HTMLInputElement
Set radio = Doc.querySelector("input[name=fld_radio_group]:checked")
Me.RadioGroupValue = Doc.getElementById(radio.id).Value
Window.execScript "get_radio_group_text();"
Me.RadioGroupText = GetValue("fld_radio_group_text")
Me.Range = GetValue("fld_range")
End Sub

Function GetValue(FieldName As String) As String
GetValue = Doc.getElementById(FieldName).Value
End Function

Sub SetValue(FieldName As String, Value As String)
Doc.getElementById(FieldName).Value = Value
End Sub

Sub SetChecked(FieldName As String, Value As Boolean)
Doc.getElementById(FieldName).Checked = Value
End Sub

Sub WaitUntilReady()
Do While WB.Object.Busy Or WB.ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop
End Sub

Private Sub WB_Click()
If Doc.activeElement.id = "fld_text" Then
PersianKeyboard
Else
EnglishKeyboard
End If
End Sub

Private Sub WB_KeyDown(KeyCode As Integer, Shift As Integer)
If Doc.activeElement.id = "fld_text" Then
PersianKeyboard
Else
EnglishKeyboard
End If
End Sub

mazoolagh
چهارشنبه 25 بهمن 1402, 22:02 عصر
کدهای فرم HTML

<!DOCTYPE html>
<!-- saved from url=(0016)http://localhost -->
<html lang='en'>


<head>
<title title='HTML Form'></title>
<meta http-equiv='X-UA-Compatible' content='IE=edge' />
<meta charset='utf-8' />
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link rel='stylesheet' href='../CSS/styles.css' type='text/css'>
<link rel='stylesheet' href='../CSS/buttons.css' type='text/css'>
<script src='../SCRIPTS/jquery-3.7.1.js'></script>
<script>


const textbox_pattern = /[^ءأاآبپتثجچحخدذرزژسشصضطظع فقکگلمنوهی\u200c\u0020]+/g;
const textarea_pattern = /[^a-zA-Z0-9\u0020]/gm;
const text_invalid_msg = 'الزامی - فقط حروف فارسی';
const textarea_invalid_msg = 'الزامی - فقط حروف و اعداد لاتین';
const select_invalid_msg = 'انتخاب الزامی است';
const checkbox_group_invalid_msg = 'دست کم یک مورد باید انتخاب شود';


var textbox;
var textarea;
var file;
var select;
var checkbox_group_values;
var checkbox_group_texts;


$(function () {
textbox = document.getElementById('fld_text');
textbox.addEventListener('keyup', validate_text);


textarea = document.getElementById('fld_textarea');
textarea.addEventListener('keyup', validate_textarea);


file = document.getElementById('fld_file');
file.addEventListener('change', validate_file);


select = document.getElementById('fld_select');
select.addEventListener('change', validate_select);


checkbox_group_values = document.getElementById('fld_checkbox_group_values ');
checkbox_group_texts = document.getElementById('fld_checkbox_group_texts' );
//===========================================
$('[name=fld_checkbox_group]').each(function () {
$(this).on('change', validate_checkbox_group);
});
//===========================================
$('form td:first-of-type label').each(function () {
if ($(this).closest('td').next('td').find('input, textarea, select').prop('required')) {
$(this).addClass('required');
}
});
//===========================================
$('#btn_save').on('click', function () {
return false;
});
//===========================================
$('form').on('submit', function (e) {
e.preventDefault();
});
//===========================================
$('#btn_clear').on('click', function () {
$('form textarea, select ,input[type=text], input[type=url], input[type=email], input[type=password], input[type=file]').each(function () {
$(this).val('');
});


$('form input[type=range]').each(function () {
$(this).val(0);
$(this).next('span').text($(this).val());
});


$('form input[type=checkbox],input[type=radio]').each(function () {
$(this).prop('checked', false);
});


$('#fld_radio_group_1').prop('checked', true);
});
//===========================================
$('#fld_range').on('change', function () {
$('#fld_range_value').text($(this).val());
});
});
//===========================================
function validate_text() {
if (textbox.value.match(textbox_pattern) || textbox.value == '') {
textbox.setCustomValidity(text_invalid_msg);
}
else {
textbox.setCustomValidity('');
}
}
//===========================================
function validate_textarea() {
if (textarea.value.replace(/[\n]/g, '').match(textarea_pattern) || textarea.value == '') {
textarea.setCustomValidity(textarea_invalid_msg);
}
else {
textarea.setCustomValidity('');
}
};
//===========================================
function validate_select() {
if (select.value == '') {
select.setCustomValidity(select_invalid_msg);
}
else {
select.setCustomValidity('');
}
};
//===========================================
function validate_checkbox_group() {
var values = [];
var texts = [];
$('[name=fld_checkbox_group]:checked').each(function () {
values.push($(this).val());
texts.push($(this).next('label').text());
});
checkbox_group_values.value = values.join();
checkbox_group_texts.value = texts.join();
if (values.length == 0) {
checkbox_group_values.setCustomValidity(checkbox_g roup_invalid_msg);
}
else {
checkbox_group_values.setCustomValidity('');
}
};
//===========================================
function validate_file() {
var file_value = file.value;
if (file_value == '') {
file.setCustomValidity('');
}
else {
var files = file_value.split(',');
const valid_extentions = /(\.rar|\.zip)$/i;
for (i = 0; i < files.length; i++) {
if (!valid_extentions.exec(files[i])) {
file.setCustomValidity('فقط فایلهای\n rar یا zip \nمجاز است');
}
}
}
};
//===========================================
function validate() {
validate_text();
validate_textarea();
validate_select();
validate_checkbox_group();
validate_file();
$('#btn_submit').trigger('click');
};
//===========================================
function get_radio_group_text() {
$('#fld_radio_group_text').val($('[name=fld_radio_group]:checked').next('label').text());
};
</script>
</head>


<body>
<form>
<fieldset>
<legend>HTML Form</legend>
<table>
<tr>
<td><label>Text Box</label></td>
<td>
<input type='text' id='fld_text' required class='field'
pattern='[ءأاآبپتثجچحخدذرزژسشصضطظعق فقکگلمنوهی\u200c\u0020]+'
placeholder='متن را اینجا بنویسید : فقط حروف فارسی'>
</td>
</tr>
<tr>
<td><label>Text Area</label></td>
<td>
<textarea id='fld_textarea' rows='4' required class='field'
placeholder='Write text here: only a-z A-Z 0-9'></textarea>
</td>
</tr>
<tr>
<td><label>Password</label></td>
<td>
<input type='password' id='fld_password' class='field'
pattern='^(?=(.*[a-z]){1,})(?=(.*[A-Z]){1,})(?=(.*[0-9]){1,})(?=(.*[!@#$%^&*\-__+.]){1,}).{8,}$'
placeholder='a-z A-Z 0-9 !@#$%^&*-_+. دست کم ۸ کارآکتر' />
</td>
</tr>
<tr>
<td><label>Email</label></td>
<td><input type='email' id='fld_email' class='field' placeholder='username@domain' /></td>
</tr>
<tr>
<td><label>URL</label></td>
<td><input type='url' id='fld_url' class='field' placeholder='urlscheme://restofurl' /></td>
</tr>
<tr>
<td><label>File</label></td>
<td><input type='file' id='fld_file' class='field' accept=".rar, .zip" multiple="true" /></td>
</tr>
<tr>
<td><label>Select (ComboBox)</label></td>
<td>
<select id='fld_select' required class='field'>
<option value=''>انتخاب کنید</option>
<optgroup label='group Green' class='green'>
<option value='g'>green</option>
<option value='gl'>light green</option>
<option value='gd'>dark green</option>
</optgroup>
<optgroup label='group Red' class='red'>
<option value='rl'>light red</option>
<option value='rd'>dark red</option>
</optgroup>
<optgroup label='group Blue' class='blue'>
<option value='b'>blue</option>
<option value='bl'>light blue</option>
<option value='bd'>dark blue</option>
<option value='bs'>sky blue</option>
</optgroup>
</select>
</td>
</tr>
<tr>
<td><label>List</label></td>
<td>
<input id='fld_list' list='categories' class='field'
placeholder="انتخاب از لیست یا عبارت دلخواه">
<datalist id='categories'>
<option value='Beverages'></option>
<option value='Condiments'></option>
<option value='Confections'></option>
<option value='Dairy Products'></option>
<option value='Grains/Cereals'></option>
<option value='Meat/Poultry'></option>
<option value='Produce'></option>
<option value='Seafood'></option>
</datalist>
</td>
</tr>
<tr>
<td><label>Check Box</label></td>
<td><input type='checkbox' id='fld_checkbox' /></td>
</tr>
<tr>
<td><label>CheckBox Group</label></td>
<td>
<input type='text' id='fld_checkbox_group_values' class='hidden field' value='' required>
<input type='hidden' id='fld_checkbox_group_texts' value=''>
<input type='checkbox' id='fld_checkbox_group_1' name='fld_checkbox_group'
value='sc'><label>Science</label>
<input type='checkbox' id='fld_checkbox_group_2' name='fld_checkbox_group'
value='mt'><label>Math</label>
<input type='checkbox' id='fld_checkbox_group_3' name='fld_checkbox_group'
value='ar'><label>Art</label>
<input type='checkbox' id='fld_checkbox_group_4' name='fld_checkbox_group'
value='ph'><label>Physics</label>
<input type='checkbox' id='fld_checkbox_group_5' name='fld_checkbox_group'
value='sp'><label>Sports</label>
</td>
</tr>
<tr>
<td>
<label>Radio Group</label>
</td>
<td>
<input type='radio' id='fld_radio_group_1' name='fld_radio_group' value='1' checked='checked'
required /><label>Access</label>
<input type='radio' id='fld_radio_group_2' name='fld_radio_group'
value='2' /><label>Excel</label>
<input type='radio' id='fld_radio_group_3' name='fld_radio_group'
value='3' /><label>Word</label>
<input type='radio' id='fld_radio_group_4' name='fld_radio_group'
value='4' /><label>Visio</label>
<input type='hidden' id='fld_radio_group_text' value=''>
</td>
</tr>
<tr>
<td><label>Range</label></td>
<td>
<input type='range' id='fld_range' min='24' max='80' step='4' value='36' list='ticks' />
<span id='fld_range_value'>36</span>
<datalist id='ticks'>
<option value='24'></option>
<option value='32'></option>
<option value='40'></option>
<option value='48'></option>
<option value='56'></option>
<option value='64'></option>
<option value='72'></option>
<option value='80'></option>
</datalist>
</td>
</tr>
<tr>
<td></td>
<td>
<button type='button' id='btn_save' class='btn'>Save</button>
<button type='button' id='btn_clear' class='btn'>Clear Form</button>
<button type='submit' id='btn_submit'>Submit</button>
</td>
</tr>
</table>
</fieldset>
</form>
</body>


</html>

mazoolagh
چهارشنبه 25 بهمن 1402, 22:05 عصر
کدهای styles.css

* { font-family: Vazirmatn;
}


html,
body {
height: 100%;
margin: 0;
display: flex;
justify-content: center;
align-items: center;
}


body {
background-position: center center;
background-repeat: no-repeat;
background: -ms-radial-gradient(circle, #b8e0ee, #8cbdce);
background-color: #8cbdce;
}


form {
display: inline-block;
}


form table {
border-collapse: collapse;
}


form table td {
vertical-align: middle;
}


form table tr {
border: thin;
}


form table tr td:first-of-type {
text-align: right;
}


form label {
color: blue;
font-weight: bold;
font-family: 'Segoe UI', Tahoma;
}


.field {
width: 100%;
padding: 2px;
margin: 5px 0;
box-sizing: border-box;
border: 2px solid black;
border-radius: 5px;
font-family: Vazirmatn;
background-color: whitesmoke;
box-shadow: 0 8px 6px -6px #555;
transition: all ease 0.3s;
}


.field:focus:valid {
background-color: white;
border: 2px solid blue;
box-shadow: none;
}


.field:focus:invalid {
background-color: white;
border: 2px solid red;
box-shadow: none;
}


.field:not(:focus):valid {
background-color: whitesmoke;
border: 2px solid black;
box-shadow: 0 8px 6px -6px #555;
}


.field:not(:focus):invalid {
background-color: whitesmoke;
border: 2px solid red;
box-shadow: 0 8px 6px -6px #555;
}


.field.hidden {
width: 0 !important;
height: 0 !important;
color: transparent !important;
background-color: transparent !important;
border: none !important;
box-shadow: none !important;
outline: none !important;
}


.field:-ms-input-placeholder {
color: green;
}


#fld_text {
direction: rtl !important;
text-align: right !important;
}


#btn_submit {
display: none;
}


*:invalid {
border: 2px solid red;
outline: none;
box-shadow: none;
}


.required::after {
content: "*";
color: red;
}


.green option {
background-color: darkgreen;
color: white;
}


.blue option {
background-color: darkblue;
color: gold;
}


.red option {
background-color: darkred;
color: aliceblue
}

mazoolagh
چهارشنبه 25 بهمن 1402, 22:07 عصر
کدهای buttons.css

.btn {
cursor: pointer;
height: 44px;
padding-left: 15px;
padding-right: 15px;
text-align: center;
color: #fff;
font-size: 20px;
font-weight: bold;
text-shadow: 2px 1px 1px #386379;
border: 1px solid #3180a7;
background: linear-gradient(to bottom, #6dbfe8 0%, #28a1de 50%, #28a1de 50%, #1f8cc2 51%, #1f8cc2 51%, #33a0d6 100%);
border-radius: 3px;
outline: none;
box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.7);
}


.btn:hover {
background: linear-gradient(to bottom, #5ba8d5 0%, #2c8cc0 50%, #267eac 51%, #3190c2 100%);
}


.btn:active {
color: #add1e4;
background: linear-gradient(to bottom, #155f86 0%, #2880ae 75%);
box-shadow: inset 0 4px 15px rgba(0, 0, 0, 0.3), 0 1px 0 0 rgba(255, 255, 255, 0.7);
}