A jedeme dál ...
Človíčkův Weblog aneb Michal Horák bloguje

Programování


Jak měnit Master Page z kódu Web Content Formu

 | 1.4.2008

Chvilku jsem si s tímto problémem lámal hlavu, ale docvaklo mi to a tak se můžu podělit. Je to jednoduché. Pro příklad si uděláme Master Page webGui.master, kde bude menu, ve kterém budeme chtít dát vědět, na které stránce jsme.

Otevřeme si soubor webGui.master.cs a přidáme do něj panely s odkazem a ke každému panelu property:

public Panel prvniLink {
    get {
        return PrvniPanel;
    }
    set {
        PrvniPanel = value;
    }
}

V kódu stránky využívající danou Master Page pak těmto property můžeme nastavit CssClass:

((webGui)this.Master).prvniLink.CssClass = "select";

No a už jen stačí pomocí css označit, že je tento odkaz vybraný …

1.4.2008 15:56 | Programování | Komentáře (1) | Trvalý odkaz | 22229x | Linkuj.cz

Visual Studio 2008 - Web Form a Master Page

 | 13.3.2008

Nedávno mě potrápilo nové Visual Studio 2008, to když jsem si chtěl vytvořit web využívající Master Pages, udělal jsem si novou Master Page a založil nový Web Form a hledal jsem kde je to zaškrtávací políčko, kde bych řekl, že chci využít svoji vytvořenou Master Page a ono nikde. Nejdříve jsem si Web Form přepsal ručně, ale to se mi pokaždé dělat nechtělo a tak jsem hledal, no a trvalo to skoro hodinu, než jsem si uvědomil, že nesmím zakládat Web Form ale Web Content Form. Tak pokud máte stejný problém, nebo teprve budete mít, snad jsem pomohl :-)

13.3.2008 17:51 | Programování | Komentáře (2) | Trvalý odkaz | 21472x | Linkuj.cz

Pomalý TableLayoutPanel v .NET 2.0 - Řešení

 | 2.2.2008

Nedávno jsem měl jeden takový malý, nebo možná větší, problémek a ten se podařilo dostatečně vyřešit :-)

Když jsem se snažil do tableLayoutPanelu naskládat spousty labelů, tak to strašně dlouho trvalo, problém byl v tom, že se po každém přidání labelu, celý tableLayoutPanel překreslil. Řešením je nastavit property Visible u tableLayoutPanelu na false a až se vše vyplní, tak vše zobrazit nastavením Visible na true. Jednoduché, primitivní, ale zabralo to spoustu času …

2.2.2008 11:51 | Programování | Komentáře (0) | Trvalý odkaz | 18221x | Linkuj.cz

Pomalý TableLayoutPanel v .NET 2.0

 | 2.1.2008

Již nějakou dobu řeším jeden problém, mám tak dvě stovky informací, které chci přehledně a dynamicky vložit na formulář, každá položka jako jeden label a dataGridView lze špatně formátovat, takže jsem vyzkoušel TableLayoutPanel. Vše v něm vypadá parádně, ale má to velký háček. Než se všechny labely do TableLayoutPanelu vloží, tak to zabere spoustu času a to nemám počítač, který by se s něčím takovým mohl trápit.

Jestliže někdo víte o čem mluvím a podařilo se vám to vyřešit, dejte prosím vědět. Díky a přeji pěkný den :-)

2.1.2008 13:32 | Programování | Komentáře (0) | Trvalý odkaz | 19359x | Linkuj.cz

Čtení dat z Excelu pomocí .NET C#

 | 22.11.2007

Jestliže potřebujete číst data uložená v tabulkách Excelu, pak mám pro vás jednoduchý prográmek v jazyku C#, který toto umí. Samozřejmě, že si jej můžete libovolně upravit podle svých potřeb.

using System;
using System.Collections.Generic;
using System.Text;

/* 
 * Michal Horák http://weblog.clovicek.net 2007
 * 
 * Pro načtení a změnu excelovsakého souboru je
 * potřeba přidat do referencí com Microsoft
 * Excel Object Library, nejlépe tu nejvyšší verzi
 */
