Visual Studio 2008 & Debug
13 května 08 12:11 odp.

Pokud budete ladit aplikace v prostředí Visual Studio 2008 a narazíte na to, že po každé když ukončíte aplikaci kterou ladíte se Vám počítač zasekne tak na 20 sekund, tak řešení je následující:

Otevřít vlastnosti projektu a na záložce debug odkliknout možnost Enable the Visual Studio hosting process.

Co tím ztratíte je pospáno třeba tady, mně to nevadí, spíš mě štve to čekání. 

http://msdn.microsoft.com/en-us/library/ms242202.aspx 

Postedby opis | 2 Comments    
Knihy o programování
16 prosince 07 08:41 odp.

V poslední době jsem měl trošku času tak jsem přečetl několik knih o programování, které jsou k dispozici na našem trhu. Nepůjčoval jsem si knihy, které souvisejí s nějakou konkrétní technologií, ale spíš knihy které jsou obecně popisují programování, nebo jiné související činnosti. Nejvíc mě zaujaly dvě knihy, které jsou opravdu výborné a přínosné co se týká programování obecně.

1) Dokonalý kód ( Steve McConnell ) - knihu by si měl přečíst každý kdo to s programováním myslí trošku vážně. Popisuje všechny cykly vývoje od analýzy po testování.

2) Co programátory ve škole neučí ( Petr Paleta ) - autor popisuje svoje osobní zkušenosti s vývojem aplikací a problémů se kterými se během vývoje setkal.

 Začal jsem taky číst knihu Návrhové vzory, ale styl kterým je kniha napsaná mě vůbec nevyhovuje takže jsem jí ani nedočetl. Spíš bych odkázal na adresu http://objekty.vse.cz/Objekty/Vzory 

Takže kdyby jste neměli přes svátky co dělat tak napište ježíškovi a on to už nějak zařídí :-)

 

 

Postedby opis | 1 Comments    
Návrh aplikace
10 listopadu 07 09:24 odp.

Už jsem měl tu čest pokračovat ve vývoji aplikací, které byly v nějakém stádiu vývoje a potřebovaly dát nějakým způsobem do pořádku. Vývojáři, kteří nedbají na další rozšiřitelnost a údržbu kódu v aplikacích se stanou dříve nebo později zajatci svých aplikací. Projevuje se to zejména tak, že když přijde nový, celkem jednoduchý požadavek, typická odpověď je "No, ale to zabere tak nejméně tři týdny..." 

Vyvstává otázka: co je primárním cílem návrhu aplikace, či systému ?

Tím by měla být podle mého názoru rozšiřitelnost aplikace a minimalizace složitosti aplikace .

Mnoho vývojářů dává přednost řešením, které je ihned napadnou, např. aktualizuji profil zákazníka, aktualizuji taktéž jeho status pro export do nějakého externího systému. Je důležité aby jste se při aktualizaci profilu zákazníka nemusli zabývat dalšími věcmi jako je export do nějakých externích systémů. Tuhle problematiku lze řešit až v proceduře, která zpacovává Export.

Složitost aplikace lze minimalizovat tím, že se třída (pokud vůbec nějaká existuje) bude zabývat pouze aktualizací údajů o zákazníkovi. Na základě této akce se můžou vyvolat další funkce ostatních tříd, které budou mít svoji specifickou úlohu. Nutonstí je delegovat jednotlivé funkce specializovaným třídám a ne jedné proceduře.

Občas přemýšlím, že by bylo možní dobré napsat knihu "Jak neprogramovat" Aby něl každý možnost seznámit se s každým omylem se kterým si každý vývjojář prošel (a někteří bez povšimnutí dále a dále prochází). K čemu je vám, že znáte nové technologie jako LINQ, když neumíte pořádně navrhnout aplikace, která se bude bez problémů vyvýjet a rozšiřovat za 5-10 let ? V tom dnešním překotném vývoji mě tohle téma docela chybí....

Samozřejmě můžete namítnout, že na webu MS je spousta článků, kterých se zabývají architerkturou, mě to přijde přílliš všeobecné  a hlavně ne pro středně pokročilého vývojáře. Co vy na to ...

 

