wtorek, 25 maja 2010

Flex: Rozszerzenie klasy Alert jako oddzielny komponent

Flex nie umożliwia zwracania wartości przy używaniu klasy Alert, szczególnie gdy chcemy obsłużyć odpowiedź na pytania Tak/Nie. Standardowo odpowiedzi wyboru obsługuje się przez zdarzenie CloseEvent. Jest to dość uciążliwe jeżeli w aplikacji mamy kilkadziesiąt pytań o wykonanie jakiejś czynności. Poniżej prezentuje komponent rozszerzający klasę Alert, dodatkowo dodajemy własne ikony do różnych typów alertów.
Poddany przykład poniżej przenosi obsługę zdarzenia na funkcję zewnętrzna np. z poziomu głównej aplikacji.
Oto główna paczka z komponentem rozszerzonym Alert;
 package myComponent
{
    import mx.controls.Alert;
    import mx.core.Application;
    import mx.events.CloseEvent;

    public class alert extends Alert
    {
        yesLabel = "Tak";
        noLabel = "Nie";
        cancelLabel = "Anuluj";
               
        [Bindable]
        [Embed(source="icons/dialog-information.png")]
        private static var IconInfo:Class;
       
        [Bindable]
        [Embed(source="icons/dialog-question.png")]
        private static var IconQuestion:Class;
       
        [Bindable]
        [Embed(source="icons/dialog-error.png")]
        private static var IconError:Class;
       
        [Bindable]
        [Embed(source="icons/dialog-warning.png")]
        private static var IconWarning:Class;
       
        private static var ParentApp:* = Application.application;       
        private static var idFun: uint = 0;
        private static var bQuestion: Boolean = false;
       
        public function alert()
        {
            super();       
        }       

        public static function warning(Msg : String) : void {                       
            show(Msg,"Ostrzeżenie",mx.controls.Alert.OK,null,closeHandle,IconWarning);
        }
       
        public static function error(Msg : String) : void {
            show(Msg,"Błąd",mx.controls.Alert.OK,null,closeHandle,IconError);                   
        }
       
        private static function closeHandle(event:CloseEvent):void{           
            switch (event.detail) {
                case Alert.OK: break;
                case Alert.YES: if (bQuestion) ParentApp.AlertQuestionFun(idFun); break;
            }           
        }
           
        public static function info(Msg : String) : void {           
            show(Msg,"Informacja",mx.controls.Alert.OK, null , closeHandle, IconInfo);
        }
       
        public static function question(Msg : String, funId : uint) : void {
            idFun = funId;   
            bQuestion = true;       
            show(Msg,"Pytanie",mx.controls.Alert.YES | mx.controls.Alert.NO, null, closeHandle, IconQuestion);           
        }       
    }
}

Do głównej aplikacji importujesz rozszerzoną i dodajesz funkcję obsługi
<mx:Script>
        <![CDATA[
            import myComponent.alert;
            public function AlertQuestionFun(fun : int) : void {
                switch (fun) { 
                    case 1: {Alert.show("Test - wykonanie funkcji obsługi nr 1");} break;
                    case 2: {Alert.show("Test - wykonanie funkcji obsługi nr 2");} break;
                }
            }
 ]]>
    </mx:Script> 

I używasz rozszerzonej klasy w ten sposób:
alert.info("Ważne informacje dotyczące wykonywanych operacji");
- dla wyświetlenia informacji
alert.warning("Uwaga! Nie można wykonać tej czynności");
 
- dla wyświetlenia ostrzeżenia
alert.error("Kopiowanie danych nie powiodło się!");
 
- dla wyświetlenia błędu wykonania

alert.question("Czy napewno chcesz to zrobic?", 1);
 
- dla wyświetlenia pytania o wykonanie czynności.
Zwróć uwagę, że w ostatnim przykładzie przekazujesz nr funkcji do wykonania (1) w przypadku akceptowanie czynności

czwartek, 20 maja 2010

Problem połączenia do serwera MSSQL z PHP