namespace readExcel2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Cesta k souboru
            string Path = AppDomain.CurrentDomain.BaseDirectory
                + "List.xls";

            // Vytvoří Aplikační třídu pro práci se souborem
            Excel.ApplicationClass app = new Excel.ApplicationClass();

            /* Otevře soubor, co se týče těch atributů funkce
             * open, tak nemám ponětí co se tam má psát,
             * našel jsem to na netu
             */
 
            Excel.Workbook workBook
                = app.Workbooks.Open(Path, 0, true,
                                     5, "", "", true,
                                     Excel.XlPlatform.xlWindows,
                                     "\t", false, false, 0, true, 1, 0);
            
            // Pracujeme s prvním listem
            Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Sheets[1];
            
            
            int index = 0; //index radku
            int index2 = 2; //index sloupce

            object rIndex = 1; // zacneme na radku 1
            object cIndex = 1; //sloupci 1
            object ColFirst = 1; //sloupci 1
            
            try
            {
                //dokud je neco na radku rIndex a prvnim sloupci
                while (((Excel.Range)workSheet.Cells[rIndex, cIndex]).Value2 != null)
                {
                    rIndex = 1 + index; //pricti radek
                    // dokud je neco na radku rIndex a sloupci ColFirst
                    while (((Excel.Range)workSheet.Cells[rIndex, ColFirst]).Value2 != null)
                    {
                        string retez = ((Excel.Range)workSheet.Cells[rIndex, ColFirst]).Value2.ToString();
                        Console.Write("{0},\t", retez); //vypis políčko [rIndex,ColFirst]
                        ColFirst = index2; //pricti sloupec
                        index2++;
                    }
                    Console.WriteLine();
                    if (index == 0)
                    {
                        Console.WriteLine("-----------------------------------------------");
                    }

                    ColFirst = 1; //nastav sloupec na zacatek
                    index2 = 2;    
                    index++;
                }
            }
            catch (Exception e)
            {
                app.Quit();
                Console.WriteLine(e.Message);
            }
            Console.ReadLine();
        }
    }
}

22.11.2007 18:40 | Programování | Komentáře (9) | Trvalý odkaz | 41186x | Linkuj.cz

Visual C# 2008 Express Edition

 | 20.11.2007

Pro vývojáře, kteří nechtějí platit za licence, vystačí si s omezenou verzí vývojového nástroje pro C# a chtějí využívat nejmodernější Microsoftí technologie, vyšel Visual C# 2008 Express Edition.

Stahovat můžete na adrese http://www.microsoft.com/express/vcsharp/.

Pokud si chcete vyzkoušet kompletní Visual Studio 2008, pak lze stáhnout jeho 90-ti denní trial verze.

20.11.2007 08:53 | Programování | Komentáře (3) | Trvalý odkaz | 22195x | Linkuj.cz

Histogram obrázku, C# .NET

 | 3.11.2007

Naposledy jsme zvětšovali a zmenšovali obrázek, nyní si spočítáme jeho histogram. Obrázek máme uložený v dvojrozměrném poli double[,] BitmapArray, zde je uložena jeho černobílá varianta, aby se nám vše lépe počítalo. Histogram spočítáme následujícím způsobem:

        private int[] SpocitejHistogram()
        {
            int vyska = this.BitmapArray.GetLength(1);
            int sirka = this.BitmapArray.GetLength(0);
            int[] histogram = new int[256];
            int N = sirka * vyska;
            for (int y = 0; y < vyska; y++)
            {
                for (int x = 0; x < sirka; x++)
                {
                    histogram[(int)this.BitmapArray[x, y]] = histogram[(int)this.BitmapArray[x, y]] + 1;
                }
            }

            return histogram;

        }

Tento histogram můžeme následně uložit jako bitmapu:

        private Bitmap VykresliHistogram(double[] histogram) {
            
            double max = 0;
            Point[] body=new Point[256];
            Bitmap bitmap = new Bitmap(256, 100);
            Graphics g = Graphics.FromImage(bitmap);
            g.FillRectangle(Brushes.White, 0, 0, 256, 100);
            Pen pen = new Pen(Color.Black, 1);
            for (int i = 0; i < histogram.Length; i++) {
                if (histogram[i] > max) {
                    max = histogram[i];
                }
            }
            for (int j = 0; j < histogram.Length; j++)
            {
                g.DrawLine(pen, new Point(j, 100), new Point(j, (100-(int)(((double)histogram[j]/(double)max)*100))));
            }

            
            g.DrawLines(pen, body);
            g.Dispose();
            return bitmap;

        }