Postedby opis | 4 Comments    
SQL Procedury s parametrem
07 září 06 11:31 dop.

Při psaní uložených procedur, které vrací záznamy dle předaného parametru do procedury se občas stane, že
je třeba vrátit všechny záznamy bez ohledu na hodnotu vstupního parametru procedury. Samozřejmě, že problém by bylo možné řešit
podmínkou IF ELSE, nicméně u rozsáhlých SQL dotazů je pak následná údržba SQL kódu náročnější (je třeba vše upravit 2x).

Příklad:
Mějme tabulku Osoba ve které každá osoba patří do nějakého oddělení (sloupec ID_Oddeleni).
Vytvořime proceduru OsobyDleOddeleni, kde vstupní parametr procedury bude @ID_Oddeleni INT.
Uvnitř procedury napíšeme následující SQL kód

SELECT * FROM osoba WHERE ID_Oddeleni = @ID_Oddeleni

Problém je v tom, že procedura neumí vrátit VŠECHNY osoby v případě, že vstupní parametr bude roven hodnotě NULL.
Proto lze přepsat SQL kód následovně:

SELECT * FROM osoba WHERE ID_Oddeleni = ISNULL(@ID_Oddeleni, ID_Oddeleni)

Tento SQL kód v případě, že vstupní parametr procedury bude mít hodnotu NULL, vrátí všechny osoby.
Další možností je použití méně čtivého zápisu.

SELECT * FROM  Osoba
WHERE (@Id_Oddeleni is null ) OR (@Id_Oddeleni is not null AND Id_Oddeleni = @Id_Oddeleni)

Postedby opis | 11 Comments    
MCSD
30 června 06 03:06 odp.

Tak jsem dneska složil konečně poslední dvě zkoušky a stal jsem se MCSD ! :-)

Dnešní bilance:

Hodin spánku: 4

Hrnků kafe:10

Chuť k životu: 0

Snad to zítra bude lepší :-)

Už bych taky mohl něco napsat. Tak snad zítra ...:-)

Postedby opis | 2 Comments    
Certifikace
02 května 06 10:21 dop.

Musím Vám oznámit, že jsem dneska úspěšně složil Microsoft certifikaci Developing Windows applications. Musím říct, že ač nejsem přílišným zastáncem nějakých medailí a papírů, zkouška mě posunula o trochu dál. Určitě člověk získá víc rozhledu co se tchnologie .NET týká. Jinak do konce června je akce - pokud se zkouška napoprvé nezdaří, opravná zkouška je zdarma! MCSD je na dosah :-)

Předem děkuji za zaslaná blahopřání, projevy díků a HODNOTNÉ dary :-)

 

 

Postedby opis | 4 Comments    
Omalovánky
19 února 06 10:44 odp.

Moje dcera roste a občas si na počítači zahraje nějakou tu dětskou hru. Na internetu jsem našel několik her pro děti, které jsou volně ke stažení. Co jsem nenašel byly omalovánky, které mojí dceru baví ze všeho nejvíc. A tak jsem se rozhodnul, že jí omalovánky vytvořím sám - jsem přece programátor ne! a dcera je dcera takže co bych pro ní neudělal.

Začal jsem hledat na internetu, jak že je možné vyplnit plochu bitmapy, která je uzavřená a našel jsem zajímavý algoritmus Flood fill na codeprojectu http://www.codeproject.com/cs/media/floodfillincsharp.asp , který umí plochu efektně vyplnit. Na adrese http://www.findsounds.com/ISAPI/search.dll jsem si stáhnul zvuky, které bude program vydávat při kliknutí na obrázek, nebo při kliknutí na tlačítko. Musím říct, že programování v C# je v poslední době čím dál tím víc jednodušší ať kvůli větší efektivitě nového .NET studia a zároveň kvůli publikacím ostatních kolegů programátorů. Program jsem stvořil za cca 5 hodin a teď už jen sháním dětské obrázky pro vybarvování.

Takže pokud jste někdo v podobné situaci jako stahujte ať si děti mají s čím hrát.

Aplikaci je možné stáhnout zdarma na adrese :

http://www.download.com/3000-20-10506966.html?part=undefined&subj=dl&tag=button

 