Problem dotyczy połączenia do serwera MSSQL 2005 z poziomu PHP.
Jest kilka warunków, które muszą być spełnione aby można było się połączyć z serwerem MSSQL
1. Po pierwsze - zainstalowany moduł php z rozszerzeniem mssql.
2. Standardowa instalacja PHP zawiera starą bibliotekę "ntwdblib.dll", która umożliwia tylko połączenie do serwera "SQL Server 7.0/2000". Należy pobrać nowszą wersję biblioteki "ntwdblib.dll" z np: http://www.dlldll.com/ntwdblib.dll_download.html i podmienić
3. Należy upewnić się, czy protokoły (TCP/IP and Named Pipe) dla instancji MSSQL są aktywne, jeżeli nie to je uaktywnić.
4. Czasami należy ustawić stały port połączenia dla instancji MSSQL.
5. Zrestartować serwer MSSQL jak i serwer WWW

To w zasadzie wystarcza aby połączyć się z serwerem MSSQL 2005/2008. Wystarczy tylko przeprowadzić test połączenia np: korzystając z poniższego skryptu.
<?php 
$mssqlHost = "hostname\\SQLEXPRESS"; #It is MSSQL Instance name
$mssqlUser = 'sa';
$mssqlPass = '12345';  #Your pass for sa
$s = mssql_connect($mssqlHost,$mssqlUser,$mssqlPass) or die('Could not connect to SQL Server on '.$mssqlHost.' '. mssql_get_last_message());
echo $s;
?>

poniedziałek, 10 maja 2010

Konwersja polskich znaków z systemu Horizon na win-cp1250

Funkcja zwraca CString w formacie win-Cp1250 z polskimi znakami zakodowanymi w systemie Horizon
CString HorizonTo1250(CString str)
{
    for (int i=0; i<str.GetLength(); i++)
    {
        switch ((unsigned char)str.GetAt(i)) {
            case 0xB1: str.SetAt(i,(char)0xB3); break;
            case 0xA1: if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0xE2) ) { 
                            str.SetAt(i,(char)0xA3);
                            str.Delete(i+1);
                       } break;    
            case 0xE2: {
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x6F) ) { 
                                str.SetAt(i,(char)0xF3);  //ó
                                str.Delete(i+1);
                            } else 
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x4F) ) { 
                                str.SetAt(i,(char)0xD3);  //Ó
                                str.Delete(i+1);
                            } else
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x7A) ) { 
                                str.SetAt(i,(char)0x9F);  //ź
                                str.Delete(i+1);
                            } else
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x5A) ) { 
                                str.SetAt(i,(char)0x8F);  //Ź
                                str.Delete(i+1);
                            } else
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x63) ) { 
                                str.SetAt(i,(char)0xE6);  //ć
                                str.Delete(i+1);
                            } else
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x43) ) { 
                                str.SetAt(i,(char)0xC6);  //Ć
                                str.Delete(i+1);
                            } else
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x6E) ) { 
                                str.SetAt(i,(char)0xF1);  //ń
                                str.Delete(i+1); 
                            } else 
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x4E) ) { 
                                str.SetAt(i,(char)0xD1);  //Ń
                                str.Delete(i+1);
                            } else 
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x73) ) { 
                                str.SetAt(i,(char)0x9C);  //ś
                                str.Delete(i+1);
                            } else 
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x53) ) { 
                                str.SetAt(i,(char)0x8C);  //Ś
                                str.Delete(i+1);
                            }  

                       } break;
            case 0xE7: {
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x5A) ) { 
                                str.SetAt(i,(char)0xAF);  //Ż
                                str.Delete(i+1);
                            } else
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x7A) ) { 
                                str.SetAt(i,(char)0xBF);  //ż
                                str.Delete(i+1);
                            }    
                       } break;
            case 0xF1: {
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x65) ) { 
                                str.SetAt(i,(char)0xEA);  //ę
                                str.Delete(i+1);
                            } else
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x45) ) { 
                                str.SetAt(i,(char)0xCA);  //Ę
                                str.Delete(i+1);
                            } else
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x61) ) { 
                                str.SetAt(i,(char)0xB9);  //ą
                                str.Delete(i+1);
                            } else
                            if ( (i+1<str.GetLength())&&((unsigned char)str.GetAt(i+1)==0x41) ) { 
                                str.SetAt(i,(char)0xA5);  //Ą
                                str.Delete(i+1);
                            }
                       } break;
        }

    }

    return str;
}

