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".
Programowanie c++/c#/delphi/javas/php/installscript/nativescript
Przykłady - przydatne funkcje
piątek, 29 czerwca 2012
czwartek, 16 lutego 2012
Konwersja IList do DataSet - IList to DataSet
Poniżej funkcja konwertująca Ilist-ę do DataSet-a
Param: IList
Return: DataSet
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;
}
Etykiety:
c#
ś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;
Etykiety:
javascript
środa, 8 czerwca 2011
Jak wyświetlić ilość dodanych dzisiaj postów na blogu
W sekcji Head szablonu Blogger-a dodajemy funkcję
W szablonie wywołujemy skrypt w miejscu w którym ma być wyświetlona ilość postów publikowanych tego dnia
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)
<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)
Etykiety:
Blogger
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>
Etykiety:
Blogger
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);
Etykiety:
CSS
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):
Krok 3
Tworzymy skrypt js jako treść postu, w tym wypadku strony
Definiujemy tablicę, do której będziemy dodawać posty
Teraz funkcję zwrotną odczytującą posty w formacie JSON i zapisującą posty do tablicy
Dodajemy funkcję sortującą tablicę postów po tytułach postów
Na koniec funkcję, która wyświetli nam posortowaną listę postów na stronie.
W tej funkcji wyświetlam listę w postaci tabeli wraz z nazwami przypisanych etykiet do postów.
Zamykamy znacznik skryptu
Krok 4
Wykonujemy skrypt pobierający listę postów oraz wyświetlamy ją na stronie:
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ć.
i więcej...
Krok 5
Wykonujemy funkcję, która wyświetli nam posortowaną listę postów
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
- dodać widget stron do bloggera
- utworzyć na blogerze oddzielną stronę np: Spis alfabetyczny
- wprowadzić odpowiedni kod funkcji javascript, korzystający z formatu JSON
- wstawić skrypt pobierający posty z bloga.
- wykonać skrypt wyświetlający listę
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
Etykiety:
Blogger
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.
Po czym umieścić w miejscu w którym wyświetlić informację wywołanie skryptu
pamiętając o podmianie adresu twojego bloga.
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.
Etykiety:
Blogger
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.
i problem znika
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
Etykiety:
c#
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:
Teraz można przy pomocy indeksów ustawiać odpowiednie ikony np:
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.toolStrip1.ImageList = imageList1;Teraz można przy pomocy indeksów ustawiać odpowiednie ikony np:
this.toolStripSplitButton1.ImageIndex = 0; gdzie 0 to index z ImageListInny 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];
Etykiety:
c#
poniedziałek, 4 kwietnia 2011
JavaScript jak sprawdzić czy funkcja istnieje
W JavaScript można wykonać to przynajmniej na 2 sposoby:
lub nawet prościej
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’);
}
Etykiety:
javascript
MySQL i MSSQL Multi Insert
W MySQL realizację wielu insertów (multi insert) wykonujemy w sposób:
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) 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';
Etykiety:
SQL
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')Innym rozwiązaniem jest sprawdzenie czy tabela istnieje w obiektach systemowych
DROP TABLE 'table_name'
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[table_name]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)Jeszcze innym sposobem jest sprawdzenie czy istnieje obiekt, w tym przypadku nasza tabela.
DROP TABLE 'table_name'
IF OBJECT_ID('[dbo].[table_name]') IS NOT NULL
DROP TABLE 'table_name'
Etykiety:
SQL
Subskrybuj:
Posty (Atom)