יום שלישי, 29 ביולי 2014

יצירת סניפט [קטע קוד לכתיבה מהירה] של תנאי if עם תיבת MessageBox

כמו שהסברתי יש אפשרות לשימוש בקטעי קוד מהירים בויזואל סטודיו -
אפשר לקרוא הסבר שלי כאן
---
כאן אציג דרך לכתיבה מהירה של תנאי if עם תיבת שאלה (MessageBox)
כתיבה של imbox ולחיצה כפולה על Tab תוסיף את:
if (MessageBox.Show("Do Tou Want To Exit?"
                                   "Very Very Important Question"
                                   MessageBoxButtons.YesNo) == DialogResult.Yes)
{
     this.Close();
 }
ניתן לקפוץ בין הקטעים המודגשים בצהוב ע"י Tab.
הנה קטע הקוד שכתבתי - יש לשמור אותו בסיומת snippet:

יצירת סניפט-קטע קוד ליצירה מהירה של פונקציה

ישנה אפשרות שימוש בקטעי קוד מוכנים - סניפטס (snippets) בויזואל סטודיו,
אפשרות נוחה מאוד לקיצור תהליכי כתיבה.
כאן אציג סניפט שכתבתי ליצירה מהירה של מתודה (פונקציה).
אבל קודם כל אסביר כיצד מוסיפים סניפט - יש להכנס לתפריט:
 TOOLS > Code Snippets Manager... >
ושם לבחור ב- Import. 
לאחר בחירת בקטע הקוד יש לבחור באיזו תיקיה נרצה למקם אותו.

הנה קטע הקוד שכתבתי - יש לשמור אותו בקובץ עם סיומת snippet.

יום שני, 7 ביולי 2014

השוואת קבצים בויזואל סטודיו בעזרת WinMerge


בעבודה עם ויזואל סטודיו ניתן לעשות השוואה בין גרסאות שונות של קבצים עליהם אנחנו עובדים.
ההשוואה נעשית ע"י כלי שמושלב אוטומטית עם ויזואל סטודיו 2008, 2010, 2012, 2013.
במהלך העבודה שלי נתקלתי בבאג שמנע את האפשרות להשוואה בעזרת כלי זה, ועל ידי כך פגשתי באפשרות השוואה בעזרת כלי מוכר אחר - WinMerge.
כדי לשלב את ההשוואה בתוך ויזואל סטודיו באופן אוטומטי יש לבצע את הצעדים הבאים:

יום שני, 2 ביוני 2014

Streams-and-IO-in-winrt

Streams and I/O
כאן אסביר שיטות עבודה עם קבצים ועם Stream (זרם של נתונים) בתכנות win-RT (תכנות Win8)

המרת משתנים ב-c#-win8

Index:
-   String to byte[]
-   Byte[] to string

-   Covert File to Byte Array
-   Save A File
-   bytes[] to filestream
    
-   Get thumbnail from video / image
-   ImageSource To BitmapImage
-   Byte[] to bitmap
-   Byte[] to Stream
-   stream to byte[]

-    stream to IrandomAccessStream
-    IRandomAccessStream to stream
-   Buffer to stream
-   stream to buffer
-   Byte[] to InMemoryRandomAccessStream or IRandomAccessStream
-   Conversion between IRandomAccessStream and FileInputStream/FileOutputStream
-   Byte[] to InMemoryRandomAccessStream or IRandomAccessStream
-   Write a file using StreamWriter
    
-   Path to StorageFile
-   Get file to storageFile
-   Get a file from media folder to a StorageFile var
-   Storagefile to string
-   byte[] to storagefile
-   StorageFile to Byte[]
-   Storagefile to IRandomAccessStream , to ImageSource (bitmap)
    
-   IRandomAccessStream to byte[]

-   Binary To String To Binary

יום שישי, 9 באוגוסט 2013

צפיה ביוטיוב במסך מלא

Youtube Fullscreen

כיצד לצפות בסרטון יוטיוב על מסך מלא -
נניח וזאת היא כתובת יוטיוב:

1. החליפו את הקטע watch?v= באות V

2. או החליפו את הקטע המדובר במילה embed
http://www.youtube.com/embed/kIQui6cKVjk

3. או הוסיפו את המילה popup
http://www.youtube.com/watch_popup?v=kIQui6cKVjk

שתי האפשרויות האחרונות גם מתירות צפיה בוידאו שמוגדרים בתור adult only
(למבוגרים בלבד)

יום שישי, 17 בפברואר 2012

רקע תוכנה בצבעים משולבים - Gradient


כדי לצבוע את רקע החלונית (או הפקד-Control) בשני צבעים משולבים
יש ליצור אירוע Paint של הטופס או הפקד, ולהוסיף לתוכו את הקוד הבא.
אפשר לשחק עם המספרים של הצבעים:

עיקול הפינות של הטופס או של פקד אחר

נעשה ע"י:


// 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 - מחליפה את מקור הנתונים ומציגה טבלה אחרת עם עמודות אחרות.

יום שישי, 1 ביולי 2011

קריאת פרמטרים משורת הפקודה

כאן נסביר כיצד לקרוא פרמטרים משורת הפקודה, כך שלמשל נוכל להתחיל תוכנה -
  c:\> myprogram minimize                  
קבענו שהפרמטר minimize שממוקם אחרי שם התוכנה, יתחיל את התוכנה ממוזערת.

ראשית אנו צריכים שפעולת בדיקה זאת תופעל מיד בעליית התוכנה, כך שנלחץ פעמיים על השורה העליונה של הטופס,כך ייוצר 'אירוע' - event : האירוע יבדוק אילו פרמטרים נשלחו:
private void Form1_Load(object sender, EventArgs e)
{
      string[] args = Environment.GetCommandLineArgs();
}