piątek, 7 maja 2010

Rejestry ODBC x86 w systemach x64

Klucze rejestru ODBC do wersji x64 znajdują się w tym samym miejscy co w systemach 32-
bitowych, czyli „HKLM\SOFTWARE\ ODBC\ODBC.INI\”. Klucze do źródeł ODBC 32-bitowych znajdują się w innym miejscu: „HKLM\SOFTWARE\Wow6432Node\ODBC\ODBC.INI\”

Źródła danych 32 bit ODBC na x64

W systemach x64 do zarządzania źródłami ODBC służy Administrator ODBC, jednakże obsługuje on tylko źródła 64-bitowe. Do obsługi źródeł danych 32-bitowych służy
również Administrator ODBC, ale nie jest on dostępny z poziomu narzędzi administracyjnych.
Chcąc skonfigurować/zmienić/usunąć źródła danych należy uruchomić Administrator ODBC dla danych 32-bitowych ręcznie z linii poleceń „C:\Windows\SysWOW64\odbcad32.exe”.

środa, 5 maja 2010

Pobieranie scieżki do php.ini z konfiguracji Apache

Parametry Funkcji:
szApacheConfigFile - scieżka do pliku konfiguracji Apache,
svPHPIniDir - ścieżka do php.ini jak zwracana
bLog - zapis do pliku log
Funkcja zwraca 2 wartość - true/false jako funkcja i svPHPIniDir jako ścieżka do pliki php.ini w przypadku detekcji konfiguracji php.ini w pliku konfiguracji serwera Apache -> httpd.conf
function BOOL GetApachePHPIniDir(szApacheConfigFile, svPHPIniDir, bLog)
BOOL bResult;
LIST lsApache;
string szLine;
int i;
begin
    if (bLog) then WriteLog(0,"* Pobieranie scieżki do php ini z konfiguracji Apache..."); endif;
    bResult = FALSE;
    if (Is(FILE_EXISTS,szApacheConfigFile)) then
        lsApache = ListCreate(STRINGLIST);
        ListReadFromFile ( lsApache, szApacheConfigFile ); //Odczyt Apache Conf
        if (ListCount(lsApache)>0) then         
                ListSetIndex(lsApache,LISTFIRST);                
                  for i=0 to ListCount(lsApache)-1                    
                      ListCurrentString ( lsApache, szLine ); 
                    szLine = StrTrim(szLine);
                    if (StrFind(szLine, "PHPIniDir")=0) then
                        StrSub(svPHPIniDir, szLine, 9, StrLength(szLine));
                        svPHPIniDir = StrTrim(svPHPIniDir);
                        StrReplace(svPHPIniDir,'"','',0);
                        StrReplace(svPHPIniDir,"/","\\",0);
                        if (bLog) then WriteLog(1,"- ścieżka do php.ini: "+svPHPIniDir); endif;
                        bResult = TRUE;
                      endif;
                      ListSetIndex(lsApache,LISTNEXT);
                  endfor;    
          endif;            
    endif;
    
    ListDestroy(lsApache);
    
    return bResult;
end;

Detekcja Adobe Reader w InstallShield InstallScript

