piątek, 29 czerwca 2012

Tworzenie Upgrade do projektu Basic MSI w Install Shield 2008

    Tworzenie upgrade do projektu MSI należy zaplanować już przy tworzeniu instalatra MSI.
Jeżeli zakładamy,że nasz projekt będzie upgradowany a zazwyczaj tak jest, to musimy wykonać pewne kroki na początku. Najważniejszą rzeczą do wykonania jest ustawienie wersji produktu "Version" w "Product properties" na drzewie "General Information". Ustawiamy tutaj wersję, która będzie rozpoznawana przez instalator podczas instalowania Upgrade-u np: 1.0.0000

Tworzenie Upgrade do istniejącej instalacji MSI.
Przy tworzeniu upgrada do istniejącej paczki MSI możemy wykonać tylko Major Upgrade, do wersji Minor Upgrade potrzebny jest plik setup.exe. Dla paczek MSI (Single MSI Image) wykonujemy tylko Major Upgrade.

Krok 1. Wersja produktu 
Pierwszą rzeczą, którą powinniśmy zrobić to ustawić nową (nowszą) wersję produktu np: 1.1.0000 (Installation Information->General Information->Product Properties->Version). Zwróć uwagę na właściwość Product Code, Upgrade Code.
Właściwość Upgrade Code musi być taka sama dla całego projektu instalatora.

Krok 2. Kody produktów
Aby nasz Upgrade można było odinstalować i wrócić do poprzedniej wersji należy wygenerować nowy Product Code a także nowy Package Code w "Summary Information Stream".
Nie zmieniamy Upgrade Code!

Krok 3. Przygotowanie Instalatora do Upgrade
Na drzewie Media->Upgrades rozwijamy gałąź "Upgrade Windows Installer Setup" i dodajemy nowy "Major Upgrade Item".
W zakładce "Common" nowego Upgrade wybieramy dla której wersji produktu Upgrade będzie miał zastosowanie:
- dla każdej wcześniejszej (Any earlier version), czy może dla zakresu wersji produktu albo dla wybranej wersji.

Krok 4. Wymiana plików
W tym kroku należy wymień wszystkie pliki które mają być zaktualizowane na wersję użytą w Upgrade.
Ważne. Każdy plik musi posiadać zaszytą nowszą wersje, aby został upgradowany.

Krok 5. Ustawienia Upgrade.
Klikając na drzewo "Upgrade Windows Installer Setup" wyświetlamy właściwości instalacji Upgrade. Mamy 2 opcje do wyboru: Całkowie usunięte starej instalacji i zainstalowanie nowej lub też zainstalowanie Upgrade-u i usunięcie niepotrzebnych plików.
W większości przypadkach zalecana jest opcja pierwsza.

Krok 6. Budowanie paczki
W ostatnim kroku budujemy projekt tworząc nową paczkę MSI typu "MSI Single Image".

czwartek, 16 lutego 2012

Konwersja IList do DataSet - IList to DataSet

Poniżej funkcja konwertująca Ilist-ę do DataSet-a
Param: IList
Return: DataSet

public static DataSet ConvertToDataSet<T>(IList<T> list)
{
  if (list == null || list.Count <= 0)
  {
   return null;
  }
  DataSet ds = new DataSet();
  DataTable dt = new DataTable(typeof(T).Name);
  DataColumn column;
  DataRow row;

  System.Reflection.PropertyInfo[] myPropertyInfo = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

  foreach (T t in list)
  {
   if (t == null)
   {
     continue;
   }

   row = dt.NewRow();
   for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
   {
    System.Reflection.PropertyInfo pInfo = myPropertyInfo[i];
    string name = pInfo.Name;
    if (dt.Columns[name] == null)
    {
     try
    {
     column = new DataColumn(name, pInfo.PropertyType);
    }
    catch (NotSupportedException)
    {
     column = new DataColumn(name, Nullable.GetUnderlyingType(pInfo.PropertyType));
    }
    catch (Exception)
    {
     column = new DataColumn(name, typeof(object));
    }

    dt.Columns.Add(column);
    }
    row[name] = pInfo.GetValue(t, null);
   }
   dt.Rows.Add(row);
  }
 ds.Tables.Add(dt);
 return ds;
}

środa, 4 stycznia 2012

Domyślny parametr funkcji

Czasami zachodzi potrzeba ustawienie domyślnego parametru przekazywanego funkcji

Aby to wykonać należy sprawdzić czy parametr został zdefiniowany przy przekazaniu np:

function ShowSelected(bCategory)
{
   bCategory = typeof(bCategory) != 'undefined' ? bCategory : true;
...
}

w tym przypadku domyślny parametr jest typu bool i jeżeli nie został przekazany to domyślną wartością jest true;

środa, 8 czerwca 2011

Jak wyświetlić ilość dodanych dzisiaj postów na blogu

W sekcji Head szablonu Blogger-a dodajemy funkcję

<script type="text/javascript" >

