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'

piątek, 1 kwietnia 2011

Utworzenie źródła ODBC DSN w InstallShield do serwera MSSQL

Funkcja tworzy nowe źródło ODBC DSN z ewentualnym usunięciem źródła starego
function BOOL SetNewODBC(sNewZrodlo,sOldZrodlo, szDataBase, szServer, szUser, nVersionSQL)
string RegPath,sKey,sValue,sDriver,sServer,sUser,sDataBase,sClass,sData;     
number nSize,nType,nResult,nDriver,nServer,nUser,nDataBase;
number nsDriver,nsServer,nsUser,nsDataBase,nsDataSource;
begin  
  RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);          
  RegPath="SOFTWARE\\ODBC\\ODBC.INI\\"+sNewZrodlo;
  if (RegDBKeyExist(RegPath)<0) then 
   RegPath="SOFTWARE\\ODBC\\ODBC.INI\\"+sOldZrodlo; 
   if (RegDBKeyExist(RegPath)==1) then     
    sDataBase="";                  
    sValue="Driver";           
    sKey = "SOFTWARE\\ODBC\\ODBC.INI\\"+sOldZrodlo;
    nDriver = RegDBGetKeyValueEx( sKey, sValue, nType, sDriver, nSize );                  
    sValue="Server";                                                                    
    nServer = RegDBGetKeyValueEx( sKey, sValue, nType, sServer, nSize );                  
    sValue="LastUser";                                                                    
    nUser = RegDBGetKeyValueEx( sKey, sValue, nType, sUser, nSize );                  
    sValue="Database";
    nDataBase=RegDBGetKeyValueEx( sKey, sValue, nType, sDataBase, nSize );                  
    
    if ((nDriver==0)&&(nServer==0)&&(nUser==0)) then                        
     sClass="";                                        
     sKey="SOFTWARE\\ODBC\\ODBC.INI\\"+sNewZrodlo;         
     RegPath="SOFTWARE\\ODBC\\ODBC.INI";
     if (RegDBCreateKeyEx(sKey, sClass) < 0) then 
      WriteLog(1,"- nie można utworzyć źrodła ODBC do "+sNewZrodlo);      
     else
      //Zapis wartosci do nowego zrodla                                                       
      WriteLog(1,"- Utworzono klucz ODBC \""+sNewZrodlo+"\"");      
      nType=REGDB_STRING;     
      sKey="SOFTWARE\\ODBC\\ODBC.INI\\"+sNewZrodlo;
      nsDriver = RegDBSetKeyValueEx ( sKey, "Driver", nType, sDriver, nSize ); 
      nsServer = RegDBSetKeyValueEx ( sKey, "Server", nType, sServer, nSize ); 
      nsUser = RegDBSetKeyValueEx ( sKey, "LastUser", nType, sUser, nSize ); 
     if (StrLength(sDataBase)>0) then                            
      sDataBase=szDataBase;
      nsDataBase = RegDBSetKeyValueEx ( sKey, "Database", nType, sDataBase, nSize ); 
     endif;           
     if (nsDriver==0) then WriteLog(2,"- utworzono klucz 'Driver' wartość \""+sDriver+"\"");
          else WriteLog(2,"- nie utworzono wartość klucza 'Driver'"); endif;
     if (nsServer==0) then WriteLog(2,"- utworzono klucz 'Server' wartość \""+sServer+"\"");
          else WriteLog(2,"- nie utworzono wartość klucza 'Server'"); endif;     
     if (nsUser==0)   then WriteLog(2,"- utworzono klucz 'LastUser' wartość \""+sUser+"\"");
          else WriteLog(2,"- nie utworzono wartość klucza 'LastUser'"); endif;          
     if ((StrLength(sDataBase)>0)&&(nsDataBase==0)) then WriteLog(2,"- utworzono klucz 'Database' wartość \""+sDataBase+"\"");    
          else WriteLog(2,"- nie utworzono wartość klucza 'Database'");     
     endif;              
     
     //Utworzenie wpisu do ODBC Data Sources 
     sKey="SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources";
     nsDataSource = RegDBGetKeyValueEx ( sKey, sOldZrodlo, nType, sData, nSize ); 
     if (nsDataSource==0) then
      if (RegDBSetKeyValueEx ( sKey, sNewZrodlo, nType, sData, nSize )==0) then
       WriteLog(2,"- utworzono wartość klucza ODBC Data Sources do "+sNewZrodlo);
      else                                                                       
       WriteLog(2,"- nie utworzono wartość klucza ODBC Data Sources do "+sNewZrodlo);
      endif;;       
     endif;
     
     endif;
     
    else //Brak wszystkich wymaganych danych do utworzenia zrodla ODBC 
     WriteLog(1,"Brak wszystkich wymaganych danych do utworzenia zrodla ODBC  ");   
     //Usuwam zrodla 
    endif;   
  else  //brak sOldZrodla - stworz
      sClass="";                                        
     sKey="SOFTWARE\\ODBC\\ODBC.INI\\"+sNewZrodlo;         
     RegPath="SOFTWARE\\ODBC\\ODBC.INI";
     if (RegDBCreateKeyEx(sKey, sClass) < 0) then 
      WriteLog(1,"- nie można utworzyć źrodła ODBC do "+sNewZrodlo);      
     else
      //Zapis wartosci do nowego zrodla                                                       
      WriteLog(1,"- Utworzono klucz ODBC do "+sNewZrodlo);      
      nType=REGDB_STRING;     
      sKey="SOFTWARE\\ODBC\\ODBC.INI\\"+sNewZrodlo;        
      
      WriteLog(1,"- wyszukiwanie sterownika SQL");
      if (nVersionSQL<90) then                             
       
        if (Is(FILE_EXISTS,WINSYSDIR^"sqlsrv32.dll")) then sDriver = WINSYSDIR^"sqlsrv32.dll";
        elseif (Is(FILE_EXISTS,WINSYSDIR64^"sqlsrv32.dll")) then sDriver = WINSYSDIR64^"sqlsrv32.dll";
        endif;                 
        
      elseif (nVersionSQL>=90)&&(nVersionSQL<100) then
       
        if (Is(FILE_EXISTS,WINSYSDIR^"sqlncli.dll")) then sDriver = WINSYSDIR^"sqlncli.dll";
        elseif (Is(FILE_EXISTS,WINSYSDIR64^"sqlncli.dll")) then sDriver = WINSYSDIR64^"sqlncli.dll";
        endif;                   
      
      elseif (nVersionSQL>=100) then
           if (Is(FILE_EXISTS,WINSYSDIR^"sqlncli10.dll")) then sDriver = WINSYSDIR^"sqlncli10.dll";
        elseif (Is(FILE_EXISTS,WINSYSDIR64^"sqlncli10.dll")) then sDriver = WINSYSDIR64^"sqlncli10.dll";
        elseif (Is(FILE_EXISTS,WINSYSDIR^"sqlncli.dll")) then sDriver = WINSYSDIR^"sqlncli.dll";
        elseif (Is(FILE_EXISTS,WINSYSDIR64^"sqlncli.dll")) then sDriver = WINSYSDIR64^"sqlncli.dll";
        endif;                   
       
      endif;                                      
      WriteLog(2,"- sterownik SQL to \""+sDriver+"\"");
      
      nsDriver = RegDBSetKeyValueEx ( sKey, "Driver", nType, sDriver, nSize ); 
      nsServer = RegDBSetKeyValueEx ( sKey, "Server", nType, szServer, nSize ); 
      nsUser = RegDBSetKeyValueEx ( sKey, "LastUser", nType, szUser, nSize ); 
     if (StrLength(szDataBase)>0) then                                  
      nsDataBase = RegDBSetKeyValueEx ( sKey, "Database", nType, szDataBase, nSize ); 
     endif;           
     if (nsDriver==0) then WriteLog(2,"- utworzono klucz 'Driver' wartość \""+sDriver+"\"");
          else WriteLog(2,"- nie utworzono wartość klucza 'Driver' = \""+sDriver+"\""); endif;
     if (nsServer==0) then WriteLog(2,"- utworzono klucz 'Server' wartość \""+szServer+"\"");
          else WriteLog(2,"- nie utworzono wartość klucza 'Server' = \""+szServer+"\""); endif;     
     if (nsUser==0)   then WriteLog(2,"- utworzono klucz 'LastUser' wartość \""+szUser+"\"");
          else WriteLog(2,"- nie utworzono wartość klucza 'LastUser'"); endif;          
     if ((StrLength(szDataBase)>0)&&(nsDataBase==0)) then WriteLog(2,"- utworzono klucz 'Database' wartość \""+szDataBase+"\"");    
                    else WriteLog(2,"- nie utworzono wartość klucza 'Database' = \""+szDataBase+"\"");    
     endif;              
     
     //Utworzenie wpisu do ODBC Data Sources 
     sKey="SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources";            
     if StrFind(sDriver,"sqlsrv32.dll")>=0 then sData = "SQL Server"; endif;
     if StrFind(sDriver,"sqlncli.dll")>=0 then sData = "SQL Native Client"; endif;
     if StrFind(sDriver,"sqlncli10.dll")>=0 then sData = "SQL Server Native Client 10.0"; endif;
     /*
     if (nVersionSQL<90) then sData = "SQL Server"; 
     elseif (nVersionSQL>=90)&&(nVersionSQL<100) then sData = "SQL Native Client";
     elseif (nVersionSQL>=100) then sData = "SQL Server Native Client 10.0";
     endif;     
     */
     if StrLength(sData)>0 then
      if (RegDBSetKeyValueEx ( sKey, sNewZrodlo, nType, sData, nSize )==0) then
       WriteLog(2,"- utworzono wartość klucza ODBC Data Sources do "+sNewZrodlo+ " na \""+sData+"\"");
      else                                                                       
       WriteLog(2,"- nie utworzono wartość klucza ODBC Data Sources do "+sNewZrodlo+ " na \""+sData+"\"");
      endif;  
     else
      WriteLog(1,"Błąd rozpoznania sterownika SQL. Nie można utworzyć ODBC Data Sources do \""+sNewZrodlo+ "\""); 
     endif;
    
    endif;     
     
   endif;        
   
  else
   WriteLog(2,"Istnieje klucz ODBC "+sNewZrodlo); 
  endif;
