יום שישי, 17 בפברואר 2012
עיקול הפינות של הטופס או של פקד אחר
נעשה ע"י:
ולאחר מכן יש למקם את הקוד הבא בשיטה האתחול של הטופס (Load או בבנאי של הטופס):
// Curve corners:
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn
(
int nLeftRect, // x-coordinate of upper-left corner
int nTopRect, // y-coordinate of upper-left corner
int nRightRect, // x-coordinate of lower-right corner
int nBottomRect, // y-coordinate of lower-right corner
int nWidthEllipse, // height of ellipse
int nHeightEllipse // width of ellipse
);
ולאחר מכן יש למקם את הקוד הבא בשיטה האתחול של הטופס (Load או בבנאי של הטופס):
public Form1() //constructor
{
this.Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(10, 10, Width, Height, 30, 30));
btn.Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(4, 4, btn.Width, btn.Height, c, c));
}
את הרעיון הזה מצאתי כאן:
http://stackoverflow.com/questions/5092216/c-form-with-custom-border-and-rounded-edges
גרירה של חלונית ע"י לחיצה (אחיזה) בכל מקום
#C
---
דרך אחרת לגרירה של טופס - הכוללת אפשרות לגרירה של הטופס עד לחל העליון של המסך כדי להגדיל אותו -
בכל מקום שעל הטופס או על כל פקד (Control) אחר, נעשה ע"י מיקום של השורות האלה בראש הטופס:
// Drag the Form
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
ולאחר מכן יש ליצור אירוע MouseDown עבור הטופס או עבור ה-Control איתו אנו עובדים,
ולמקם את הקוד הבא בשיטה של האירוע:
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
---
דרך אחרת לגרירה של טופס - הכוללת אפשרות לגרירה של הטופס עד לחל העליון של המסך כדי להגדיל אותו -
יום שבת, 11 בפברואר 2012
index
כתיבה / קריאה מהרגיסטרי של ווינדוס - כולל עקיפה של אבטחת UAC
הגדרת registery לריצה של תוכנית עם אתחול המערכת
טיפים ל-Windows (בעיקר Win7 אך לא רק)
בדיקה ומניעה של הרצת תוכנה ביותר מעותק אחד.
קריאת קוד של דפי אינטרנט - html
האזנה למקשים במהלך ריצת Windows
(ASP) שינוי מקור נתונים של טבלת GridView
(ASP) בניית דינמית של טבלה
קריאת פרמטרים משורת הפקודה
קריאה מתוך registery של Windows.7
קוד VBs - יצירת נקודת שיחזור לווינדוס בלחיצה
יצירת User Control ושימוש ב-delegate
(ASP) בנייה דינמית של טבלה:
(ASP) מיקום ושימוש ב-connectionString מתוך web.config
מניעת סגירת טופס בלחיצה על X
הסרת ניקוד מטקסט
הורדת קבצים ע"י VB script
ProcessDir - פונקציה רקורסיבית לסריקת תיקיות
Drag -n- Drop - 'זריקת' קבצים אל תיבת רשימה (listbox) או תיבת טקסט
קבע את האייקון של התוכנה
העלמת אייקונים משולחן העבודה - #C
יצירת תוכנית מייל - mail client
טיפים קטנים ושימושיים ב-#C
הגדרת אירוע 'יציאה' מטופס
מזעור תוכנית לשורת המשימות
כתיבה / קריאה מהרגיסטרי של ווינדוס - כולל עקיפה של אבטחת UAC
כתיבה / קריאה מהרגיסטרי של ווינדוס
נעשית ע"י שורות הקוד שיופיעו להלן.
נעשית ע"י שורות הקוד שיופיעו להלן.
יום רביעי, 7 בספטמבר 2011
יום שלישי, 26 ביולי 2011
שינוי מקור נתונים של טבלת GridView
ASP
לאחרונה נתקלתי בצורך ליצור טבלת gridview שמקבלת בהתחלה מקור נתונים אחד -
למשל טבלה של רשימת שמות עם הפרטים שלהם, ובבחירה של אחת מהשורות ע"י כפתור Select - מחליפה את מקור הנתונים ומציגה טבלה אחרת עם עמודות אחרות.
לאחרונה נתקלתי בצורך ליצור טבלת gridview שמקבלת בהתחלה מקור נתונים אחד -
למשל טבלה של רשימת שמות עם הפרטים שלהם, ובבחירה של אחת מהשורות ע"י כפתור Select - מחליפה את מקור הנתונים ומציגה טבלה אחרת עם עמודות אחרות.
יום שישי, 1 ביולי 2011
קריאת פרמטרים משורת הפקודה
כאן נסביר כיצד לקרוא פרמטרים משורת הפקודה, כך שלמשל נוכל להתחיל תוכנה -
c:\> myprogram minimize
קבענו שהפרמטר minimize שממוקם אחרי שם התוכנה, יתחיל את התוכנה ממוזערת.
ראשית אנו צריכים שפעולת בדיקה זאת תופעל מיד בעליית התוכנה, כך שנלחץ פעמיים על השורה העליונה של הטופס,כך ייוצר 'אירוע' - event : האירוע יבדוק אילו פרמטרים נשלחו:
יש ליצור לולאה שתבדוק מהם הפרמטרים ותייחד לכל פרמטר פעולה משלו.
private void Form1_Load(object sender, EventArgs e)
{
string[] args
= Environment.GetCommandLineArgs();
}
יש ליצור לולאה שתבדוק מהם הפרמטרים ותייחד לכל פרמטר פעולה משלו.
תוויות:
תכנות #C
יום שני, 27 ביוני 2011
קריאה מתוך registery של Windows.7
קריאה מה-registery ב-Windows.7 אפשרית ע"י פתיחה של הקובץ:
Properties > app.manifest
בקובץ הזה יש למחוק או לבטל הפעלה של השורה:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
ביטול השורה יכול להיעשות ע"י הקפה של השורה ב <-- --> כמו שאפשר לראות:
<--
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
-->
כלומר משנים את השורה לסטטוס של 'הערה'.
זהו קובץ XML, וכמו ב-HTML זאת היא הדרך לציין 'הערות' .
אי שימוש בשיטה זו (או שיטות אחרות) יפיל את התוכנית במהלך נסיון קריאה ל-registery.
ניתן לחילופין לשנות את הגדרות האבטחה UAC ע"י כניסה ל:
הפעלה > msconfig > עמודה אחרונה 'כלים'
השורה השניה ברשימה מפנה ל'שינוי הגדרות UAC'
יש לבחור בשורה וללחוץ 'הפעל', ושם להוריד את רמת האבטחה UAC למינימום.
כעת ניתן יהיה לקרוא וגם לכתוב לרגיסטרי
אי שימוש בשיטה זו (או שיטות אחרות) יפיל את התוכנית במהלך נסיון קריאה ל-registery.
ניתן לחילופין לשנות את הגדרות האבטחה UAC ע"י כניסה ל:
הפעלה > msconfig > עמודה אחרונה 'כלים'
השורה השניה ברשימה מפנה ל'שינוי הגדרות UAC'
יש לבחור בשורה וללחוץ 'הפעל', ושם להוריד את רמת האבטחה UAC למינימום.
כעת ניתן יהיה לקרוא וגם לכתוב לרגיסטרי
תוויות:
תכנות #C
יום שני, 20 ביוני 2011
מניעת הרצת תוכנה ביותר מעותק אחד
ע"י חיפוש בין כל ה-Proccess שרצים במערכת נדע אם התוכנה כבר רצה
וכך נמנע מלהריץ אותה שוב -
וכך נמנע מלהריץ אותה שוב -
תוויות:
תכנות - כללי,
תכנות #C
הסרת ניקוד מטקסט
להלן קוד לקבלת מחרוזת תווים והסרת הניקוד ממחרוזת זו:
static String RemoveDiacritics(String s){String normalizedString = s.Normalize(NormalizationForm.FormD);StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < normalizedString.Length; i++){Char c = normalizedString[i];if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)stringBuilder.Append(c);}return stringBuilder.ToString();}
שימוש בקוד זה נעשה למטרת עבודה עם טקסטים מנוקדים.
הרבה פעולות לא יכולות להיעשות על טקסט מנוקד, והפונקציה הנ"ל מסירה ניקוד ומאפשרת עבודה עם הטקסט.
תוויות:
תכנות - כללי,
תכנות #C
יום שני, 13 ביוני 2011
(ASP) בניית דינמית של טבלה
void InsertTableRow(int row, int col)
{
for(int i=0; i<row; i++)
{
TableRow tr = new TableRow();
TableCell tcel;
for(int i=0; i<col; i++)
{
tcel = new TableCell();
tcel.Text = "";
tr.Cells.Add(tcel);
}
TableScore.Rows.Add(tr);
}
}
תוויות:
תכנות - כללי,
תכנות #C,
ASP
יום רביעי, 13 באפריל 2011
(ASP) מיקום ושימוש ב-connectionString מתוך web.config
כאשר ניגשים לבסיס נתונים מתוך דף ASP, יש צורך להתקשר אליו עם connectionString.
כדאי שהמחרוזת הזאת תהיה מוגדרת במקום אחד בלבד, כל עמוד ייגש אליה ויקבל אותה משם, ואם נרצה לשנות יהיה עלינו לשנות רק במקום אחד:
קודם כל, בתוך web.config אפשר אולי למצוא תג של: </connectionStrings> ולהחליף אותו בזה, אם לא אז פשוט למקם חדש:
כאן השתמשתי ב-return ' אפשר בכל דרך אחרת שתרצו.
מי שיירצה VB.NET:
כדאי שהמחרוזת הזאת תהיה מוגדרת במקום אחד בלבד, כל עמוד ייגש אליה ויקבל אותה משם, ואם נרצה לשנות יהיה עלינו לשנות רק במקום אחד:
קודם כל, בתוך web.config אפשר אולי למצוא תג של: </connectionStrings> ולהחליף אותו בזה, אם לא אז פשוט למקם חדש:
<connectionStrings><addname="myServerName"connectionString="Data Source=SNIR-LAPTOP\SQLEXPRESS;Initial Catalog=project;Integrated Security=True"providerName="System.Data.SqlClient"/></connectionStrings>
לאחר מכן בתוכנית עצמה (דף #C) אפשר לקבל את הערך שהגדרנו כאן ע"י:
return ConfigurationManager.ConnectionStrings["myServerName"].ConnectionString;
כאן השתמשתי ב-return ' אפשר בכל דרך אחרת שתרצו.
מי שיירצה VB.NET:
Dim conString = ConfigurationManager.ConnectionStrings("MyServerName")Dim strConnString As String = conString.ConnectionString
תוויות:
תכנות - כללי,
תכנות #C
יום שלישי, 12 באפריל 2011
יום חמישי, 3 במרץ 2011
תוכן
האזנה למקשים במהלך ריצת Windows
(ASP) שינוי מקור נתונים של טבלת GridView
(ASP) בניית דינמית של טבלה
קריאת פרמטרים משורת הפקודה
קריאה מתוך registery של Windows.7
בדיקה ומניעה של הרצת תוכנה ביותר מעותק אחד.
הסרת ניקוד מטקסט
(ASP) בנייה דינמית של טבלה:
(ASP) מיקום ושימוש ב-connectionString מתוך web.config
מניעת סגירת טופס בלחיצה על X
קוד VBs - יצירת נקודת שיחזור לווינדוס בלחיצה
קריאת קוד של דפי אינטרנט - html
יצירת User Control ושימוש ב-delegate
הורדת קבצים ע"י VB script
ProcessDir - פונקציה רקורסיבית לסריקת תיקיות
Drag -n- Drop - 'זריקת' קבצים אל תיבת רשימה (listbox) או תיבת טקסט
קבע את האייקון של התוכנה
העלמת אייקונים משולחן העבודה - #C
קריאת קוד המקור של עמוד אינטרנט
יצירת תוכנית מייל - mail client
טיפים קטנים ושימושיים ב-#C
הגדרת אירוע 'יציאה' מטופס
מזעור תוכנית לשורת המשימות
הגדרת registery לריצה של תוכנית עם אתחול המערכת
(ASP) שינוי מקור נתונים של טבלת GridView
(ASP) בניית דינמית של טבלה
קריאת פרמטרים משורת הפקודה
קריאה מתוך registery של Windows.7
בדיקה ומניעה של הרצת תוכנה ביותר מעותק אחד.
הסרת ניקוד מטקסט
(ASP) בנייה דינמית של טבלה:
(ASP) מיקום ושימוש ב-connectionString מתוך web.config
מניעת סגירת טופס בלחיצה על X
קוד VBs - יצירת נקודת שיחזור לווינדוס בלחיצה
קריאת קוד של דפי אינטרנט - html
יצירת User Control ושימוש ב-delegate
הורדת קבצים ע"י VB script
ProcessDir - פונקציה רקורסיבית לסריקת תיקיות
Drag -n- Drop - 'זריקת' קבצים אל תיבת רשימה (listbox) או תיבת טקסט
קבע את האייקון של התוכנה
העלמת אייקונים משולחן העבודה - #C
קריאת קוד המקור של עמוד אינטרנט
יצירת תוכנית מייל - mail client
טיפים קטנים ושימושיים ב-#C
הגדרת אירוע 'יציאה' מטופס
מזעור תוכנית לשורת המשימות
הגדרת registery לריצה של תוכנית עם אתחול המערכת
יום חמישי, 17 בפברואר 2011
מניעת סגירת טופס בלחיצה על X
ישנם מקרים בהם רוצים שבלחיצה על X הסגירה של התוכנית
התוכנה לא תיסגר אלא תמזער למשל לשורת המשימות של ווינדוס.
לשם כך יש להוסיף את הקוד הבא לתוכנית:
את כל זה הקוד עושה בעזרת משתנה בוליאני (אמת-שקר) בשם formClose
איתו אפשר לקבוע לפני הסגירה של התוכנית אם היא אכן תיסגר או לא.
התוכנה לא תיסגר אלא תמזער למשל לשורת המשימות של ווינדוס.
לשם כך יש להוסיף את הקוד הבא לתוכנית:
bool formClose = false;
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
if (formClose == false)
{
//cancels the closing event
e.Cancel = true;
//hides the window
this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
this.Hide();
}
}
אפשר להבין שהקוד 'משכתב' - override את אירוע הסגירה של התוכנה, ובמקום לסגור אותו ממזער אותו.
בשביל מיזעור לשורת המשימות - http://snir.blogspot.com/2010/10/minimize-window-to-tray.html
בשביל מיזעור לשורת המשימות - http://snir.blogspot.com/2010/10/minimize-window-to-tray.html
את כל זה הקוד עושה בעזרת משתנה בוליאני (אמת-שקר) בשם formClose
איתו אפשר לקבוע לפני הסגירה של התוכנית אם היא אכן תיסגר או לא.
למשל, אם נרצה ונוסיף כפתור שאכן סוגר את התוכנה, אז נצטרך לכתוב לו:
formClose = true;
this.Close();
תוויות:
תכנות - כללי,
תכנות #C
יום שלישי, 25 בינואר 2011
יצירת נקודת שיחזור בלחיצה - VB-script
קוד VB script עבור יצירת נקודת שחזור לווינדוס בלחיצה.
יש ליצור קובץ RestorePoint.vbs (או כל שם אחר במקום RestorePoint) ולהעתיק לתוכו את הכתוב כאן:
יש ליצור קובץ RestorePoint.vbs (או כל שם אחר במקום RestorePoint) ולהעתיק לתוכו את הכתוב כאן:
RestorePointName = inputBox("הכנס שם לנקודת השחזור")
If Len(RestorePointName)>0 Then
If Len(RestorePointName)>0 Then
Set IRP = getobject("winmgmts:\\.\root\default:Systemrestore")
MYRP = IRP.createrestorepoint (RestorePointName, 0, 100)
msgBox ": נוצרה נקודת שחזור בשם" + vbCrLf + RestorePointName
End If
End If
תוויות:
תכנות - כללי
יום שישי, 12 בנובמבר 2010
קריאת קוד של דף או קובץ כלשהו באינטרנט, וכתיבה של קובץ במחשב
קריאת קוד של דף או קובץ כלשהו באינטרנט:
כתיבת תוכן של תיבת טקסט אל תוך קובץ והרצה של הקובץ:
ע"י StreamReader מבצעים גם קריאה של קובץ מהמחשב המקומי.string ReadUrlCode(string url){HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);HttpWebResponse res = (HttpWebResponse)req.GetResponse();StreamReader sr = new StreamReader(res.GetResponseStream());string str = sr.ReadToEnd();res.Close();sr.Close();return str;}
כתיבת תוכן של תיבת טקסט אל תוך קובץ והרצה של הקובץ:
void WriteToFile(string filepath) { StreamWriter sw = new StreamWriter(filepath); try { sw.Write(richTextBox1.Text); } catch { } finally { sw.Close(); } //running the file System.Diagnostics.Process.Start(filepath); }
תוויות:
תכנות - כללי,
תכנות #C
יום חמישי, 4 בנובמבר 2010
הורדת קבצים (Download) ע"י VB script
VB script
לבקשתו של אבא שלי, כתבתי סקריפט להורדת קבצים מאתר שירים - 'פיוט'.
צבעתי באדום את החלקים שאפשר לשנות, בכחול את שם המשתנים.
את הסקריפט יש למקם בקובץ עם סיומת vbs , וניתן להריץ אותו מיד.
לבקשתו של אבא שלי, כתבתי סקריפט להורדת קבצים מאתר שירים - 'פיוט'.
צבעתי באדום את החלקים שאפשר לשנות, בכחול את שם המשתנים.
את הסקריפט יש למקם בקובץ עם סיומת vbs , וניתן להריץ אותו מיד.
DIR = "C:\הורדות\"
DestFolder = inputBox("הכנס את מיקום לשמירה","-Title-" , DIR)
songNumber = inputBox("הכנס את מספר השיר")
songName = inputBox("הכנס שם לשיר")
URL = "http://media.snunit.k12.il/piut/GoodQuality/" + songNumber + ".piyut"
ImageFile = songName + ".mp3"
If songNumber > 0 Then
Set xml = CreateObject("Microsoft.XMLHTTP")
xml.Open "GET", URL, False
xml.Send
set oStream = createobject("Adodb.Stream")
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Const adSaveCreateNotExist = 1
oStream.type = adTypeBinary
oStream.open
oStream.write xml.responseBody
' Do not overwrite an existing file
oStream.savetofile DestFolder & ImageFile, adSaveCreateNotExist
' Use this form to overwrite a file if it already exists
' oStream.savetofile DestFolder & ImageFile, adSaveCreateOverWrite
oStream.close
set oStream = nothing
Set xml = Nothing
'MsgBox DestFolder + songName + ".mp3", 64 ,"הורדת שיר הסתיימה"
returnValue = MsgBox (" הורדת השיר " & Vbcrlf & songName + ".mp3" & Vbcrlf & "הסתיימה לספרייה " & Vbcrlf & DestFolder & Vbcrlf & Vbcrlf & "?האם תרצה לפתוח את תיקייה", 4 ,"שאלה")
If returnValue = 6 Then
Set Sh = CreateObject("WSCript.Shell")
Sh.Run DIR
End If
End If
יום שני, 11 באוקטובר 2010
יצירת User Control ושימוש ב-delegate
1) ניצור תוכנית רגילה Windows Application, ניתן שם לטופס ברירת המחדל: mainFrm.cs
2) לחיצה ימנית על solution, ואז add → new project → Windows Control Library
ייווצר User Control, נבחר ונשנה לו את השם – לדוגמה WCL, נוסיף לחצנים, תיבות וכדומה.
ייווצר User Control, נבחר ונשנה לו את השם – לדוגמה WCL, נוסיף לחצנים, תיבות וכדומה.
3) כעת ניתן להוסיף את הפרויקט WCL ב-reference של הטופס הראשי,
אך כדי שיופיע גם ב-Toolbox נעשה build לפחות ל-WCL.
אך כדי שיופיע גם ב-Toolbox נעשה build לפחות ל-WCL.
4) לחיצה ימנית על reference שנמצא בבלוק של הטופס הראשי, נבחר Add Reference….
נוסיף את ההפניה לפרויקט שיצרנו בלשונית Projects או נבחר קובץ dll חיצוני בלשונית Browse
5) UserControl שיצרנו אמור להופיע ב-Toolbox.
אם לא, נוסיף אותו ע"י לחיצה ימנית ← Choose Items ← לשונית Net Framework ←נלחץ Browse
ונבחר בקובץ ה-dll שנמצא בפרויקט, בדרך כלל ב- ProjectName/SolutionName/bin/debug
או במקרה שלנו: UcApp/UcApp/bin/debug
אם לא, נוסיף אותו ע"י לחיצה ימנית ← Choose Items ← לשונית Net Framework ←נלחץ Browse
ונבחר בקובץ ה-dll שנמצא בפרויקט, בדרך כלל ב- ProjectName/SolutionName/bin/debug
או במקרה שלנו: UcApp/UcApp/bin/debug
עד כאן יצרנו UserControl והוספנו אותו לטופס הראשי בתור פקד.
כדי ליצור תקשורת בין אותו פקד לטופס הראשי נשתמש ב-delegate :
כדי ליצור תקשורת בין אותו פקד לטופס הראשי נשתמש ב-delegate :
(את הקוד הבא נוסיף בתוך ה-UserControl)
public delegate void mydelegate(string s);
public event mydelegate strsent;
public virtual void onSendString(string s)
{
strsent(s);
}
נלך לטופס הראשי, נבחר ב-WCL שמיקמנו בטופס, נבחר ב-Properties ואז נבחר בצורת הברק כדי להיכנס להגדרת 'Events' ונמצא את השם שהגדרנו ל-Event שיצרנו - כלומר strsent .
נלחץ לחיצה כפולה ובתוכו נגדיר אילו פעולות יתבצעו על המחרוזת שנקבל בהתרחש האירוע. למשל:
(הקוד הבא נמצא בטופס הראשי)
private void userControl11_strsent(string s)
{
MessageBox.Show(s);
}
עד כאן הגדרנו לטופס הראשי שבהתקבל מחרוזת מתוך הפקד WCL שהגדרנו, אזי תוקפץ הודעה עם המחרוזת.
כעת עלינו לקשר בין הכפתור שנמצא ב-WCL לבין שליחת המחרוזת:
(הקוד הבא נמצא ב-UserControl)
private void button1_Click(object sender, EventArgs e)
{
onSendString(textBox1.Text);
// strsent(textBox1.Text);
}
כפי שניתן לראות סימנתי בירוק את האפשרות השנייה להגדיר את שליחת המחרוזת, אולם נהוג להשתמש בדרך שכתובה קודם.
ניתן להוריד את ההסבר כולו להדפסה בתמונה:
תוויות:
תכנות - כללי,
תכנות #C
ProcessDir - פונקציה רקורסיבית לסריקת תיקיות
//define at the program head
int HowDeepToScan = 3; //how deep the algo should enter:string file_ext = ".exe"; //the file extension
List<string> fName_list = new List<string>(); //save the file list in this 'List<string>'
public void ProcessDir(string sourceDir, int recursionLvl)
{
if (recursionLvl <= HowDeepToScan)
{
// Process the list of files found in the directory.
string[] fileEntries = Directory.GetFiles(sourceDir);
foreach (string fileName in fileEntries)
{
// do something with fileName
if (fileName.ToLower().Contains(file_ext))
fName_list.Add(fileName);
}
// Recurse into subdirectories of this directory.
string[] subdirEntries = Directory.GetDirectories(sourceDir);
foreach (string subdir in subdirEntries)
{
// Do not iterate through reparse points
if ((File.GetAttributes(subdir) &
FileAttributes.ReparsePoint) !=
FileAttributes.ReparsePoint)
//than, recurs:
ProcessDir(subdir, recursionLvl + 1);
}
}
}
הפונקציה הזאת מקבלת שם תיקיה ראשית ומספר המציין את עומק הכניסה של האלגוריתם אל תוך תיקיות המשנה, ומבצעת פעולה כלשהיא בתוך תיקיות המשנה.
קריאה לפונקציה תהיה למשל:
ProcessDir("c:\\", 1);
בקוד המוצג למעלה הדגמתי ריצה על קבצים exe
במקרה ששם הקובץ מכיל (מסתיים) עם סיומת .exe
אז תוסיף אותו לרשימה המכילה את שמות הקבצים.
תוויות:
תכנות - כללי,
תכנות #C
Drag -n- Drop - 'זריקת' קבצים אל תיבת רשימה (listbox) או תיבת טקסט
קובץ דוגמא:
https://sites.google.com/site/elsnir/Home/dragDrop.Example.zip
אפשרות 'זריקת' קבצים על תיבת טקסט, על ListBox , על טופס כללי או על פקדים אחרים יכולה להיות שימושית.
כאן נראה כיצד עושים זאת.
ראשית עלינו לבחור control-פקד שיכול לשמש אותנו. דוגמא ראשונה תהיה ListBox.
בחלונית צד Properties נשנה את אפשרות AllowDrop ל-True.
נלחץ על ה'ברק' בראש החלונית כדי לעבור להגדרת Events ונבחר באפשרויות DragEnter, DragDrop.
נגדיר אותן כך:
private void listBox1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
{
e.Effect = DragDropEffects.Copy; //.All;
}
}
private void listBox1_DragDrop(object sender, DragEventArgs e)
{
foreach (string fileName in
{
if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
{
e.Effect = DragDropEffects.Copy; //.All;
}
}
private void listBox1_DragDrop(object sender, DragEventArgs e)
{
foreach (string fileName in
(string[])e.Data.GetData(DataFormats.FileDrop))
{
listBox1.Items.Add(fileName);
}
}
{
listBox1.Items.Add(fileName);
}
}
עבור TextBox - תיבת טקסט נשנה רק את האירוע השני, DragDrop:
private void textBox1_DragDrop(object sender, DragEventArgs e)
{
textBox1.Text =
((string[])e.Data.GetData(DataFormats.FileDrop))[0];
}
נשים לב לחלקים שהדגשתי:
נקבל את המידע מאירוע ה'זריקה' של הקבצים על הטופס בתור מערך של שמות הקבצים.
כיוון שכאן מתבצעת הזריקה על תיבת טקסט פשוטה היכולה להכיל שם קובץ אחד בלבד נבחר באיבר הראשון [0] שיש במערך.
ניתן כמובן להגדיר תיבת טקסט בעלת אפשרות שורות מרובות Multiline ולשנות את הקוד כך שתיבת הטקסט תקבל את כל שמות הקבצים הנזרקים עליה, עם הפרדה של רווחים בין השמות.
}
תוויות:
תכנות - כללי,
תכנות #C
קבע את האייקון של התוכנה
- הוסף אייקון כלשהו לפרויקט .
בחלונית-צד Properties של האייקון, שנה את Build Action
(בשורה הראשונה)
ובחר ב- Embedded Resource ('מקור' משובץ) -
כלומר, כאן בחרנו שהאייקון יצורף לתוכנית בזמן העיבוד.
- קביעת האייקון של החלונית עצמה תיעשה ע"י
פתיחת המאפיינים (Properties) של החלונית עצמה בתצוגת עיצוב
ובחירת סמל באפשרות Icon.
לחלופין, ניתן לעשות זאת ע"י הקוד:
this.Icon = Properties.Resources.my_icon;
או ע"י:
this.Icon = global::myprogram_namespace.Properties.Resources.my_icon;
- עבור בחירת הסמל של קובץ התוכנה,
בחר ב-Properties עבור הפוריקט עצמו (ע"י לחיצה ימנית)
בלשונית הראשונה (Application) בשורה הלפני-אחרונה תהיה אפשרות Icon and manifest.
עבור אפשרות-משנית Icon תוכל לבחור בין האייקונים שכבר הוספת לתוכנית בתור Resource.
זכור כי במקרה והוגדר notifyIcon לתוכנית (כלומר-אייקון שיופיע בשורת המערכת לאחר מזעור התוכנית) אזי האייקון שיוצג בשורת המערכת יהיה שונה.
תוויות:
תכנות - כללי,
תכנות #C
העלמת אייקונים משולחן העבודה - #C
בעבר הרחוק מצאתי (nאוד נוח) אפליקציה קטנה שבמקרה שהעכבר לא נמצא מעל שולחן העבודה מעלימה את כל האייקונים, ומחזירה אותם כאשר העכבר חוזר להיות מעל שולחן העבודה.
http://www.donationcoder.com/Software/Skrommel/index.html#HideDesktop
לאחר שוטטות קצרה בפורומים של MSDN מצאתי שהעלמת/החזרת האייקונים יכולה להיעשות בשפת #C (או ב-NET. בכלל) בעזרת שימוש ב-DLL של מערכת ההפעלה.
ראשית יש להשתמש בספרייה:
using System.Runtime.InteropServices;
ולהוסיף את הקוד -[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent,
static extern IntPtr FindWindowEx(IntPtr hwndParent,
IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
private void checkBox1_CheckedChanged
(object sender, EventArgs e)
(object sender, EventArgs e)
{
IntPtr hWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero,
"Progman", null);
"Progman", null);
if (checkBox1.Checked)
ShowWindow(hWnd, 0);
else
ShowWindow(hWnd, 5);
}
עם זאת, ידוע שהאפשרות קיימת ידנית ע"י תפריט-לחצן-ימני על שולחן העבודה, אבל אני רוצה שהפעולה תהיה אוטומטית, ובכך להחליף את התוכנה של skrommel
http://www.donationcoder.com/Software/Skrommel/index.html#HideDesktop
כפי שאפשר לראות הקוד מיושם ע"י תיבת סימון (CheckBox).
אפשר לשנות את האפשרות מתיבת סימון ללחצן, או כל פקד אחר,
או להגדיר טיימר עבור כמות הזמן שהעכבר נמצא מעל שולחן העבודה למשל, וכו'.
שימו לב - הקוד לא עובד ב-Win7.
זאת היא עוד אחת מהסיבות שאני מצטער ששדרגתי את vista, אבל אני מקווה שאחד מהאנשים של מיקרוסופט (שראיתי בפורום) יחזור אלי עם תשובה, או שאחפש עוד קצת ואמצא איך.
אפשר לשנות את האפשרות מתיבת סימון ללחצן, או כל פקד אחר,
או להגדיר טיימר עבור כמות הזמן שהעכבר נמצא מעל שולחן העבודה למשל, וכו'.
שימו לב - הקוד לא עובד ב-Win7.
זאת היא עוד אחת מהסיבות שאני מצטער ששדרגתי את vista, אבל אני מקווה שאחד מהאנשים של מיקרוסופט (שראיתי בפורום) יחזור אלי עם תשובה, או שאחפש עוד קצת ואמצא איך.
עם זאת, ידוע שהאפשרות קיימת ידנית ע"י תפריט-לחצן-ימני על שולחן העבודה, אבל אני רוצה שהפעולה תהיה אוטומטית, ובכך להחליף את התוכנה של skrommel
http://www.donationcoder.com/Software/Skrommel/index.html#HideDesktop
תוויות:
תכנות - כללי,
תכנות #C
יצירת תוכנת מייל C# - mail client
נתייחס לג'ימייל, אך השימוש נכון גם לכל שרת מייל אחר.
מיקמתי את הקוד המלא כאן:
לאחר שיצרנו את הטופס-ממשק משתמש כפי שרצינו, נלחץ פעמיים על כפתור 'שלח' כדי להגיע לקוד של הטופס.
ראשית, נוסיף בראש הדף התייחסויות שימוש במחלקות של רשת ומייל:
using System.Net;
using System.Net.Mail;
את הקוד כדאי לתחום בתוך try..catch, כדי למנוע נפילות של התוכנית במקרה פשוט, למשל- מקרה של חוסר חיבור לאינטרנט. using System.Net.Mail;
כעת אציג את כל הקוד של הפעולה הבסיסית של לחיצה על 'שלח':
MailMessage msg = new MailMessage();
SmtpClient myServer = new SmtpClient("smtp.gmail.com", 587);
myServer.EnableSsl = true; // SSL ג'ימייל דורש
SmtpServer.Credentials = new NetworkCredential("user@gmail.com", "password");
msg.From = new MailAddress(txtb_from.Text, txt_name.Text, System.Text.Encoding.UTF8);
נשים לב, כי ג'ימייל דורש חיבור SSL. מעבר לכך הגדרנו את הקידוד של הדף ל-UTF8 כדי שיישלח בעברית קריאה.
לשם הוספת כתובות רבות לשליחה אליהן, נשתמש בטריק. נקבע שהכתובות יופרדו בפסיקים (,), ונחלק את המחרוזת. ()Trim מסיר רווחים מיותרים:
String[] adresses = txtb_to.Text.Split(',');
for (int i = 0; i < adresses.Length; i++)
msg.To.Add(new MailAddress(adresses[i].Trim() ) );
נמשיך בהוספת נושא מייל, ואת גוף המייל:
msg.Subject = txtBox_Subject.Text;
msg.Body = richTextBox.Text;
msg.ReplyTo = new MailAddress(txtb_From.Text);
msg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
msg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
SmtpServer.Send(msg);
msg.ReplyTo = new MailAddress(txtb_From.Text);
msg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
msg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
SmtpServer.Send(msg);
כדאי להוסיף לסוף הקוד חיווי שנדע שהמייל נשלח בהצלחה:
MessageBox.Show("מייל נשלח בהצלחה");
וכמו כן להוסיף חיווי על כשלון בשליחה, בתוך catch:
catch (System.Exception ex)
{
MessageBox.Show("שגיאה - \n" + ex.Message);
}
{
MessageBox.Show("שגיאה - \n" + ex.Message);
}
הקוד המלא:
private void btn_Send_Click(object sender, EventArgs e) {
try
{ MailMessage msg = new MailMessage(); SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com", 587); SmtpServer.EnableSsl = true;
SmtpServer.Credentials = new NetworkCredential(
txtb_Account.Text.Trim().ToString(),
txtb_Password.Text.Trim().ToString()); msg.From = new MailAddress(
txtb_From.Text.Trim(), txtb_Name.Text,
System.Text.Encoding.UTF8); String[] adresses = txtb_To.Text.Split(','); for (int i = 0; i < adresses.Length; i++) msg.To.Add(new MailAddress(adresses[i].Trim())); msg.Subject = txtb_Subject.Text; msg.Body = richTextBox1.Text; msg.ReplyTo = new MailAddress(txtb_From.Text.Trim()); msg.DeliveryNotificationOptions =
DeliveryNotificationOptions.OnFailure; msg.DeliveryNotificationOptions =
DeliveryNotificationOptions.OnSuccess; SmtpServer.Send(msg); } catch (System.Exception ex) { MessageBox.Show("error - " + ex.Message); } }
כדי להתחבר לחשבון גימייל עם תוכנה פשוטה צריך קודם כל לאפשר "גישה לאפליקציות ברמת אבטחה נמוכה" בג'ימייל, אחרת נקבל תשובה ששם המשתמש או הסיסמה אינן נכונים.
אבל,
כדי לשמור על אבטחת החשבון, החל מתאריך 30 במאי 2022 תפסיק Google לתמוך באפליקציות או במכשירים של צד שלישי שבהם אפשר להיכנס לחשבון Google באמצעות הזנה של שם המשתמש והסיסמה בלבד.
כלומר כדי לכתוב תוכנת מייל עם ג'ימייל יהיה צורך לעבוד עם google api.
עד אז... אפשר להשתמש בקוד הבא.
protected void ReadMail(string address, string password, string server = "pop.gmail.com") { // create an instance of TcpClient TcpClient tcpclient = new TcpClient(); tcpclient.Connect(server, 995); System.Net.Security.SslStream sslstream = new SslStream(tcpclient.GetStream()); sslstream.AuthenticateAsClient(server);
StreamWriter sw = new StreamWriter(sslstream); System.IO.StreamReader reader = new StreamReader(sslstream); sw.WriteLine("USER " + address); sw.Flush(); sw.WriteLine("PASS " + password); sw.Flush(); sw.WriteLine("RETR 1"); sw.Flush(); sw.WriteLine("Quit "); sw.Flush();
string str = string.Empty; string strTemp = string.Empty; int max_emails = 20;
while ((strTemp = reader.ReadLine()) != null || max_emails >= 0) { if (".".Equals(strTemp)) { break; } if (strTemp.IndexOf("-ERR") != -1) { textBox1.Text += strTemp; break; } textBox1.Text += strTemp + Environment.NewLine; listView1.Items.Add(str); max_emails--; if (max_emails <= 0) break; }
//Console.Write(str); reader.Close(); sw.Close(); tcpclient.Close(); // close the connection }
מידע על משמעות מילות הקוד של שליחת/קבלת מייל:
https://www.codeproject.com/Articles/14304/POP3-Email-Client-NET-2-0
תוויות:
תכנות - כללי,
תכנות #C
הירשם ל-
רשומות (Atom)