Saturday, March 12, 2016

C# windows formada sodda Drag & Drop. 3- versiya

Windows Formada dizaynda ishlash murakkab. Drag&Drop  - dasturga o`zgacha ko`rinish beradi va bu ajoyib imkoniyat ham. Uning tayyor kodini olib ishlatish esa undanda ko`proq zavq-shavq beradi :-) 

Oldingi versiyada aytilganidek biror paneldan boshqasiga ko`chirib o`tkazilganini tutib qolinadi va unga Action bajartiriladi. DragDropContainerdan TaskList yasashda foydalanish mumkin bo`ldi.
Shuningdek har bir panel tepasiga sarlavha ko`rinishida soha nomini yozib qo`yish mumkin, hamda sohalarga border rangini ham tanlash mumkin bo`ldi.






using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Threading;
using System.Windows.Forms;

namespace Library.Controls
{
    public class DragDropContainer : Control
    {
        private readonly Panel _content = new Panel
        {
            Dock = DockStyle.Fill,
            Padding = new Padding(0)
        };

        private readonly Panel _header = new Panel
        {
            Padding = new Padding(0),
            Height = 20,
            Dock = DockStyle.Top
        };

        private Action _action;
        private bool _mouseDown;
        private string _oldPosition;
        private Point _point = new Point(0, 0);

        public DragDropContainer()
        {
            Controls.Add(_header);
            Controls.Add(_content);
            _content.BringToFront();
        }

        public int ColumnCount { get; set; }
        public Color BorderColor { get; set; } = Color.FromArgb(202, 210, 214);
        public IEnumerable> Child => _content.Controls.OfType().Select(x => x.Child);
        public IEnumerable
        public IEnumerable Panels => _content.Controls.OfType();

        protected override void InitLayout()
        {
            base.InitLayout();

            for (var i = 0; i < ColumnCount; i++)
            {
                var panel = new DragDropPanel
                {
                    Name = "" + i,
                    Width = Width/ColumnCount,
                    Dock = DockStyle.Right,
                    Padding = new Padding(5)
                };
                var label = new Label
                {
                    AutoSize = false,
                    Width = panel.Width,
                    Padding = new Padding(0),
                    Dock = DockStyle.Right,
                    Name = "" + i,
                    TextAlign = ContentAlignment.MiddleCenter
                };
                _content.Controls.Add(panel);
                _header.Controls.Add(label);

                PaintEventHandler paintAction =
                    (sender, args) => ControlPaint.DrawBorder(args.Graphics, (sender as Control).ClientRectangle,
                        BorderColor, ButtonBorderStyle.Solid);
                label.Paint += paintAction;
                panel.Paint += paintAction;
            }
            SizeChanged +=
                (o, args) =>
                {
                    _content.Controls.OfType().ToList().ForEach(x => { x.Width = Width/ColumnCount; });
                    _header.Controls.OfType
                };
        }

        public void Add(Control control, int? position = null)
        {
            var panels = _content.Controls.OfType().ToArray();
            if (panels.Length < 1)
            {
                InitLayout();
                panels = _content.Controls.OfType().ToArray();
            }
            var dragDropPanel = position.HasValue
                ? panels[position.Value]
                : panels.FirstOrDefault(x => x.Controls.Count == panels.Min(t => t.Controls.Count));

            dragDropPanel?.AddControl(control, (sender, args) =>
            {
                //mouseDown
                var panel = control.Parent;
                panel.Cursor = Cursors.NoMove2D;
                _mouseDown = true;
                _point = args.Location;
                panel.Dock = DockStyle.None;
                panel.BringToFront();
                _oldPosition = panel.Parent.Name;
            }, (sender, args) =>
            {
                //mouseUp
                var panel = control.Parent;
                panel.Cursor = DefaultCursor;
                panel.Dock = DockStyle.Top;
                _mouseDown = false;
                panel.BringToFront();
                if (panel.Parent.Name != _oldPosition)
                {
                    var newIndex = int.Parse(dragDropPanel.Name);
                    _action?.Invoke(newIndex, control);
                }
            }, (sender, args) =>
            {
                //mouseMove
                var panel = control.Parent;
                if (true.Equals(_mouseDown))
                {
                    panel.Location = new Point(panel.Location.X + args.X - _point.X,
                        panel.Location.Y + args.Y - _point.Y);

                    // next dragdroppanel
                    if (panel.Location.X + args.X > panel.Parent.Width)
                    {
                        var location = new Point(panel.Location.X - dragDropPanel.Width, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (_content.Controls.Count > panelIndex + 1)
                        {
                            dragDropPanel = _content.Controls[panelIndex + 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                                panel.BringToFront();
                            }
                        }
                    }
                    // previous dragdroppanel
                    else if (panel.Location.X + args.X < 0)
                    {
                        var location = new Point(dragDropPanel.Width + panel.Location.X, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (_content.Controls.Count > panelIndex - 1 && panelIndex > 0)
                        {
                            dragDropPanel = _content.Controls[panelIndex - 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                                panel.BringToFront();
                            }
                        }
                    }
                }
            });
        }

        public void Reset()
        {
            _header.Controls.OfType().ToList().ForEach(x => x.Dispose());
            _content.Controls.OfType().ToList().ForEach(x => x.Dispose());
            _header.Controls.Clear();
            _content.Controls.Clear();
        }

        public void SetHandler(Action action)
        {
            _action = action;
        }
    }

    [ToolboxItem(false)]
    internal class DragDropPanel : Panel
    {
        public IEnumerable Child => Controls.OfType().
            Select(x => x.Controls.OfType().FirstOrDefault(t => t.Dock != DockStyle.Left));

        public void AddControl(Control control,
            MouseEventHandler mouseDown, MouseEventHandler mouseUp, MouseEventHandler mouseMove)
        {
            new Thread(() => Invoke(new EventHandler((sender, args) =>
            {
                var panel = new Panel
                {
                    Size = new Size(Width, control.Height),
                    Dock = DockStyle.Top
                };
                var header = new Panel
                {
                    Dock = DockStyle.Left,
                    Width = 12,
                    BackgroundImage = Resources.arrow_move,
                    BackgroundImageLayout = ImageLayout.Zoom
                };
                Controls.Add(panel);
                panel.Controls.Add(header);
                panel.Controls.Add(control);

                control.Dock = DockStyle.Fill;
                control.BringToFront();
                panel.BringToFront();

                header.MouseDown += mouseDown;
                header.MouseUp += mouseUp;
                header.MouseMove += mouseMove;
            })))
            {IsBackground = true}.Start();
        }

        protected override void InitLayout()
        {
            base.InitLayout();
            AutoScroll = true;
        }
    }
}



Foydalanish

dragDropContainer1.ColumnCount = 5;
var linkLabel = new LinkLabel
                {
                    Name ="test1",
                    Text = "Ism Familiya"
                };
dragDropContainer1.Add(linkLabel, 1);
dragDropContainer1.Headers.FirstOrDefault().Text = "1-soha";
dragDropContainer1.Headers.ToArray()[2].Text = "2- soha";
dragDropContainer1.SetHandler((i, control) =>
            {
                MessageBox.Show(string.Format("{0},{1}", i, (control as LinkLabel)?.Text));
                var position = dragDropContainer1.Child;
            });

Friday, March 11, 2016

C# windows formada sodda Drag & Drop. 2- versiya

Bu versiyada panellar tartiblandi. Tartib chapdan o`ngga davom etadi.
DragDropContainer ga kiritilgan controllar qaysi o`rinda turgani ham ko`rish mumkin.