end;

Funkcja sprawdzająca czy podany ciąg znaków jest numerem Portu w InstallShield

Funkcja sprawdza czy podany ciąg znaków jako parametr jest numerem Portu

- zwraca true/false

function BOOL IsPort(szPort)
BOOL bResult;           
string tab,adr;         
string znak;                                
int i,nPort;                        
begin       
 tab = "0123456789"; 
 bResult = TRUE;                
 if (StrLength(szPort)<2)||(StrLength(szPort)>5) then return FALSE; endif;
  //sprawdzenie dozwolonych znaków
  for i=0 to (StrLength(szPort)-1) 
   StrSub(znak,szPort,i,1);  
   if (StrFind(tab,znak)<0) then return FALSE; endif;
  endfor;           
 
  //Pierwsza cyfra 0
  StrSub(znak,szPort,0,1);
  if znak="0" then return FALSE; endif;
 
  //Przy porcie 2-cyfrowym - Port >= 80
  if (StrLength(szPort)=2) then
   StrToNum(nPort,szPort);
   if nPort<80 then return FALSE; endif;
  endif;
 
 return bResult;
end;

Pobranie ścieżki do zainstalowanego serwera Apache Tomcat w Installshield

Funkcja wykrywa i zwraca ścieżkę do zainstalowanego serwera Apache Tomcat
- parametrami funkcji są 2 zmienne: szName - nazwa Serwera Tomcat np ""apache-tomcat-6.0.20" oraz - bLog (bool) - (zmienna określająca zapis do logu)
- funkcja zwraca ściezkę lub pusty string
function STRING GetTomcatPath(szName, bLog)
STRING szPath;                                                
string sKey,sValue,sData;          
number nSize,nType,nResult;
begin                                                         
 szPath = "";
 if bLog then WriteLog(0,"* Wykrywanie katalogu Tomcata"); endif;
  if (Is(PATH_EXISTS,PROGRAMFILES ^ szName)) then
   szPath =   PROGRAMFILES ^ szName;
   if bLog then WriteLog(1,"- katalog: \""+szPath+"\""); endif;  
   else                                      
    if bLog then WriteLog(1,"- Sprawdzenie w rejestrach"); endif;
 RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); 
 sKey = "SOFTWARE\\Apache Software Foundation\\Tomcat\\6.0";
 if (RegDBKeyExist(sKey)==1) then 
    sValue="InstallPath";                 
    if bLog then WriteLog(1,"- znaleziono klucz instalacyjny"); endif;
   if (RegDBGetKeyValueEx( sKey, sValue, nType, sData, nSize )==0) then
    if (Is(PATH_EXISTS,sData)) then
     szPath = sData;
     if bLog then WriteLog(1,"- katalog: \""+szPath+"\"");endif;  
    else
     if bLog then WriteLog(1,"- katalog nie istnieje: \""+szPath+"\""); endif;   
    endif;
   endif;
  endif; 
 endif;
 
 if StrLength(szPath)=0 then
   if bLog then WriteLog(1,"- nie wykryto"); endif;
 endif; 
 
 return szPath;
