Sunday, June 22, 2014

Chrome history back does not trigger onload($ready) problem solution.


<script type="text/javascript">
window.addEventListener("pageshow", function() {

       // user codes

}, false);

</script>

Thursday, June 5, 2014

Set paper length for tape(Label) printer ( EPSON OK900P )

procedure TForm1.Button1Click(Sender: TObject);
var
  Device :Array [0..255] of char;
  Driver :Array [0..255] of char;
  Port : Array [0..255] of char;
  hDMode : THandle;
  PDMode : PDEVMODE;

begin
  Printer.PrinterIndex := Printer.PrinterINdex;
  Printer.GetPrinter(Device,Driver,Port,hDMode);
  if hDMode <> 0 then
  begin
      pDMode := GlobalLock(hDMode);
      if pDMode <> nil then
      begin
        pDMode^.dmFields := pdMOde^.dmFields or DM_PAPERLENGTH;// or DM_PAPERWIDTH or DM_PAPERSIZE;

        pDMode^.dmPaperLength := 400;   // millimiter x 10;

        pdMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
        pDMode^.dmDefaultSource := DMBIN_MANUAL;
        GlobalUnlock(hDMode);
      end;
  end;

  Printer.PrinterIndex := Printer.PrinterIndex;

  Printer.BeginDoc;
  with Printer.Canvas
  do
  begin

    Ellipse(0,0,Printer.PageWidth, Printer.PageHeight);
  end;
  Printer.EndDoc;
end;

Tuesday, April 1, 2014

How to make keyboard event handler in delphi component

Ctrl+V를 수신받을때 KeyPress 핸들러에 이상한 코드가 들어온다.
KeyPress를 받지 않을 방법은 없고 KeyPress안에서 Ctrl키가 눌려있는지를
판단해서 단축키에 대한 올바른 처리를 할 수 있다.



KeyPress handler raise after every KeyDown event that handled or not handled.
Example, User press Ctrl + V , KeyDown and KeyPress and KeyUp event called.


in class interface

    procedure KeyPress(var Key: Char); override;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;


in implementation

procedure TClassXXX.KeyDown(var Key: Word; Shift: TShiftState);
begin
   inherited;

    if Key = VK_LEFT then
    begin
       .....
    end;
end;

procedure TClassXXX.KeyPress(var Key: Char);
var
    ShiftState: TShiftState;
    KeyState: TKeyboardState;
begin
    inherited;

    GetKeyboardState(KeyState);
    ShiftState := KeyboardStateToShiftState(KeyState);

    if not ( ssCtrl In ShiftState ) then
    begin
          // key press without control key
    end;
end;


Tuesday, December 17, 2013

GM3188 User Guide PDF

내가 GM3188 메뉴얼을 찾아 30분동안 해맸다.

모토로라사이트는 그저 카타로그에 불가.


문서보기(View document)

어쨋든 올린다.

Monday, December 16, 2013

24비트 비트맵을 디더링된 16비트 비트맵으로 변환 (Convert 24bit bitmap to 16bit with dithering)

아래 그림은 원본임 (Original 25bit bmp)



24비트 이미지를 포토샵에서 16bit bmp 파이롤 저장하면 병신같은 결과가 나타난다.


아래그림은 포토샵에서 저장한것. (16bit bmp from photoshop)



포토샵은 16비트 이미지 저장을 시키면 그냥 모자란 컬러들을 버린다.

그래서 그라데이션 표현이 계단이된다.

디더링을 하면 해결되는데 문제는 디더링은 256 color 나 1bit 컬러로 Color space를 변환할때만 된다는것이고 16bit bmp  저장시에는 그런 옵션이 없다.

따라서 별도의 프로그램을 사용하면 되는데, 그것은 바로..



16bit bmp converted by "ReduceBitDepthCpp.exe"


사용 방법은 매우 간다.

명령창에서 ReduceBitDepthCPP -f bmp  source.bmp out.bmp  식으로 실행하면 된다.