Prosta funkcja detekcyjna zainstalowanego Adobe Reader w systemie
Windows. Funkcja zwraca true/false w zależności od rezultatu detekcji.
Parametrem przekazywanym jest tylko informacja o tym czy zapisać
wyniki detekcji do pliku log
function BOOL DetectAdobeReader(bLog)
string RegPath,sVersion,sVer;
number nSize,nType,nResult,i;
LIST nList;
BOOL bResult;
begin                                      
    bResult = FALSE;
    if (bLog) then WriteLog(0,"* Sprawdzenie zainstalowanego Adobre Reader"); endif;
    RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);          
     RegPath="SOFTWARE\\Adobe\\Acrobat Reader";
     if (RegDBKeyExist(RegPath)=1) then 
        
        nList  = ListCreate(STRINGLIST);
        nResult = RegDBQueryKey ( RegPath, REGDB_KEYS, nList ); 
        if (nResult = 0) then     
           if (ListCount(nList)>0) then   
                if (bLog) then WriteLog(1," - znaleziono wersje:"); endif;
                ListSetIndex(nList,LISTFIRST);    
                for  i=0 to ListCount(nList)-1  
                    ListCurrentString(nList,sVer);
                    if (bLog) then WriteLog(2,sVer); endif; 
                    ListSetIndex(nList,LISTNEXT); 
                endfor;    
                bResult = TRUE;
           else
                   if (bLog) then WriteLog(1," - pobrana lista kluczy jest pusta"); endif;    
           endif;
        else
            if (bLog) then WriteLog(1," - nie udało się pobrać listy kluczy rejestru"); endif;
        endif;

        
        nType = REGDB_STRING; 
        nSize = 255;
            
           ListDestroy(nList);
     else 
           if (bLog) then WriteLog(1,"- nieznaleziono"); endif;
     endif; 
    
    return bResult;
end; 

Jak wykryć zainstalowane sterowniki HASP w InstallShield

Funkcja oparta jest o rejestry windows. Zwraca wartość true/false oraz wersję zainstalowanego sterownika HASP. Przeznaczona jest do wykrywania sterowników w wersji >= 4.1

function BOOL DetectHasp(sVerC, bLog) 
//sVerC - wersja do sprawdzenia
//bLog - TRUE - zapisywanie informacji w plku log
string RegPath,sVersion,sVer;
number nSize,nType;
BOOL bResult;
begin  
if (bLog) then WriteLog(0,"* Sprawdzenie zainstalowanych sterowników HASP4 i nowszych"); endif;
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);         
 RegPath="SOFTWARE\\Aladdin Knowledge Systems\\HASP\\Driver\\Installer";
 if (RegDBKeyExist(RegPath)=1) then
    nType = REGDB_STRING;
    nSize = 255;
    if (RegDBGetKeyValueEx(RegPath,"Hasp4Version",nType,sVersion,nSize)=0) then
          //Spradzenie czy wersja zainstalowanego Hasp <4.1
          if (bLog) then WriteLog(1,"- zainstalowany HASP w wersji:"+sVersion); endif;
          StrSub(sVer,sVersion,0,3);               
          if (StrCompare(sVer,sVerC)>=0) then bResult = TRUE;
                                          else bResult = FALSE;     
          endif;                                                  
       else
           if (RegDBGetKeyValueEx(RegPath,"Version",nType,sVersion,nSize)=0) then //Sprawdzenie dla HASP_HL ver 5.5
               if (bLog) then WriteLog(1,"- zainstalowany HASP w wersji:"+sVersion); endif;
               StrSub(sVer,sVersion,0,3);               
              if (StrCompare(sVer,sVerC)>=0) then bResult = TRUE;
                                                 else bResult = FALSE;     
              endif;                                                  
           else     
             //if (bLog) then WriteLog(1,"- wykryto HASP w wersji mniejszej niż "+sVerC); endif;
             bResult = FALSE; 
         endif;   
       endif;
 else
   if (bLog) then WriteLog(1,"- nieznaleziono"); endif;
   bResult = FALSE;
 endif;
 
 //Sprawdzenie jescze czy nie jest to Hasp 4.96
 if (!bResult) then
     RegPath="SYSTEM\\ControlSet001\\Services\\Haspnt";
     if (RegDBKeyExist(RegPath)=1) then
        nType = REGDB_STRING;
        nSize = 255;
        if (RegDBGetKeyValueEx(RegPath,"Version",nType,sVersion,nSize)=0) then //Sprawdzenie dla HASP4.96
                   if (bLog) then WriteLog(1,"- zainstalowany HASP w wersji:"+sVersion); endif;
                   StrSub(sVer,sVersion,0,3);               
                  if (StrCompare(sVer,sVerC)>=0) then bResult = TRUE;
                                                     else bResult = FALSE;     
                  endif;                                                             
        endif;           
     endif;  
 endif;
 
 return bResult;
end;