Postedby opis | 11 Comments    
SQL server 2005 row versioning
29 listopadu 05 11:19 dop.

SQL Server 2005 obsahuje mimo jiných vylepšení oproti verzi 2000 i Row versioning. Row versioning řeší problém blokování uživatelů, kteří chtějí přečíst záznam, který byl změněn jiným uživatelem. Ve verzi SQL 2000, WRITER, který modifikoval záznam v rámci nějaké dlouhé transakce blokoval ostatní READERy, kteří chtěli záznam načíst. V praxi to znamenalo, že pokud jste měli nastaven ISOLATION LEVEL na READ COMMITED což je default hodnota, uživatel, který aktualizoval záznam v tabulce T v rámci své dlouhé transakce blokoval uživatele, kteří chtěli záznam z tabulky T číst.

Tento problém řeší Row versioning, který při UPDATE záznamu v tabulce uchovává původní hodnoty záznamu v databázi TempDB do doby dokončení transakce. Tyto původní hodnoty, které ještě nejsou potvrzené (COMMIT)mohou READEŘI číst, takže nemusejí čekat na dokončení transakce WRITERa. 

Více na

http://www.databasejournal.com/features/mssql/article.php/3524891

 

Postedby opis | 3 Comments    
Tisk sestav + design mode za běhu aplikace
24 srpna 05 04:00 odp.

Při brouzdání internetem, jsem narazil na komponentu pro tisk sestav XtraReports. Tato komponenta umožňuje nejen tisk sestav, ale i editaci sestav u koncového uživatele. To znamená, že koncový uživatel si může sestavy libovolně upravovat. Cena 9000,- kč není příliš vysoká. Nevýhodou této komponenty je její rychlost, která není závratná, nicméně dostačující. Po dlouhotrvajících problémech s distribucí aplikací, které používají Crystal reports jsem se rozhodl Crystal reports nahradit.

http://www.devexpress.com/Products/NET/XtraReports/

 

 

Postedby opis | 6 Comments    
Flat style Combobox
24 srpna 05 02:49 odp.

Standartní Combobox v .NET nemá vlastnost Flat, tak jsem si udělal vlastní Combobox, který se tváří stylem Flat :-) . Třída také přetěžuje funkci OnDrawItem a vykresluje pozadí položkek sama s použitím LinearGradientBrush.

 

 

Imports System.ComponentModel

Imports System.Windows.Forms

Imports System.Drawing

<Description("ComboBox"), _

DefaultProperty("Props"), _

System.Drawing.ToolboxBitmap(GetType(System.Windows.Forms.ComboBox))> _

Public Class eComboBox

Inherits System.Windows.Forms.ComboBox

Private Const WM_PAINT As Integer = &HF

Private Const WM_NCPAINT As Integer = &H85

Private m_bolMouseDown As Boolean = False

Private m_RectButton As Rectangle

'private variables

Private _props As eComboBoxProps

'Constructor

Public Sub New()

_props = New eComboBoxProps(Me)

Me.SetStyle(Windows.Forms.ControlStyles.DoubleBuffer, True)

DrawMode = DrawMode.OwnerDrawFixed

End Sub

'Properties

<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _

TypeConverter(GetType(ExpandableObjectConverter))> _

Public ReadOnly Property Props() As eComboBoxProps

Get

Return _props

End Get

End Property

Public Class eComboBoxProps

'Private variables

Private ctrl As eComboBox

'Public variables

Public Enum enClearAction

SelectFirstItem

ClearComboBox

End Enum

'Constructor

Public Sub New(ByVal ctrl_ As eComboBox)

ctrl = ctrl_

End Sub

 

'Properties

Private m_DrawItem_SelectedItemStartColor As System.Drawing.Color = Color.DarkBlue

Private m_DrawItem_SelectedItemEndColor As System.Drawing.Color = Color.Blue

Private m_DrawItem_ItemStartColor As System.Drawing.Color = Color.LightBlue

Private m_DrawItem_ItemEndColor As System.Drawing.Color = Color.WhiteSmoke

 

<DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), _

DefaultValue(GetType(System.Drawing.Color), "LightBlue")> _