Keyingi versiyada har bir harakatni, biror paneldan boshqasiga ko`chirib o`tkazilganini tutib qolamiz va unga Action bajartiramiz. So`ng bu DragDropContainerdan TaskList yasashda foydalanish mumkin bo`ladi.

using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace ControlsLibrary.Controls
{
    public class DragDropContainer : Control
    {
        private bool _mouseDown;
        private Point _point = new Point(0, 0);
        public int ColumnCount { get; set; }
        public IEnumerable> Child => Controls.OfType().Select(x => x.Child);

        protected override void InitLayout()
        {
            base.InitLayout();

            for (var i = 0; i < ColumnCount; i++)
            {
                var panel = new DragDropPanel
                {
                    Name = "" + i,
                    Width = Width / ColumnCount,
                    BorderStyle = BorderStyle.FixedSingle,
                    Dock = DockStyle.Right
                };
                Controls.Add(panel);
            }
            SizeChanged +=
                (o, args) =>
                {
                    Controls.OfType().ToList().ForEach(x => { x.Width = Width / ColumnCount; });
                };
        }

        public void Add(Control control, int? position = null)
        {
            var panels = Controls.OfType().ToArray();
            var dragDropPanel = position.HasValue
                ? panels[position.Value]
                : panels.FirstOrDefault(x => x.Controls.Count == panels.Min(t => t.Controls.Count));

            dragDropPanel?.AddControl(control, (sender, args) =>
            {//mouseDown
                var panel = control.Parent;
                if (args.Y > 10) return;
                panel.Cursor = Cursors.NoMove2D;
                _mouseDown = true;
                _point = args.Location;
                panel.Dock = DockStyle.None;
            }, (sender, args) =>
            {//mouseUp
                var panel = control.Parent;
                panel.Cursor = DefaultCursor;
                panel.Dock = DockStyle.Top;
                _mouseDown = false;
                panel.BringToFront();
            }, (sender, args) =>
            {//mouseMove
                var panel = control.Parent;
                if (true.Equals(_mouseDown))
                {
                    panel.Location = new Point(panel.Location.X + args.X - _point.X,
                        panel.Location.Y + args.Y - _point.Y);

                    // next dragdroppanel
                    if (panel.Location.X + args.X > panel.Parent.Width)
                    {
                        var location = new Point(panel.Location.X - dragDropPanel.Width, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex + 1)
                        {
                            dragDropPanel = Controls[panelIndex + 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                            }
                        }
                    }
                    // previous dragdroppanel
                    else if (panel.Location.X + args.X < 0)
                    {
                        var location = new Point(dragDropPanel.Width + panel.Location.X, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex - 1 && panelIndex > 0)
                        {
                            dragDropPanel = Controls[panelIndex - 1] as DragDropPanel;
                            dragDropPanel?.Controls.Add(panel);
                            panel.Location = location;
                        }
                    }
                }
            });
        }
    }

    public class DragDropPanel : Panel
    {
        public LinkedList Child { get; } = new LinkedList();

        public void AddControl(Control control,
            MouseEventHandler mouseDown, MouseEventHandler mouseUp, MouseEventHandler mouseMove)
        {
            var panel = new Panel
            {
                Size = new Size(Width, control.Height + 10),
                Dock = DockStyle.Top
            };
            var header = new Panel
            {
                Dock = DockStyle.Top,
                BackColor = Color.Aqua,
                Height = 10
            };
            Controls.Add(panel);
            panel.Controls.Add(header);
            panel.Controls.Add(control);

            control.Dock = DockStyle.Fill;
            control.BringToFront();
            panel.BringToFront();

            header.MouseDown += mouseDown;
            header.MouseUp += mouseUp;
            header.MouseMove += mouseMove;

            Child.AddLast(control);
        }
    }
}


Foydalanish:

void Main(){
              var mainForm = new DragDropContainer
                {
                    Dock = DockStyle.Fill,
                    ColumnCount = 5
                };
                panel.Add(mainForm, "Home");
                mainForm.Add(new Button(),2);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                var items = mainForm.Child;
}

Thursday, March 10, 2016

C# windows formada sodda Drag & Drop. 1- versiya