Kterou lze následně vykreslit.

3.11.2007 15:22 | Programování | Komentáře (0) | Trvalý odkaz | 20479x | Linkuj.cz

Zvětšování a zmenšování obrázků

 | 6.10.2007

Jestlipak víte jak funguje zvětšování a zmenšování obrázků na počítači? Nevíte? Tak čtěte dál …

Body

Hlavním problémem při zmenšování či zvětšování obrázku je, že potřebujete vykreslit některé body, které neznáte a tak si je musíte nějak odvodit. Existuje několik algoritmů a já se pokusím dva popsat.

Metoda nejbližšího souseda

Nejjednodušší algoritmus, který asi po nějaké době napadne každého je metoda nejbližšího souseda. Nejdříve si vytvoříme nový obrázek, tak že přepočítáme šířku a výšku obrázku. Pak přes tuto šířku a výšku procházíme body a těm musíme přiřadit barvu. Ale jak vzít správnou barvu? Přepočítáme si souřadnice na starý obrázek, tam nám vyjde nějaké číslo, které není celým číslem. To je problém, protože souřadnice jsou určeny celými čísly 0,…,n. Proto si vezmeme nejbližšího souseda a do obrázku na hledanou pozici vložíme jeho barvu.

Bilineární interpolace

Když budeme mít stejný případ jako v předchozím algoritmu, pak u bilineární interpolace se barva bodu na hledané pozici určí z barev sousedních bodů bodu, který máme na starém obrázku. Tato barva se vypočítá pomocí vzorce:

Bilineární interpolace

Kde barva je určena v RGB a musí se spočítat každá šást barvy zvlášť.

Zdrojový kód

Tento zdrojový kód jsem dělal na cvičení ve škole, takže nečekejte žádné zázraky. Je velmi pomalý, ale důležité je pochopení problému a funkčnost.

        private Bitmap NejblizsiSousedBitmapArray(int percent) {
            int vyska = (int)(((double)this.BitmapArray.GetLength(1)/100)*percent);
            int sirka = (int)(((double)this.BitmapArray.GetLength(0) / 100) * percent);
            richTextBox1.Text += "stara sirka: "+BitmapArray.GetLength(1)+"\n";
            richTextBox1.Text += "stara vyska: "+BitmapArray.GetLength(0) + "\n";
            Bitmap bitmap = new Bitmap(sirka, vyska);
            int xx;
            int yy;

            for (int y = 0; y < vyska; y++)
            {
                for (int x = 0; x < sirka; x++)
                {
                    double a = (x * 100) / percent;
                    double b = (y * 100) / percent;
                    xx = (int)Math.Truncate(a);
                    yy = (int)Math.Truncate(b);
                    bitmap.SetPixel(x, y, this.BitmapArray[xx,yy]);
                }
            }
        
            return bitmap;

        }


        private Bitmap BilinearniBitmapArray(int percent)
        {
            int vyska = (int)(((double)this.BitmapArray.GetLength(1) / 100) * percent);
            int sirka = (int)(((double)this.BitmapArray.GetLength(0) / 100) * percent);
            Bitmap bitmap = new Bitmap(sirka, vyska);
            int xx;
            int yy;
            double lx;
            double ly;
            byte red;
            byte green;
            byte blue;

            for (int y = 0; y < vyska; y++)
            {
                for (int x = 0; x < sirka; x++)
                {
                    double a = (x * 100) / percent;
                    double b = (y * 100) / percent;
                    xx = (int)Math.Truncate(a);
                    yy = (int)Math.Truncate(b);
                    lx = ((x * 100) / percent) - xx;
                    ly = ((y * 100) / percent) - yy;
                    
                    try {
                        red = (byte)((this.BitmapArray[xx + 1, yy].R - this.BitmapArray[xx, yy].R) * lx + (this.BitmapArray[xx, yy + 1].R - this.BitmapArray[xx, yy].R) * ly + (this.BitmapArray[xx + 1, yy + 1].R - this.BitmapArray[xx + 1, yy].R - this.BitmapArray[xx, yy + 1].R - this.BitmapArray[xx, yy].R) * lx * ly + this.BitmapArray[xx, yy].R);
                        green = (byte)((this.BitmapArray[xx + 1, yy].G - this.BitmapArray[xx, yy].G) * lx + (this.BitmapArray[xx, yy + 1].G - this.BitmapArray[xx, yy].G) * ly + (this.BitmapArray[xx + 1, yy + 1].G - this.BitmapArray[xx + 1, yy].G - this.BitmapArray[xx, yy + 1].G - this.BitmapArray[xx, yy].G) * lx * ly + this.BitmapArray[xx, yy].G);
                        blue = (byte)((this.BitmapArray[xx + 1, yy].B - this.BitmapArray[xx, yy].B) * lx + (this.BitmapArray[xx, yy + 1].B - this.BitmapArray[xx, yy].B) * ly + (this.BitmapArray[xx + 1, yy + 1].B - this.BitmapArray[xx + 1, yy].B - this.BitmapArray[xx, yy + 1].B - this.BitmapArray[xx, yy].B) * lx * ly + this.BitmapArray[xx, yy].B);
                        bitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
                    }
                    catch {
                        
                    }
                    
                }
            }
            return bitmap;

        }