Public Property DrawItem_ItemStartColor() As System.Drawing.Color

Get

Return m_DrawItem_ItemStartColor

End Get

Set(ByVal Value As System.Drawing.Color)

m_DrawItem_ItemStartColor = Value

End Set

End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), _

DefaultValue(GetType(System.Drawing.Color), "WhiteSmoke")> _

Public Property DrawItem_ItemEndColor() As System.Drawing.Color

Get

Return m_DrawItem_ItemEndColor

End Get

Set(ByVal Value As System.Drawing.Color)

m_DrawItem_ItemEndColor = Value

End Set

End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), _

DefaultValue(GetType(System.Drawing.Color), "DarkBlue")> _

Public Property DrawItem_SelectedItemStartColor() As System.Drawing.Color

Get

Return m_DrawItem_SelectedItemStartColor

End Get

Set(ByVal Value As System.Drawing.Color)

m_DrawItem_SelectedItemStartColor = Value

End Set

End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), _

DefaultValue(GetType(System.Drawing.Color), "Blue")> _

Public Property DrawItem_SelectedItemEndColor() As System.Drawing.Color

Get

Return m_DrawItem_SelectedItemEndColor

End Get

Set(ByVal Value As System.Drawing.Color)

m_DrawItem_SelectedItemEndColor = Value

End Set

End Property

End Class

Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)

MyBase.OnMouseUp(e)

m_bolMouseDown = False

Invalidate()

End Sub

Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)

MyBase.OnMouseDown(e)

m_RectButton = New Rectangle(Width - 18, 0, 17, Height)

If e.X >= m_RectButton.Left Then

m_bolMouseDown = True

Invalidate()

End If

End Sub

Protected Overrides Sub OnResize(ByVal e As EventArgs)

MyBase.OnResize(e)

Invalidate()

End Sub

Protected Overrides Sub WndProc(ByRef m As Message)

Dim g As Graphics = Graphics.FromHwnd(Handle)

Select Case m.Msg

Case WM_NCPAINT

g.Clear(BackColor)

Me.Invalidate()

Case WM_PAINT

MyBase.WndProc(m)

g.DrawRectangle(New Pen(BackColor, 2), _

New Rectangle(2, 2, Width - 4, Height - 4))

If Me.Focused = True Then

Dim rect As New Rectangle(0, 0, Me.Width - 18, Me.Height)

ControlPaint.DrawBorder(g, rect, Color.Gray, ButtonBorderStyle.Inset)

End If

m_RectButton = New Rectangle(Width - 18, 0, 17, Height)

If m_bolMouseDown Then

ControlPaint.DrawComboButton(g, m_RectButton, ButtonState.Pushed)

Else

ControlPaint.DrawComboButton(g, m_RectButton, ButtonState.Flat)

End If

End Select

MyBase.WndProc(m)

g.Dispose()

End Sub

Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)

If e.Index = -1 Then Return

Dim item As ListItem = Me.Items(e.Index)

Dim strText As String

If item Is Nothing Then

strText = ""

Else

strText = item.TEXT 'CStr(Items.Item(e.Index))

End If

Dim brBrush As Brush

 

If CBool(e.State And DrawItemState.Selected) Then

brBrush = New System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, Props.DrawItem_SelectedItemStartColor, Props.DrawItem_SelectedItemEndColor, 0)

Else

If Me.DroppedDown = False Then

brBrush = New System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, Color.White, Color.White, 0)

Else

If e.Index Mod 2 = 0 Then

brBrush = New System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, Props.DrawItem_ItemStartColor, Props.DrawItem_ItemEndColor, 0)

Else

brBrush = New System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, Color.White, Color.WhiteSmoke, 0)

End If

End If

End If

e.Graphics.FillRectangle(brBrush, e.Bounds)

brBrush = New SolidBrush(e.ForeColor)

e.Graphics.DrawString(strText, e.Font, brBrush, e.Bounds.Left, e.Bounds.Top)

End Sub

Private Sub eComboBox_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Leave

Me.Invalidate()

End Sub

Private Sub eComboBox_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.GotFocus

Me.Invalidate()

End Sub

End Class

Postedby opis | 0 Comments    
Vyvojar.cz na prodej!