יש ליצור לולאה שתבדוק מהם הפרמטרים ותייחד לכל פרמטר פעולה משלו.

יום שני, 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 למינימום.
כעת ניתן יהיה לקרוא וגם לכתוב לרגיסטרי



יום שני, 20 ביוני 2011

מניעת הרצת תוכנה ביותר מעותק אחד

ע"י חיפוש בין כל ה-Proccess שרצים במערכת נדע אם התוכנה כבר רצה
וכך נמנע מלהריץ אותה שוב -

הסרת ניקוד מטקסט


להלן קוד לקבלת מחרוזת תווים והסרת הניקוד ממחרוזת זו:

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();


שימוש בקוד זה נעשה למטרת עבודה עם טקסטים מנוקדים.
הרבה פעולות לא יכולות להיעשות על טקסט מנוקד, והפונקציה הנ"ל מסירה ניקוד ומאפשרת עבודה עם הטקסט.

יום שני, 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);
    }
}

יום רביעי, 13 באפריל 2011

(ASP) מיקום ושימוש ב-connectionString מתוך web.config

כאשר ניגשים לבסיס נתונים מתוך דף ASP, יש צורך להתקשר אליו עם connectionString.
כדאי שהמחרוזת הזאת תהיה מוגדרת במקום אחד בלבד, כל עמוד ייגש אליה ויקבל אותה משם, ואם נרצה לשנות יהיה עלינו לשנות רק במקום אחד:


קודם כל, בתוך web.config אפשר אולי למצוא תג של: </connectionStrings> ולהחליף אותו בזה, אם לא אז פשוט למקם חדש:
<connectionStrings>
    <add
    name="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

יום שלישי, 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 לריצה של תוכנית עם אתחול המערכת

תוספים מומלצים ל-WindowsXP


יום חמישי, 17 בפברואר 2011

מניעת סגירת טופס בלחיצה על X

ישנם מקרים בהם רוצים שבלחיצה על X הסגירה של התוכנית
התוכנה לא תיסגר אלא תמזער למשל לשורת המשימות של ווינדוס.

לשם כך יש להוסיף את הקוד הבא לתוכנית:

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

את כל זה הקוד עושה בעזרת משתנה בוליאני (אמת-שקר) בשם formClose 
איתו אפשר לקבוע לפני הסגירה של התוכנית אם היא אכן תיסגר או לא.
למשל, אם נרצה ונוסיף כפתור שאכן סוגר את התוכנה, אז נצטרך לכתוב לו:
formClose = true;
this.Close();

יום שלישי, 25 בינואר 2011

יצירת נקודת שיחזור בלחיצה - VB-script

קוד VB script עבור יצירת נקודת שחזור לווינדוס בלחיצה.
יש ליצור קובץ RestorePoint.vbs (או כל שם אחר במקום RestorePoint) ולהעתיק לתוכו את הכתוב כאן:

RestorePointName = inputBox("הכנס שם לנקודת השחזור")

If Len(RestorePointName)>0 Then
Set IRP = getobject("winmgmts:\\.\root\default:Systemrestore")
MYRP = IRP.createrestorepoint (RestorePointName, 0, 100)
msgBox ": נוצרה נקודת שחזור בשם" + vbCrLf + RestorePointName
End If

יום שישי, 12 בנובמבר 2010

קריאת קוד של דף או קובץ כלשהו באינטרנט, וכתיבה של קובץ במחשב

קריאת קוד של דף או קובץ כלשהו באינטרנט:
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;
}
ע"י StreamReader מבצעים גם קריאה של קובץ מהמחשב המקומי.

כתיבת תוכן של תיבת טקסט אל תוך קובץ והרצה של הקובץ:
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); }

יום חמישי, 4 בנובמבר 2010

הורדת קבצים (Download) ע"י VB script

VB script
לבקשתו של אבא שלי, כתבתי סקריפט להורדת קבצים מאתר שירים - 'פיוט'.
צבעתי באדום את החלקים שאפשר לשנות, בכחול את שם המשתנים.
את הסקריפט יש למקם בקובץ עם סיומת 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, ואז addnew project → Windows Control Library
    ייווצר
User Control, נבחר ונשנה לו את השם – לדוגמה WCL, נוסיף לחצנים, תיבות וכדומה.

3) כעת ניתן להוסיף את הפרויקט WCL ב-reference של הטופס הראשי,
    אך כדי שיופיע גם ב-
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




שימוש ב-delegate
עד כאן יצרנו UserControl והוספנו אותו לטופס הראשי בתור פקד.


כדי ליצור תקשורת בין אותו פקד לטופס הראשי נשתמש ב-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 senderEventArgs e)
{
            onSendString(textBox1.Text);
           // strsent(textBox1.Text);
}


כפי שניתן לראות סימנתי בירוק את האפשרות השנייה להגדיר את שליחת המחרוזת, אולם נהוג להשתמש בדרך שכתובה קודם.


ניתן להוריד את ההסבר כולו להדפסה בתמונה:




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
אז תוסיף אותו לרשימה המכילה את שמות הקבצים.



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 
           (string[])e.Data.GetData(DataFormats.FileDrop))
   {
      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 ולשנות את הקוד כך שתיבת הטקסט תקבל את כל שמות הקבצים הנזרקים עליה, עם הפרדה של רווחים בין השמות.
}




קבע את האייקון של התוכנה


 - הוסף אייקון כלשהו לפרויקט .
    בחלונית-צד 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 לתוכנית (כלומר-אייקון שיופיע בשורת המערכת לאחר מזעור התוכנית) אזי האייקון שיוצג בשורת המערכת יהיה שונה.