Závěrem

Pro ještě kvalitnější změnu velikosti se používá bikubická interpolace, kterou jsem ještě nedělal, ale pokud budu mít čas, tak bych ji rád naprogramoval. Když se to povede, výsledek přidám sem.

6.10.2007 21:04 | Programování | Komentáře (0) | Trvalý odkaz | 18917x | Linkuj.cz

Příklad ze softwarové zkoušky

 | 2.7.2007

Na softwarovou zkoušku jsem si vybral příklad, který byl asi nejlehčí, v zadání bylo vytvořit program pro formátování textu v souboru. Program načte soubor, kde mohou být před odstavcem nastaveny parametry odstavce, kterými jsou

Program jsem psal jako konzolovou aplikaci, kterou si můžete stáhnout včetně zdrojového kódu formattext.zip. K dispozici je i testovací soubor: text.txt. Kód asi nebude nejlepší, ale hlavní je, že to funguje správně a dostal jsem za to jedničku ;o)

2.7.2007 13:55 | Programování | Komentáře (0) | Trvalý odkaz | 15772x | Linkuj.cz

Druhý graf z bakalářské práce

 | 28.2.2007

Tak jsem zase trošku pokročil a máme tu další graf z mé bakalářské práce. Tentokráte již trošku barevnější a ještě vám k tomu ukážu i zdrojový kód, pomocí kterého se zavolá onen Serverový ovládací prvek, který graf generuje. U tohoto grafu jsou ještě zobrazeny inflexní body a je zde pouze jeden graf, ale určitě je vidět, že grafů lze do obrázku přidat více.

Druhý graf <cc1:WebGraphs ID="WebCustomControl1" Text="Text" runat="server" Height="300px" Width="500px" Padding="25" Theme="default">
     <Graphs>
         <cc1:Graph color="DarkGreen" from_x="-1" from_y="-1.2" function="cos(x)" to_x="6" to_y="1.2" size="1" inflex="true" />
     </Graphs>
</cc1:WebGraphs>

Ještě pořád je na čem pracovat, hlavně je potřeba optimalizovat zobrazování inflexních bodů a extrémů a snížit dobu generování grafu a zavést podporu pro skiny a datové vazby. Však vám zase příště něco ukážu ;o)

28.2.2007 18:02 | Programování | Komentáře (1) | Trvalý odkaz | 19532x | Linkuj.cz

Předchozí příspěvky | 1 | 2 | 3 | Další příspěvky

Tipy na přečtení

Kategorie

Vyhledávání

Odkazy

Nejčtenější příspěvky za poslední týden

Poslední příspěvky

"A jedeme dál ..." Človíčkův Weblog aneb Michal Horák bloguje. (c) Michal Horák (Človíček webdesign) 2006