//<![CDATA[
 function GetCountPostToday(json){
    var currDate = new Date();
    var CountToday = 0;
    var date = currDate.getFullYear()+'-'+((currDate.getMonth()+1)<10 ? '0'+(currDate.getMonth()+1) : (currDate.getMonth()+1))+'-'+(currDate.getDate()<10 ? '0'+currDate.getDate():currDate.getDate()); 
    for (var i=1; i<=json.feed.entry.length ; i++)
    {
         if (json.feed.entry[i].published.$t.substring(0,10)==date ) CountToday ++; else break;    
    }        
     document.write(CountToday);
   }

//]]></script>


W szablonie wywołujemy skrypt w miejscu w którym ma być wyświetlona ilość postów publikowanych tego dnia

<script src="http://progbis.blogspot.com/feeds/posts/default?alt=json-in-script&start-index=1&max-results=100&callback=GetCountPostToday"></script>


Pamiętają o zmianie adresu bloga :)

Rozwiązanie to ma ograniczenie do 100 postów dziennie. Zmieniając parametr  max-results określimy ilość sprawdzanych postów (max 500)

Jak używać JavaScript w szablonie Bloggera

Aby skorzystać ze skryptu JavasScript w szablonie bloggera, należy skrypt odpowiednio poprzedzić sekcją. Pamiętając o umieszczeniu definicji skryptu w sekcji HEAD
<script type="text/javascript">
//<![CDATA[</code>
    ...skrypt...
i zakończyć sekwencją znaków 
//]]></script>

czwartek, 26 maja 2011

Jak ustawić przezroczystość elementów w css


Przezroczystość elementów na stronie w css najlepiej pokazać na przykładzie.
Oczywiście jest to zależne od przeglądarki.

Test bez użycia przezroczystość

Test z użyciem przezroczystość


<style type="text/css">
  .test1 { opacity: .5; }  //firefox, mozilla,etc.
  .test2 { filter: alpha(opacity=50); } //IE 6-7
  .test3 { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; } //IE8-9
</style>


Do ustawienie działania w różnych wersjach IE zachowujemy kolejność

-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
filter: alpha(opacity=50);

piątek, 20 maja 2011

Dynamiczna, alfabetyczna lista postów blogu jako oddzielna strona

Aby utworzyć dynamiczną, alfabetyczną listę postów na blogu należy (krok po kroku):
  1. dodać widget stron do bloggera
  2. utworzyć na blogerze oddzielną stronę np: Spis alfabetyczny
  3. wprowadzić odpowiedni kod funkcji javascript, korzystający z formatu JSON
  4. wstawić skrypt pobierający posty z bloga.
  5. wykonać skrypt wyświetlający listę
A więc do dzieła. Krok 1,2 pominę gdyż chyba zrozumiałe i pokaże krok 3 i 4

Krok 3
Tworzymy skrypt js jako treść postu, w tym wypadku strony

<script style="text/javascript"> 


Definiujemy tablicę, do której będziemy dodawać posty
 var tabentry = new Array();

Teraz funkcję zwrotną odczytującą posty w formacie JSON i zapisującą posty do tablicy
   function ListaPostow(json) {     
     i=0;
     while (entry = json.feed.entry[i++])
     {
        tabentry.length++;
        tabentry[tabentry.length-1] = entry;
     }    
   }  


Dodajemy funkcję sortującą tablicę postów po tytułach postów
function SortByTitle(a,b)
   {
     if (b.title.$t==a.title.$t) return 0;
     if (a.title.$t>b.title.$t) { return 1; }
     else return -1;
   }