using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace Library.Controls
{
    public partial class DragDropContainer : UserControl
    {
        public DragDropContainer()
        {
            InitializeComponent();
        }

        public int ColumnCount { get; set; }

        private void DragDropContiner_Load(object sender, EventArgs e)
        {
            for (var i = 0; i < ColumnCount; i++)
            {
                var panel = new DragDropPanel
                {
                    Name = "" + i,
                    Width = Width / ColumnCount,
                    BorderStyle = BorderStyle.FixedSingle,
                    Dock = DockStyle.Left
                };
                Controls.Add(panel);
            }
            SizeChanged += (o, args) =>
            {
                Controls.OfType().ToList().ForEach(x =>
                {
                    x.Width = Width / ColumnCount;
                });
            };
        }
        private bool _mouseDown;
        private Point _point = new Point(0, 0);
        private Control _temp;
        public void Add(Control control)
        {
            var panels = Controls.OfType();
            var minControlsCount = panels.Min(x => x.Controls.Count);
            var dragDropPanel = panels.FirstOrDefault(x => x.Controls.Count == minControlsCount);
            var panel = new Panel
            {
                Size = new Size(dragDropPanel.Width, control.Height + 10),
                Dock = DockStyle.Top
            };
            var header = new Panel
            {
                Dock = DockStyle.Top,
                BackColor = Color.Aqua,
                Height = 10
            };
            dragDropPanel.Controls.Add(panel);
            panel.Controls.Add(header);
            panel.Controls.Add(control);

            control.Dock = DockStyle.Fill;
            control.BringToFront();
            panel.BringToFront();

            header.MouseDown += (sender, args) =>
            {
                if (args.Y > 10) return;
                panel.Cursor = Cursors.NoMove2D;
                _mouseDown = true;
                _point = args.Location;
                _temp = panel;
                panel.Dock = DockStyle.None;
            };
            header.MouseUp += (sender, args) =>
            {
                panel.Cursor = DefaultCursor;
                panel.Dock = DockStyle.Top;
                _mouseDown = false;
                _temp = null;
                panel.BringToFront();
            };
            header.MouseMove += (sender, args) =>
            {
                if (true.Equals(_mouseDown))
                {
                    panel.Location = new Point(panel.Location.X + args.X - _point.X,
                        panel.Location.Y + args.Y - _point.Y);
                    if (panel.Location.X + args.X > panel.Parent.Width)
                    {
                        var location = new Point(panel.Location.X - dragDropPanel.Width, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex - 1)
                        {
                            dragDropPanel = Controls[panelIndex - 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                            }
                        }
                    }
                    else if (panel.Location.X + args.X < 0)
                    {
                        var location = new Point(dragDropPanel.Width + panel.Location.X, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex + 1)
                        {
                            dragDropPanel = Controls[panelIndex + 1] as DragDropPanel;
                            dragDropPanel.Controls.Add(panel);
                            panel.Location = location;
                        }
                    }
                }
            };
        }
    }
    public class DragDropPanel : Panel
    {
    }
}

Sunday, July 19, 2015

XML formatdan JSON formatiga o`tkazish (example)

foydalanish:

public static T Get(string body){
       body.XmlToObject();
}
 dasturning kodi
internal static class XmlJsonExt
    {
        public static T Deserialize(this string data)
        {
            return JsonConvert.DeserializeObject(data);
        }
        public static T XmlToObject(this string data)
        {
            return CreateDocument(data).XmlToJson().Deserialize();
        }
        #region Utils
        private static XmlDocument CreateDocument(string body)
        {
            var document = new XmlDocument();
            document.InnerXml = body;
            return document;
        }
        private static string XmlToJson(this XmlDocument xmlDoc)
        {
            var sbJson = new StringBuilder();
            sbJson.Append("{ ");
            XmlToJsoNnode(sbJson, xmlDoc.DocumentElement, true);
            sbJson.Append("}");
            return sbJson.ToString();
        }
        //  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array
        private static void XmlToJsoNnode(StringBuilder sbJson, XmlElement node, bool showNodeName)
        {
            if (showNodeName)
                sbJson.Append("\"" + SafeJson(node.Name) + "\": ");
            sbJson.Append("{");
            // Build a sorted list of key-value pairs
            //  where   key is case-sensitive nodeName
            //          value is an ArrayList of string or XmlElement
            //  so that we know whether the nodeName is an array or not.
            var childNodeNames = new SortedList();
            //  Add in all node attributes
            if (node.Attributes != null)
                foreach (XmlAttribute attr in node.Attributes)
                    StoreChildNode(childNodeNames, attr.Name, attr.InnerText);
            //  Add in all nodes
            foreach (XmlNode cnode in node.ChildNodes)
            {
                if (cnode is XmlText)
                    StoreChildNode(childNodeNames, "value", cnode.InnerText);
                else if (cnode is XmlElement)
                    StoreChildNode(childNodeNames, cnode.Name, cnode);
            }
            // Now output all stored info
            foreach (string childname in childNodeNames.Keys)
            {
                var alChild = (ArrayList) childNodeNames[childname];
                if (alChild.Count == 1)
                    OutputNode(childname, alChild[0], sbJson, true);
                else
                {
                    sbJson.Append(" \"" + SafeJson(childname) + "\": [ ");
                    foreach (var child in alChild)
                        OutputNode(childname, child, sbJson, false);
                    sbJson.Remove(sbJson.Length - 2, 2);
                    sbJson.Append(" ], ");
                }
            }
            sbJson.Remove(sbJson.Length - 2, 2);
            sbJson.Append(" }");
        }
        //  StoreChildNode: Store data associated with each nodeName
        //                  so that we know whether the nodeName is an array or not.
        private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)
        {
            // Pre-process contraction of XmlElement-s
            if (nodeValue is XmlElement)
            {
                // Convert   into "aa":null
                //          xx into "aa":"xx"
                var cnode = (XmlNode) nodeValue;
                if (cnode.Attributes.Count == 0)
                {
                    var children = cnode.ChildNodes;
                    if (children.Count == 0)
                        nodeValue = null;
                    else if (children.Count == 1 && (children[0] is XmlText))
                        nodeValue = ((XmlText) (children[0])).InnerText;
                }
            }
            // Add nodeValue to ArrayList associated with each nodeName
            // If nodeName doesn't exist then add it
            var oValuesAl = childNodeNames[nodeName];
            ArrayList valuesAl;
            if (oValuesAl == null)
            {
                valuesAl = new ArrayList();
                childNodeNames[nodeName] = valuesAl;
            }
            else
                valuesAl = (ArrayList) oValuesAl;
            valuesAl.Add(nodeValue);
        }
        private static void OutputNode(string childname, object alChild, StringBuilder sbJson, bool showNodeName)
        {
            if (alChild == null)
            {
                if (showNodeName)
                    sbJson.Append("\"" + SafeJson(childname) + "\": ");
                sbJson.Append("null");
            }
            else if (alChild is string)
            {
                if (showNodeName)
                    sbJson.Append("\"" + SafeJson(childname) + "\": ");
                var sChild = (string) alChild;
                sChild = sChild.Trim();
                sbJson.Append("\"" + SafeJson(sChild) + "\"");
            }
            else
                XmlToJsoNnode(sbJson, (XmlElement) alChild, showNodeName);
            sbJson.Append(", ");
        }
        // Make a string safe for JSON
        private static string SafeJson(string sIn)
        {
            var sbOut = new StringBuilder(sIn.Length);
            foreach (var ch in sIn)
            {
                if (Char.IsControl(ch) || ch == '\'')
                {
                    int ich = ch;
                    sbOut.Append(@"\u" + ich.ToString("x4"));
                    continue;
                }
                if (ch == '\"' || ch == '\\' || ch == '/')
                {
                    sbOut.Append('\\');
                }
                sbOut.Append(ch);
            }
            return sbOut.ToString();
        }
        #endregion
    }

C# Windows Formsda controllarni asynchrone usulda qo`shish