Tuesday, November 26, 2013

STM32F103 내부 플래시 메모리 읽기 쓰기 ( Read, write internal flash memory )


// 헤더파일 추가
#include "stm32f10x_flash.h"

// 소스추가  stm32f10x_flash.c



    // 마지막 블럭에 넣는것으로 가정

    // low(LD),medium(MD) density는 블럭이 1KB, High(HD) density는 2KB 단위임.
 

    //HD 이면서 메모리가 512KB 인경우 마지막 블럭은 255번임
    // 어드레스는 0x08000000 + 255* 2048 => 0x0807F800
 
    #define StartAddr ((u32)0x0807F800)
    #define EndAddr ((u32)0x0807F8FF)
 

    //HD 이면서 메모리가 64KB 인경우 마지막 블럭은 255번임
    // 어드레스는 0x08000000 + 63* 2048 => 0x0801F800
 
    #define StartAddr ((u32)0x0801F800)
    #define EndAddr ((u32)0x0801F8FF)
 


    // MD 이면서 메모리가 64KB 인경우 마지막 블럭은 63번임
    // 어드레스는 0x08000000 + 63* 1024 => 0x0800FC00
 
    #define StartAddr ((u32) 0x0800FC00)
    #define EndAddr ((u32) 0x0800FCFF)
 




//구조체 읽기 쓰기:

typedef struct
{
    unsigned char a;
    unsigned char b;
    unsigned char c;

} TEST_STRUCT;




void test_read()
{
 
    // 구조체 읽기:
    TEST_STRUCT t;

    memcpy( &t, (TEST_STRUCT* ) StartAddr, sizeof( t ));
 
    TEST_STRUCT x;
    memcpy( &x, &t, sizeof(t));
 
    // 이제 t.a, t.b, t.c 에 값이 들어있음.
}

void test_write()
{
 
   
    // 구조체 쓰기
    TEST_STRUCT w;
 
    w.a = 1;
    w.b = 2;
    w.c = 3;
   
 
    unsigned int * p_w = (unsigned int *)&w;
    int byte_align  = 0;
    if( (sizeof(w) % 4) > 0)
        byte_align = 1; // 구조체가 32비트단위가 아닌경우 마지막 떨거지들에 대한처리.

    FLASH_Unlock();
    FLASH_ErasePage(StartAddr);

    for( int i=0; i< sizeof( w ) / 4 + byte_align ; i++)
    {
        FLASH_ProgramWord(StartAddr + (i*4) ,  p_w[i]  );
    }
    FLASH_Lock();
   
}


HAL 버전에서는

#include "stm32f1xx_hal_flash.h"

 
    #define StartAddr ((unsigned int)0x0807F800)
    #define EndAddr ((unsigned int)0x0807F8FF)
    HAL_FLASH_Unlock();

    FLASH_PageErase( StartAddr );
    HAL_FLASH_Program( FLASH_TYPEPROGRAM_WORD, StartAddr, 1234);
    HAL_FLASH_Lock();




Sunday, June 2, 2013

XLSX 파일 읽기

ADO로 xls 파일은 쉽게 열어서 읽을 수 있지만 xlsx 파일을 ADO로 여는것은 사실상 불가능하다.

특히 배포용 프로그램을 만든다면 이건 방법이 없다.

따라서 다른 방법을 찾아야 하는데 다음과 같은 이유로 해결이 가능하다.

1. xlsx 파일은 zip 압축 파일이고 풀면 xml 들이 나온다.

2. 각 xml  들 중에서 내용만 추출한다면 SharedString xml 과 worksheet xml 만 분석하면된다.

이 방법으로 codeproject.com 에서 xlsx 로 검색하면 소스들이 나온다.

나는 일반적인 xml parser를 이용하여 이를 대신하여 프로그램을 작성하려 하고 있고

곧 소스를 올릴 예정이다.