Na koniec funkcję, która wyświetli nam posortowaną listę postów na stronie.
   function ShowListEntry() {
     tabentry.sort(SortByTitle); //sortuj tablicę
     document.write('<table>');
     document.write('<tr><td colspan="2"><ul><h1>Lista alfabetyczna</h1></td></tr>');
    
     for (var i = 0 ; i<tabentry.length ; i++)
     {
       document.write('<tr><td style="padding-right:10px;"><li>');
       var posturl;   
       for (var k = 0; k < tabentry[i].link.length; k++) {
          if (tabentry[i].link[k].rel == 'alternate') {
            posturl = tabentry[i].link[k].href;
             break;
         }
       }
       document.write('<a href="'+posturl+'">');
       document.write(tabentry[i].title.$t);
       document.write('</a></li></td>');
       document.write('<td>(<i>'+ tabentry[i].category[0].term+')</i></td></tr>');
     }
     document.write('</ul></table>');


W tej funkcji wyświetlam listę w postaci tabeli wraz z nazwami przypisanych etykiet do postów.

Zamykamy znacznik skryptu
</script>

Krok 4
Wykonujemy skrypt pobierający listę postów oraz wyświetlamy ją na stronie:

<script src="http://progbis.blogspot.com/feeds/posts/default?alt=json-in-script&start-index=1&max-results=500&callback=ListaPostow"></script>

Pamiętając o podmianie adresu swojego bloga.

Skrypt ten działa do 500 postów, gdyż tyle jednorazowo można pobrać. Jeśli macie więcej to należy odpowiednio dopisać.

<script src="http://progbis.blogspot.com/feeds/posts/default?alt=json-in-script&start-index=501&max-results=500&callback=ListaPostow"></script>


i więcej...
<script src="http://progbis.blogspot.com/feeds/posts/default?alt=json-in-script&start-index=1001&max-results=500&callback=ListaPostow"></script><script>ShowListEntry();</script>

Krok 5
Wykonujemy funkcję, która wyświetli nam posortowaną listę postów
<script>ShowListEntry();</script>

Jak to działa? Sprawdźcie listę wg kategorii na moim blogu
Więcej informacji o formacie JSON i postów bloga znajdziesz pod adresem http://beautifulbeta.wikidot.com/json-feeds

czwartek, 19 maja 2011

Jak wyświetlić ilość postów i komentarzy na blogu

Jeśli chcesz aby na twoim blogu pojawiła się informacja o tym ile zmieściłeś postów oraz ile dodano komentarzy, należy posłużyć się javascipt-em i formatem JSON.
Skrypt najlepiej umieścić w widgecie, w którym informacji o ilości postów czy komentarzy będzie wyświetlana.

<script style="text/javascript">
function numposts(json) {
document.write('Ten blog opublikował ' + json.feed.openSearch$totalResults.$t + ' postów');
}
function numcomments(json) {
document.write(' oraz ' + json.feed.openSearch$totalResults.$t + ' komentarzy');
}</script>


Po czym umieścić w miejscu w którym wyświetlić informację wywołanie skryptu

<script src="http://progbis.blogspot.com/feeds/posts/default?alt=json-in-script&callback=numposts"></script><script src="http://progbis.blogspot.com/feeds/comments/default?alt=json-in-script&callback=numcomments"></script>

pamiętając o podmianie adresu twojego bloga.

czwartek, 28 kwietnia 2011

Richtextbox problem różnych czcionek w c# Net

Problem występuje w sytuacji, gdy zaczytujesz z pliku lub wklejasz ze schowka zaznaczony fragment tekstu.
W richtextbox-ie wyświetlane są różne czcionki o różnych wielkościach znaków, szczególnie przy polskich znaków.
Aby temu zapobiec należy bezpośrednio w designerze dopisać linijkę przed ustawieniem fontów.


this.richTextBox1.LanguageOption = System.Windows.Forms.RichTextBoxLanguageOptions.AutoKeyboard;

i problem znika

piątek, 15 kwietnia 2011

Problem z toolStrip i ImageList w .Net c#

Problem jest następujący. We właściwościach komponentu toolStrip brakuje właściwości ImageList. Jednakże właściwość ta wciąż dostępna jest z poziomu kodu. Wystarczy najlepiej zaraz po inicjacji formy w konstruktorze dodać powiązanie np:
this.toolStrip1.ImageList = imageList1;

Teraz można przy pomocy indeksów ustawiać odpowiednie ikony np:
this.toolStripSplitButton1.ImageIndex = 0; gdzie 0 to index z ImageList

Inny problem jest to, że ustawienie indeksu dla pod menu "ToolStripMenuItem" nie powoduje wyświetlenie ikony. Można zastosować przypisanie do właściwości Image odpowiednią ikonę z ImageList np:
this.ekportToolStripMenuItem.Image = imageList1.Images[0];

poniedziałek, 4 kwietnia 2011

JavaScript jak sprawdzić czy funkcja istnieje

W JavaScript można wykonać to przynajmniej na 2 sposoby:

if(typeof (window.myFunction) == ‘function’) {
// funkcja istnieje więc możemy ją wywołać
myFunction(’foo’, ‘bar’);
}


lub nawet prościej

if(myFunction) { //funkcja istnieje
myFunction(‘foo’, ‘bar’);
}

MySQL i MSSQL Multi Insert

W MySQL realizację wielu insertów (multi insert) wykonujemy w sposób:

insert into `mytable` (fname, lname, address) values
("john", "doe", "123 some st"),
("jane", "doe", "456 other st")


W MSSQL-u już tak pięknie nie jest, ale możemy to samo uzyskać w ten sposób:

insert into `mytable` (fname, lname, address)
Select 'john','doe','123 some st' union all
Select 'jane','doe','456 other st';

MSSQL jak sprawdzić czy tabela istnieje?

Sprawdzenie istnienia tabeli w MSSQL-u jest troszkę bardziej skomplikowane niż w MySQL. W MySQL można wykonywać skrypty bezpośrednio sprawdzając czy tabel istnieje np:
DROP TABLE IF EXISTS table_name;
W MSSQL możemy to zrobić w ten sposób:
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'table_name')
DROP TABLE 'table_name'
Innym rozwiązaniem jest sprawdzenie czy tabela istnieje w obiektach systemowych
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[table_name]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE 'table_name'
Jeszcze innym sposobem jest sprawdzenie czy istnieje obiekt, w tym przypadku nasza tabela.
IF OBJECT_ID('[dbo].[table_name]') IS NOT NULL
DROP TABLE 'table_name'