Odatsa asynchrone usulda controllarni formada joylashtirganda xatolik yuz beradi, ammo bunday qilmasa dastur sekin ishlashi tabiiy(agar katta dastur bo`lsa)

Buning yo`li oson:

Extention yozib olamiz ,

public static class ControlExt
    {
public static void Asynch(this TControl control, Action action)
            where TControl : Control
        {
            if (control.InvokeRequired)
                control.Invoke(action, control);
            else
                action(control);
        }
}

Extentionimiz tayyor, endi istagan yerda asynchrone usulda qo`shaveramiz,

   content.Asynch(delegate (Panel panel)
            {
                panel.Add(new Malumotnoma
                {
                    Name = "malumotnoma",
                    Dock = DockStyle.Fill,
                    EmployeeCode = Code
                }, "Malumotnoma");
            }); 

SQLite ma`lumotlar ba`zasini boshqarish tizimida qo`shimcha funksiya(custom function)lardan foydalanish

   Sqlite da atigi bir nechta funksiya bor, oddiy dasturlar uchun bu yetarli. Lekin murakkabroq so`rovlarni tuzish uchun bu albatta kamlik qiladi. Shu sababli Sqlite o`ziga qo`shimcha funksiya yozib undan keng foydalanishimiz uchun darvozalarini ochib qo`ygan.

   Biz istan tipdagi funksiyani qo`shib, unga maxsus logikani ishlatishimiz mumkin. Bu funksiyalar yacheykalar bo`yicha har bir ustun uchun alohida tepadan pastga qarab ishlaydi.
Aggregate funksiyalar 1 dona natija qaytaradi(masalan: sum, min, max,avg, count,..), Scalar funksiyalar satrlarning soniga teng natija qaytaradi.(length, lower, upper, day, year,...)

Foydalanish tartibi:

1. Yangi funksiyamizni Connection dan ro`yxatdan o`tkazamiz

_connection.BindFunction(new Lower());
2. Yangi funksiya tanasi
using System; using System.Data.SQLite; namespace SQLite.CustomFunction {     [SQLiteFunction(Name = "lower", Arguments = 1, FuncType = FunctionType.Scalar)]     public sealed class Lower : SQLiteFunction     {         public override object Invoke(object[] args)         {             return args.Length > 0 ? (args[0].ToString() ?? "").ToLower() : null;        }     } }
Sqliteda lower funksiyasi bor, ammo u krill harfi uchun ishlamaydi, bizni yangi funksiyamiz  Sqlite ning funksiyasini qayta yuklaydi(override, overload). Esda tuting: Bu so`rov sqlite browserida ishlamaydi, chunki uning kodida bu funksiya yo`q, faqat bizning ulanish usluniimizdagi ro`yxatga olingan dasturimizda ishlaydi

Saturday, June 28, 2014

Sonlarni so`zlarga aylantiradigan kichik va oson dastur


/**
 * Created by Virus on 6/28/2014.
 */
public class Simple {

    public static void main(String[] args) {

        String text = "346836873469720";

        String[] a = {"", "bir", "ikki", "uch", "to`rt", "besh", "olti", "yetti", "sakkiz", "to`qqiz"};
        String[] b = {"", "o`n", "yigirma", "o`ttiz", "qirq", "ellik", "oltmish", "yetmish", "sakson", "to`qson"};
        String[] c = {"", "ming", "million", "milliard", "trillion"};

        StringBuffer buffer = new StringBuffer();

        for (int i = 0; i < text.length(); i++) {

            if ((text.length() - i) % 3 == 0) {

                buffer.append(a[Integer.valueOf(text.substring(i, i + 1))]);
                buffer.append(" yuz ");
            } else if ((text.length() - i) % 3 == 1) {

                buffer.append(a[Integer.valueOf(text.substring(i, i + 1))]);
                buffer.append(" ");
                int h = text.length() / 3 - i / 3 - 1;
                buffer.append(c[h < 0 ? 0 : h]);
                buffer.append(" ");
            } else if ((text.length() - i) % 3 == 2) {

                buffer.append(b[Integer.valueOf(text.substring(i, i + 1))]);
                buffer.append(" ");
            }
        }

        System.out.print(buffer);
    }
}

Saturday, May 3, 2014

C# .NET da Excel ga jadval tuzib unga mos Bar Chart chizish dasturi

using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection; 

Biz pastda Microsoft.Office.Interop.Excel ning o`rniga Excel deb yozib ketamiz(yozuvni qisqartirish maqsadida).

1-qadamda excel jadvaliga ma`lumot yozilgan
private void button1_Click(object sender, System.EventArgs e)
{
 Excel.Application oXL;
 Excel._Workbook oWB;
 Excel._Worksheet oSheet;
 Excel.Range oRng;

 try
 {
  //Start Excel and get Application object.
  oXL = new Excel.Application();
  oXL.Visible = true;

  //Get a new workbook.
  oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
  oSheet = (Excel._Worksheet)oWB.ActiveSheet;

  //Add table headers going cell by cell.
  oSheet.Cells[1, 1] = "First Name";
  oSheet.Cells[1, 2] = "Last Name";
  oSheet.Cells[1, 3] = "Full Name";
  oSheet.Cells[1, 4] = "Salary";

  //Format A1:D1 as bold, vertical alignment = center.
  oSheet.get_Range("A1", "D1").Font.Bold = true;
  oSheet.get_Range("A1", "D1").VerticalAlignment = 
   Excel.XlVAlign.xlVAlignCenter;
  
  // Create an array to multiple values at once.
  string[,] saNames = new string[5,2];
  
  saNames[ 0, 0] = "John";
  saNames[ 0, 1] = "Smith";
  saNames[ 1, 0] = "Tom";
  saNames[ 1, 1] = "Brown";
  saNames[ 2, 0] = "Sue";
  saNames[ 2, 1] = "Thomas";
  saNames[ 3, 0] = "Jane";
  saNames[ 3, 1] = "Jones";
  saNames[ 4, 0] = "Adam";
  saNames[ 4, 1] = "Johnson";

         //Fill A2:B6 with an array of values (First and Last Names).
         oSheet.get_Range("A2", "B6").Value2 = saNames;

  //Fill C2:C6 with a relative formula (=A2 & " " & B2).
  oRng = oSheet.get_Range("C2", "C6");
  oRng.Formula = "=A2 & \" \" & B2";

  //Fill D2:D6 with a formula(=RAND()*100000) and apply format.
  oRng = oSheet.get_Range("D2", "D6");
  oRng.Formula = "=RAND()*100000";
  oRng.NumberFormat = "$0.00";

  //AutoFit columns A:D.
  oRng = oSheet.get_Range("A1", "D1");
  oRng.EntireColumn.AutoFit();

  //Manipulate a variable number of columns for Quarterly Sales Data.
  DisplayQuarterlySales(oSheet);

  //Make sure Excel is visible and give the user control
  //of Microsoft Excel's lifetime.
  oXL.Visible = true;
  oXL.UserControl = true;
 }
 catch( Exception theException ) 
 {
  String errorMessage;
  errorMessage = "Error: ";
  errorMessage = String.Concat( errorMessage, theException.Message );
  errorMessage = String.Concat( errorMessage, " Line: " );
  errorMessage = String.Concat( errorMessage, theException.Source );

  MessageBox.Show( errorMessage, "Error" );
 }
}

2-qadamda esa chart chizilgan

private void DisplayQuarterlySales(Excel._Worksheet oWS)
{
 Excel._Workbook oWB;
 Excel.Series oSeries;
 Excel.Range oResizeRange;
 Excel._Chart oChart;
 String sMsg;
 int iNumQtrs;

 //Determine how many quarters to display data for.
 for( iNumQtrs = 4; iNumQtrs >= 2; iNumQtrs--)
 {
  sMsg = "Enter sales data for ";
  sMsg = String.Concat( sMsg, iNumQtrs );
  sMsg = String.Concat( sMsg, " quarter(s)?");

  DialogResult iRet = MessageBox.Show( sMsg, "Quarterly Sales?", 
   MessageBoxButtons.YesNo );
  if (iRet == DialogResult.Yes)
   break;
 }

 sMsg = "Displaying data for ";
 sMsg = String.Concat( sMsg, iNumQtrs );
 sMsg = String.Concat( sMsg, " quarter(s)." );

 MessageBox.Show( sMsg, "Quarterly Sales" );

 //Starting at E1, fill headers for the number of columns selected.
 oResizeRange = oWS.get_Range("E1", "E1").get_Resize( Missing.Value, iNumQtrs);
 oResizeRange.Formula = "=\"Q\" & COLUMN()-4 & CHAR(10) & \"Sales\"";

 //Change the Orientation and WrapText properties for the headers.
 oResizeRange.Orientation = 38;
 oResizeRange.WrapText = true;

 //Fill the interior color of the headers.
 oResizeRange.Interior.ColorIndex = 36;

 //Fill the columns with a formula and apply a number format.
 oResizeRange = oWS.get_Range("E2", "E6").get_Resize( Missing.Value, iNumQtrs);
 oResizeRange.Formula = "=RAND()*100";
 oResizeRange.NumberFormat = "$0.00";

 //Apply borders to the Sales data and headers.
 oResizeRange = oWS.get_Range("E1", "E6").get_Resize( Missing.Value, iNumQtrs);
 oResizeRange.Borders.Weight = Excel.XlBorderWeight.xlThin;

 //Add a Totals formula for the sales data and apply a border.
 oResizeRange = oWS.get_Range("E8", "E8").get_Resize( Missing.Value, iNumQtrs);
 oResizeRange.Formula = "=SUM(E2:E6)";
 oResizeRange.Borders.get_Item( Excel.XlBordersIndex.xlEdgeBottom ).LineStyle 
  = Excel.XlLineStyle.xlDouble;
 oResizeRange.Borders.get_Item( Excel.XlBordersIndex.xlEdgeBottom ).Weight 
  = Excel.XlBorderWeight.xlThick;

 //Add a Chart for the selected data.
 oWB = (Excel._Workbook)oWS.Parent;
 oChart = (Excel._Chart)oWB.Charts.Add( Missing.Value, Missing.Value, 
  Missing.Value, Missing.Value );

 //Use the ChartWizard to create a new chart from the selected data.
 oResizeRange = oWS.get_Range("E2:E6", Missing.Value ).get_Resize( 
  Missing.Value, iNumQtrs);
 oChart.ChartWizard( oResizeRange, Excel.XlChartType.xl3DColumn, Missing.Value,
  Excel.XlRowCol.xlColumns, Missing.Value, Missing.Value, Missing.Value, 
  Missing.Value, Missing.Value, Missing.Value, Missing.Value );
 oSeries = (Excel.Series)oChart.SeriesCollection(1);
 oSeries.XValues = oWS.get_Range("A2", "A6");
 for( int iRet = 1; iRet <= iNumQtrs; iRet++)
 {
  oSeries = (Excel.Series)oChart.SeriesCollection(iRet);
  String seriesName;
  seriesName = "=\"Q";
  seriesName = String.Concat( seriesName, iRet );
  seriesName = String.Concat( seriesName, "\"" );
  oSeries.Name = seriesName;
 }                
 
 oChart.Location( Excel.XlChartLocation.xlLocationAsObject, oWS.Name );

 //Move the chart so as not to cover your data.
 oResizeRange = (Excel.Range)oWS.Rows.get_Item(10, Missing.Value );
 oWS.Shapes.Item("Chart 1").Top = (float)(double)oResizeRange.Top;
 oResizeRange = (Excel.Range)oWS.Columns.get_Item(2, Missing.Value );
 oWS.Shapes.Item("Chart 1").Left = (float)(double)oResizeRange.Left;
}


Monday, March 3, 2014

Ikki va undan ortiq, ko`p o`lchovli massivlar haqida

Ikki va undan ortiq, ko`p o`lchovli massivlar haqida

Bir o`lchovli massivlar vector(vektor) deyiladi.
Ikki o`lchovli massiv esa matrix(matritsa) deyiladi.
Vektorlar - int[] a={2,3,4,54,5}; (C#, Java)
Matritsa - int[,] a={{3,5,3},{3,5,6},{544,3,64},{654,0,-5}}; (C#,Java)
Massivning ixtiyoriy elementini o`zgartirishda uning indexi(pozitsiyasi) orqali o`zgartiriladi.
a[4]=2; (5- element o`zgartirildi)

b[3]="3423"; (4- element o` zgartirildi)

Main funksiyasi

Main funksiyasi(asosiy funksiya) - Barcha dasturlarda mazkur funksiya bor. Bu funksiya dasturning kirish eshigi, dastur ishga tushirilganda avtomatik shu funksiyaga murojaat bo`lib, shu funksiyada qaysi funksiya ko`rsatilsa shu yerga yo`naltiriladi. agar hech bir funksiyaga murojaat qilinmagan bo`lsa boshqa class yoki funksiyalarga murojaat qilmasdan dastur ish faoliyatini tugatadi.

Funksiyalar bilan ishlash

Funksiyalar bilan ishlash

Funksiyalar biz uchun nega kerak? - Class biz uchun tip, funksiyalarni e`lon qilish maydoni, biror obyektni qayta ishlash uchun kerakligini bildik. Endi funksiya haqida, nima uchun foydalanishimiz kerakligi haqida bilib olamiz. Sizchi nima deb o`ylaysiz?

Demak, class ning vazifalari ichida mantiqiy yoki arifmetik amallar yo`q. Biz biror missiyani bajarishni xohlasak uning algoritmini qanday kiritamiz? Albatta funksiyaga. Funksiyalar ko`p bo`lishi mumkin ular bir classda yoki bir nechta class da bo`lishi ham mumkin. Eslab o`tamiz tashqaridan ko`rishimiz uchun bu funksiya albatta public bo`lishi lozim. Demak funksiyada dasturning mantig`i yoziladi, bu mantiq funksiyalarga, classlarga ma`nosi bo`yicha ajratib, tartiblab yoziladi. Kerak bo`lgan yerda shu qismni e`lon qilinadi, kerak bo`lgan yerda murojaat qilinaveradi. Bir nechta kichik dastur tuzmoqchi bo`lsangiz yoki bir nechta masalani ishlamoqchi bo`lsangiz har biriga alohida proyekt yaratib o`tirishni keragi yo`q, har bir masalani bittadan funksiyada bajarib, shu funksiyalarni asosiy funksiyadan chaqirib qo`yish kifoya. Son-sanoqsiz funksiyalar, classlar bo`lishi mumkin, ammo ular siz qachon murojaat qilsangizgina faoliyatni boshlaydilar. Bundan anglashiladiki, yozayotgan kodimi kattalashib ketmasligi uchun classlarga, funksiyalarga bo`lib tashlasak xotirani tejaymiz, murojaat qilsakgina ishlar ekanlar. Funksiyaga murojaat ham faqat funksiya ichidan bo`ladi, e`lon qilish esa faqat class ichida. Demak class da e`lon qilyapmiz, funksiyadan boshqa funksiyani chaqirayapmiz. Funksiyaga murojaat qilganda funksiya nomidan so`ng "(" belgisini qo`yamiz(qavsni yopmay turamiz) va bizga kiritishimiz shart bo`lgan kerakli parametrlar ko`rinadi. Demak ko`rindiki funksiyalardan foydalanish, e`lon qilish uchun maxsus bilim shart emas, tiplarni bilsak bo`ldi ekan. Tiplarni esa OOP ni o`rganishdan oldin misol yechish jarayonida yodlab, tushunib olamiz. Xulosa shuki biz uchun o`ylagan algoritmimizni funksiyani e`lon qilib uning ichida(tanasida) yozamiz.

Classlarga murojaat

Classlarga murojaat


Classlarga murojaat qilganda ma`lumot dinamik xotiraga tushadi. Chunki classni chaqirish C# va Java da deyarli bir xil. 


Bu yerda Tom -class, tom - obyekt. demak Tom tipidagi tom.(Mushuklar turiga kiruvchi bir hayvon yoki obyekt, ya`ni bir mushuk. E`tibor bering: Tom(Mushuk) bilan tom(mushuk) farq qilmoqda).

Static elementlar

Static elementlar

   Class, funksiya, obyekt yoki propertyni static(static) element sifatida e`lon qilish mumkin. Bundan ko`zlangan maqsad statik elementni xotiraning yuqori pog`onasiga chiqarib qo`yish va uni xotirada doim saqlash, kerak bo`lganda unga murojaat qilish. Statik bo`lmagan elementlar esa classga murojaat vaqtida ular ham yangidan xotiraga olinadi, classni ishlatishni to`xtatib block yopilganda esa u elementlar xotiradan tozalab tashlanadi. Undan tashqari class ni bir necha marta qayta-qayta murojaat etib chaqirib foydalanilganda shu class tipida bir nechta obyekt hosil bo`ladi, statik bo`lmagan elementlari har bir klassda alohida element qabul qiladi, statik bo`lsa shu obyektlarda hammasida ayni shu statik elementi bir xil qiymatga moslashib qoladi(bittasidagi statik element o`zgartirilsa hamma obyektlarda xuddi shu statik element bir xil yangi qiymatga o`zgarib qoladi).
Funksiyalar ham statik bo`lishlari mumkin. Bu qachon bo`ladi? Qachonki bir funksiyaning vazifasi o`zi joylashgan classdagi boshqa funksiyaga bog`liq bo`lmasa va uni asosan boshqa classlardan chaqirilsa shunda ishlatiladi.
Static elementlar class nomidan so`ng nuqta(.) qo`yib chaqiriladi
Masalan: Console.WriteLine("..."); System.out.println("...");

 bu yerda Console va System -class, WriteLine va println esa statik funksiyalar.

Funksiyaga murojaat

Funksiyaga murojaat - Funksiyani chaqirish, funksiyani ishlatish, funksiya ijro etish...

Funksiyaga murojaat etishda quyidagilarga e`tibor qaratish lozim:
1. Funksiya qiymat qaytaradimi? - agar qaytarsa demak undan biror natija olib boshqa o`zgaruvchiga berish mumkin.
2. Funksiyaning tipi qanaqa, ya`ni bizga qaytadigan qiymat qaysi tipda bo`ladi? - Agar yangi o`zgaruvchi e`lon qilib unga funksiyaning qiymatini berishni istasak, demak yangi o`zgaruvchining tipi funksiyaning tipini o`z ichiga olishi yoki u bilan bir xil bo`lishi shart.
3. Funksiya parametr oladimi? - agar parametr olsa, unga parametr kiritish kerak bo`ladi.
4. Parametrlari nechta va tiplari qanaqa? - parametrlarning o`rniga biror qiymat yoki boshqa bir o`zgaruvchi kiritish mumkin. Ketma-ketlik esa parametrlarning ketma-ketligi bilan bir xil va har bir kiritilayotgan parametrning tipi e`lon qilingan parametr o`zgaruvchisining tipi bilan bir xil bo`lishi kerak.
bular 4 ta bo`lgani bilan qiyin emas.
Ushbu shartlar qanoatlantirilsa funksiya ishlaydi va biror natija olish yoki shunchaki ishlatib yuborish mumkin.

Ko`rib turganimizdek funksiyalarning ichki qismida yana biz bilgan tizimli dasturlashning arifmetik amallaridan foydalaniladi. Shu sababli yosh dasturchilarga masala ishlatib, ularni ko`niktirib boriladi va Class tushunchasini qabul qilish ularga og`irlik qilmaydi. Sababi funksiyani e`lon qilish va chaqirishdan boshqa deyarli barcha narsalar arifmetik ifodalar bo`lmoqda...

Class lar haqida

Class  lar haqida

Class lar o`zida qiymat saqlovchi obyektlardan, funksiya va property(xususiyat) lardan tashkil topgan. Vazifa bir turga yaqin funksiyalarni bir joyga saqlash uchun biror bir klassning ichida e`lon qilinadi(joylashtiriladi) va biror nom bilan nomlanadi.
Funksiyalarni e`lon qilish - funksiyani biror class ning ichiga joylashtirib uning ichiga logikasini(bajaradigan missiyasini) yozish.
Funksiyani chaqirish(ishlatish) - E`lon qilingan funksiyani chaqirish mumkin, e`lon qilinmagan funksiya mavjud bo`lmaydi. Funksiyalar - kichik dasturchalar, ular parametr berib ishlatiladi va biror natijani qabul qilib olinadi.

funksiyalarni e`lon qilishda ham ma`lum bir type(Reference yoki Value) bilan e`lon qilinadi(yaratiladi deb ham yoziladi - bu e`lon qilish ma`nosida). Kirish parametrlari bir nechta bo`lsa ham natijaning qiymati bir dona bo`ladi(ya`ni bitta qiymat qaytadi).. Parametrlar ham natija ham biror type ga tegishli bo`ladi. Natija esa funksiyaning qiymati deb aytiladi.  Qiymat qaytarmaydigan funksiyalar ham bor, bular  Prosedura(Procedure) deyiladi. E`lon qilinishi xuddi funksiyalar bilan bir xil, faqat  funksiyaning tipi void deb belgilanadi. void- - bu maxsus tip, faqat funksiyalarda qo`yiladi, qachonki uni proseduraga aylantirish kerak bo`lgan vaqtlarda.


Return - ingliz tilida qaytarmoq, qaytarib bermoq, jo`natmoq yoki javob bermoq ma`nolarini beradi. Biz bu operatorni funksiyalarda qo`llaymiz. Shu funksiyaning natijasini qaytaruvchi operator. Dasturning biror qismidan kerakli funksiyani chaqirganimizda odatda undan biror natija kutamiz va kelgan natijani boshqa bir o`zgaruvchiga beramiz. Shu funksiyadan natija qaytishi uchun returndan foydalaniladi. Returndan keyingi operatsiyalar bajarilmaydi. Funksiyada qanday amallar bajarilganiga qaramay returnda nima berilgan bo`lsa shu qaytad(funksiyaning qiymati shunga teng bo`ladi).

Obyektga yo`naltirilgan dasturlash tillari (OOP)

Obyektga yo`naltirilgan dasturlash tillari (OOP)

Obyektlar orqali ma`lumotlarni qayta ishlash va amallar bajarishni ta`minlashda foydalaniladigan dasturlash tillari Obyektga yo`naltirilgan dasturlash tillaridir. OOP ham rivojlanish evaziga ehtiyoj sababli yuzaga kelgan.  OOP ning imkoniyatlari ba`zida bizning tasavvurimizdan ham kattaroq. Unda istalgan tipdagi obyektlarni qayta ishlashning imkoni bor. OOP dasturlarini tasavvur qilish tizimli dasturlarni tuza oladigan dasturchilar uchun qiyin emas, OOP - tizimli dasturlarning majmui. Istalgan dasturni tahlil qilsak - hech bir dastur yo`qki unda tizimli dasturlash tillaridagi amallar bajarilmasa, OOP da ham turli xil tiplar bo`lgani bilan ular ham oddiy tiplardan tuzilgan to`plamlardir, ular o`rtasida amal bajarganda ham shundoq o`zini emas ichidagi a`zolari o`rtasida amallar bajariladi. A`zolari esa o`sha biz bilgan oddiy tiplar hisoblanadi.
OOP ning 3 prinspi:
1. Inkaptsulyatsiya (incapsulation)(Class a`zolarining xavfsizligini ta`minlash)
2. Nasl olish(Abstraction-Inheritance)(Avlod classda ajdod classning xususiyatlaridan foydalanish)
3. Polimorfizm
Savol: Object nima? Object(obyekt) - xotirada saqlangan ma`lumotning e`lon qilingan nomi(o`zgaruvchisi).  O`zgaruvchi - ma`lumotni biror bir nom bilan e`lon qilish.
Savol: Struct nima? Struct(struktura) -obyekt tegishli bo`lgan to`plamning nomi. Bu to`plamni tip(type) deb ataladi. Struct tipidagi obyektda ichidagi barcha o`zgaruvchilar tashqaridan ko`rinib turadi.
Savol: Class nima? Class ham xuddi Struct kabi type, lekin undagi obyektning ba`zi xususiyatlari bor, ular bu obyektning tanasini yashirib turadi va boshqalar.. Shu sababli ham struct dan odatda juda kam foydalaniladi. Chunki Struct - bu public(ommaviy, ochiq, oshkora obyekt). Bundan tashqari Class lar kod yozishda ham muhim ahamiyatga ega. Dasturchi dastur tuzganda odatda har bir missiya uchun bir funksiya ochadi va funksiya nomini shu missiyaga mos qilib nomlaydi. Kodning matnini shu funksiyalarda yozadi. Funksiyani o`zini esa Class da yoziladi. Demak Classda kod matnini emas funksiya(method-metod), property(xususiyat) hamda o`zgaruvchilar yoziladi, funksiyaning ichida esa kodning matni yoziladi.(adashtirmaslik kerak). Ma`lum bir guruhga kiradigan missiyalar, mantiqlar to`plami bitta Class da tashkil etiladi va shu class nomini ham mantiqdan kelib chiqib nom beriladi. Agar bu class mantiqiy amallarni bajarish uchun emas, faqat to`plamning tipi(type) uchun yaratib vaqtincha shu tipdagi ma`lumotni saqlab turish uchun yaratilgan bo`lsa (ya`ni undan maqsad faqat ma`lumot saqlash va biror manzilga yo`naltirish) demak unda funksiyaning keragi yo`q.  

Masalan:


Bu class Tom obyektining qiymatini saqlash uchun e`lon qilingan. Tom-mushuk bir obyekt bo`lsa uning ismi va yoshini saqlab turadigan class. Demak bu to`plam yoki bir tip ki, unda mushuk haqida ma`lumotlar saqlanadi. Bu klass tipidagi obyektlar ko`pligi bizga bir nechta mushukning ma`lumotlari saqlanayotganligini bildiradi. Oydinlashadiki. biz OOP dasturlash tillarida o`zimiz xohlagancha tip e`lon qilib foydalana olishimiz mumkin ekan. Biz OOP orqali juda katta imkoniyatlarga erishamiz. Class lar birgalikda kutubxona(library-biblioteka) fayllarini tashkil etadi, bu kutubxonalar ham biror katta dasturlar tizimini tashkil etadi. Masalan: Windows OS ham kutubxonalardan tashkil topgan.

Public va Private nima? Class a`zolarining xavfsizligini ta`minlash(inkapsulyatsiya)-incapsulation) prinspining maxsus so`zlari. Public, Protected, Private turlari mavjud.
Public(umumiy) - ushbu elementni class tashqarisidan ko`rish, o`zgartirish mumkin yoki yo`qligini bildiradi
Protected(himoyalangan) - ushbu element shu class avlodlari(nasl olinganda) ichida va shu class ning ichida ko`rinishi, murojaat qilish mumkinligi va qiymatini o`zgartira olish huquqini beradi
Private(maxfiy) - mazkur element o`zi joylashgan class ichidagina ko`rinishi va qiymatlarini o`zgartira olinishi hamda murojaat huquqini beradi.
Bu bizga nima uchun zarur? Tasavvur qilishga oson bo`lishi uchun kompyuter klaviaturasidan foydalanamiz. Klavishlar public elementlar, uning ichki qismidagi sxemalar esa private. Bizga faqat foydalanishimiz kerak bo`lgan elementlar ko`rsatib qo`yilgan, qolgani esa biz uchun muhim emas va mavhum. Protectedni esa xotirada qolishi uchun foydalangan vaqtimizda tushuntirib o`tamiz.

Takrorlanish operatori ( for -parametrli sikl operatori)

Takrorlanish operatori ( for -parametrli sikl operatori)
Takrorlanish operatori ham muhim ahamiyatga ega. Qo`yilgan masalaning yechimi bir yoki bir-nechta arifmetik ifodaning N marta qayta-qayta hisoblanishi natijasida chiqadigan bo`lsa bundan foydalaniladi.


Shartli o`tish operatori ( if )

Shartli o`tish operatori ( if )
Shartli o`tish operatori - biror shart bajarilganda belgilangan vazifani bajarishga yo`naltiruvchi operator. E`tibor bering: shart bajarilganda. bu operatorning sintaksisi quyidagicha. Belgilangan vazifa bajarilishi uchun biror shart qo`yish kerak bo`lganda foydalaniladi.














Biror shart bajarilganda 1-vazifa aks holda 2-vazifa bajarilishi uchun ham foydalanish mumkin.


If( shart ){
.....//1-vazifa
} else {
..............//2-vazifa
}
... else - aks holda