end; 

Pobranie ścieżki do zainstalowanego modułu Java JRE w InstallShield

Prosta funkcja zwracająca ścieżkę do zainstalowanego modułu Java JRE
- funkcja zwraca pusty string jeżeli nie znajdzie zainstalowanego modułu Java JRE.
function STRING GetJavaPath()
STRING szPath,szMsg;
NUMBER nResult;
begin         
 szPath = "";
 if (Is(PATH_EXISTS,PROGRAMFILES ^ "Java" ^ "jre6")) then
  szPath =   PROGRAMFILES ^ "Java" ^ "jre6";
 elseif (Is(PATH_EXISTS,PROGRAMFILES ^ "Java" ^ "jre5")) then
  szPath =   PROGRAMFILES ^ "Java" ^ "jre5";
 elseif (Is(PATH_EXISTS,PROGRAMFILES64 ^ "Java" ^ "jre6")) then
     szPath =   PROGRAMFILES64 ^ "Java" ^ "jre6";
 elseif (Is(PATH_EXISTS,PROGRAMFILES64 ^ "Java" ^ "jre5")) then
     szPath =   PROGRAMFILES64 ^ "Java" ^ "jre5";    
 else                                                           
     Dlg_AskGetJavaPath:
   nResult =  AskPath("Wskaż folder instalacji środowiska Java", PROGRAMFILES ^ "Java\\jre6", szPath);  
   if (nResult = NEXT) then
     if (! (Is(PATH_EXISTS,szPath ^ "bin"))  ) then
       szMsg = "Wskazana ścieżka nie zawiera katalogu bin środowiska java!\Czy chcesz wskazać inny?";
       if AskYesNo(szMsg,YES)=YES then 
         goto Dlg_AskGetJavaPath;
       else 
        szPath = "";
       endif;          
    endif;
  endif;
 endif;      
 return szPath;
end;                     

InstallShield - funkcje na elementach oknach dialogowych

Przy projektowaniu okien dialogowych w Installshield brakuje niektórych
funkcji dostępnych bezpośrednio w InstallShield.

Poniżej prezentuje niektóre z nich:

  • hwndDlg = CmdGetHwndDlg( "Nazwa okna dialogowego" ); - pobranie uchwytu okna dialogowego (wbudowane funkcja installshield), zmienna hwndDlg jest typu HWND
  • hObj = _WinSubGetChildWindow(hwndDlg, numer); - pobranie uchwytu elementu (hObj) okna, numer - oznacza numer ID elementu w oknie
  • _WinSubShowWindow(hObj, 0); - Ukrycie lub Pokazanie elementu Okna o uchwycie hObj, parametr 0 lub 1 oznacza odpowiednio HIDE/SHOW
  • _WinSubFocusControl(hwndDlg, numer); - ustawienie focus-u na elemencie okna o odpowiednim numerze ID
  • _WinSubEnableControl (hwndDlg, numer, 1 lub 0); - Aktywacja/Deaktywacja elementu okna o odpowiednim numerze ID, parametr 1/0 oznacza odpowiednio aktywny/nieaktywny