Owl-Networks Archive
| 분류: Perl | 최초 작성: 2012-02-12 06:52:16 |
☞ 태그: Strawberry Perl, ActivePerl,
☞ 트랙백 접수 모듈이 설치되지 않았습니다.
☞ 덧글이 1 개 있고, 트랙백이 없습니다.
□ 저니리 님께서 2012-02-17 23:19:44 에 작성해주셨습니다.
ActivePerl에서 cpan을 지원하더구만... cpan을 실행하면 MinGW를 다운받기 시작더만.... 과거 윈도우에서는 컴파일러의 부재로 인하여 ActivePerl이나 Straberry Perl이나 cpan을 사용하지 못했는데, 지금은 다 쓸 수 있게 해놨더군... 내가 Perl 가지고 끄적 거릴 때는 되는 게 없었는데 말이야.... ActivePerl의 경우 패키지 매니저로 윈도우에 설치될 수 있는 패키지는 미리 자기들이 받아서 컴파일 해놔서 64비트나 32비트에 관한 문제가 발생하지 않도록 막아주니 윈도 환경에서는 ActivePerl이 현재로써는 더 좋은게 분명하오. 64비트 윈도에서 Win32::GUI는 ActivePerl이 아니면 깔 방법이 없소.
그렇지만!!!
Perl은 전통적으로 리눅스에서 사용되는 일이 많은 녀석이오. 물론 리눅스에 설치나 실행이 불가능한 패키지가 있는 것도 사실이지만, 리눅스의 시스템 함수나 라이브러리를 참조하는 패키지도 졸라게 많은게 사실.
아래는 만들다가 만 거. (옆에서 C#으로 만든 걸 기다리는 중... 개발 속도가 너무 차이가 나서 따라갈 수가 없어...)
use Win32::GUI;
use Win32::GUI::Grid;
use Carp;
use FindBin;
use Win32::OLE qw( EVENTS );
use Number::Format qw(:subs);
#my $DOS = Win32::GUI::GetPerlWindow();
#Win32::GUI::Hide($DOS);
my $DEFAULT_USR_ID = '';
my $DEFAULT_USR_PASSWD = '';
my $DEFAULT_ACCOUNT = '';
my $DEFAULT_ACCOUNT_PASSWD = '0000';
#####################################################################
#
#####################################################################
our $XASession = Win32::OLE->new('XA_Session.XASession');
Win32::OLE->WithEvents(
$XASession,
\&XASessionEventsHandler,
'{6D45238D-A5EB-4413-907A-9EA14D046FE5}',
);
croak Win32::OLE->LastError if Win32::OLE->LastError != 0;
sub XASessionEventsHandler {
my ($obj, $event, @args) = @_;
my ($code, $msg) = @args;
if($event == 1){ # on loginls -al;l
$MAIN_SBAR->Text("[$code] $msg");
Win32::OLE->QuitMessageLoop;
}
elsif($event == 2){ # on logout
$MAIN_SBAR->Text("ERROR - Logout. (" . $XASession->GetErrorMessage( $XASession->GetLastError ) . ")");
}
elsif($event == 3){ # on disconnect
$MAIN_SBAR->Text("ERROR - Disconnected.(" . $XASession->GetErrorMessage( $XASession->GetLastError ) . ")");
}
};
#####################################################################
# MAIN Window
#####################################################################
our $MAIN_WIN = new Win32::GUI::Window (
-title => "System Trading with PERL",
-pos => [100, 100],
-width => 800,
-height => 400,
-name => "MainWindows",
-resizable => 0
) or die "new Window";
#####################################################################
# Main Windows Event Handler
#####################################################################
sub MainWindows_Terminate {
return -1;
}
our $MAIN_SBAR = $MAIN_WIN->AddStatusBar();
#####################################################################
#Login Group Box
#####################################################################
$LABEL_GUIDE_H1 = 20;
$TEXTFIELD_GUIDE_H1 = 120;
$TEXTFILED_SIZE = 120;
$MAIN_WIN->AddGroupbox(
-name => "LoginGroupBox",
-text => "Login Information",
-pos => [5, 5],
-width => 250,
-height => 150
);
# ID
$MAIN_WIN->AddLabel(
-name => 'LoginLabelID',
-text => 'ID',
-pos => [$LABEL_GUIDE_H1, 30],
-width => 80,
-height => 25
);
my $USR_ID = $MAIN_WIN->AddTextfield(
-name => "LoginTextFieldID",
-text => $DEFAULT_USR_ID,
-pos => [$TEXTFIELD_GUIDE_H1,25],
-width => $TEXTFILED_SIZE,
-height => 25,
-prompt => ""
);
# PASSWORD
$MAIN_WIN->AddLabel(
-name => 'LoginLabelPASSWD',
-text => 'Password',
-pos => [$LABEL_GUIDE_H1, 60],
-width => 80,
-height => 25
);
my $USR_PASSWD = $MAIN_WIN->AddTextfield(
-name => "LoginTextFieldPASSWD",
-text => $DEFAULT_USR_PASSWD,
-password => 1,
-pos => [$TEXTFIELD_GUIDE_H1,55],
-width => $TEXTFILED_SIZE,
-height => 25,
-prompt => ""
);
# CERTIFICATE PASSWORD
$MAIN_WIN->AddLabel(
-name => 'LoginLabelCERTPASSWD',
-text => 'Cert Password',
-pos => [$LABEL_GUIDE_H1, 90],
-width => 100,
-height => 25
);
my $USR_CERT_PASSWD = $MAIN_WIN->AddTextfield(
-name => "LoginTextFieldCERTPASSWD",
-text => '',
-password => 1,
-pos => [$TEXTFIELD_GUIDE_H1,85],
-width => $TEXTFILED_SIZE,
-height => 25,
-prompt => ""
);
# LOGIN BUTTON
our $LOGIN_BUTTON = $MAIN_WIN->AddButton(
-name => "LoginButton",
-text => "Do Login!",
-pos => [$TEXTFIELD_GUIDE_H1,115],
-width => $TEXTFILED_SIZE,
-height => 25,
-onClick => sub {
$USR_CERT_PASSWD->Text();
my $server = 'demo.etrade.co.kr'; # server
my $port = 20001; # port
my $srvtype = 1; # server type
my $showcerterr = 1; # certificate error
if(!$XASession->IsConnected()){ # 연결되지 않았을 때만,
$XASession->ConnectServer($server, $port) or croak $XASession->GetErrorMessage( $XASession->GetLastError );
$XASession->Login($USR_ID->Text(), $USR_PASSWD->Text(), $USR_CERT_PASSWD->Text(), $srvtype, $showcerterr) or croak $XASession->GetErrorMessage( $XASession->GetLastError );
Win32::OLE->MessageLoop;
LOAD_MY_STOCKS(); # 보유 주식 로드
$LOGIN_BUTTON->Disable();
}
}
);
#####################################################################
# Stock Data Grid
#####################################################################
our @GRID_COL_NAME = ('Name','Purchase UPrice','Currnet UPrice','Quantity','Evalued TPrice','Eearning TPrice','Eearning Rate');
our @GRID_COL_STYLE = (
DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX,
DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX,
DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX,
DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX,
DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX,
DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX,
DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX);
our $COUNT_GRID_COL = $#GRID_COL_NAME+1;
our $STOCK_LIST_GRID = new Win32::GUI::Grid (
-parent => $MAIN_WIN,
-name => "StockListGrid",
-pos => [5, 160],
-width => 785,
-height => 185,
-hscroll => 1,
-editable => 0
) or die "new Grid";
# Init Grid
$STOCK_LIST_GRID->SetRows(1);
$STOCK_LIST_GRID->SetColumns($COUNT_GRID_COL);
$STOCK_LIST_GRID->SetFixedRows(1);
$STOCK_LIST_GRID->SetFixedColumns(0);
for($i = 0;$i < $COUNT_GRID_COL;$i++){
$STOCK_LIST_GRID->SetCellFormat(0, $i, DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX);
$STOCK_LIST_GRID->SetCellText(0, $i, $GRID_COL_NAME[$i]);
}
# Resize Grid Cell
$STOCK_LIST_GRID->AutoSize();
# Event loop
$MAIN_WIN->Show();
Win32::GUI::Dialog();
#Win32::GUI::Show($DOS);
#exit(0);
##########
#
#######
sub DELETE_ALL_STOCK_GRID{
# 행 단위로 모두 삭제
my $exit_rows_count = $STOCK_LIST_GRID->GetRows();
for($i = $exit_rows_count;$i > 1;$i--){ # 밑에서 한줄씩 삭제, 헤더 제외
$STOCK_LIST_GRID->DeleteRow($i)
}
}
sub INSERT_ROW_TO_END_LINE{
@ARG_VAL = @_;
my $last_line = $STOCK_LIST_GRID->InsertRow("",-1); # 그리드에 행 추가, 맨 마지막
for(my $j = 0;$j < $COUNT_GRID_COL;$j++){
$STOCK_LIST_GRID->SetCellFormat($last_line, $j, $GRID_COL_STYLE[$j]);
$STOCK_LIST_GRID->SetCellText($last_line, $j, $ARG_VAL[$j]);
}
$STOCK_LIST_GRID->Refresh();
}
sub LOAD_MY_STOCKS{
my $XAQuery = Win32::OLE->new('XA_DataSet.XAQuery') or croak Win32::OLE->LastError;
Win32::OLE->WithEvents(
$XAQuery,
\&XAQueryLoadMyStocksEventsHandler,
'{AAF89E20-1F84-4B1F-B6EE-617B6F2C9CD4}',
);
croak Win32::OLE->LastError if Win32::OLE->LastError != 0;
$XAQuery->LoadFromResFile("$FindBin::Bin/Res/Tran/t0424.res") or croak Win32::OLE->LastError;
$XAQuery->SetFieldData('t0424InBlock', 'accno', 0, $DEFAULT_ACCOUNT);
$XAQuery->SetFieldData('t0424InBlock', 'passwd', 0, $DEFAULT_ACCOUNT_PASSWD);
$XAQuery->SetFieldData('t0424InBlock', 'prcgb', 0, '1'); # 1:평균단가 2:BEP단가
$XAQuery->SetFieldData('t0424InBlock', 'chegb', 0, '2'); # 0:결제기준잔고 2:체결기준(잔고가 0이 아닌 종목만 조회)
$XAQuery->SetFieldData('t0424InBlock', 'dangb', 0, '0'); # 0:정규장 1:시간외단일가
$XAQuery->SetFieldData('t0424InBlock', 'charge', 0, '0'); # 0:제비용미포함 1:제비용포함
$XAQuery->SetFieldData('t0424InBlock', 'cts_expcode', 0, ''); #처음 조회시는 Space 연속 조회시에 이전 조회한 OutBlock의 cts_expcode 값으로 설정
my $request_result = $XAQuery->Request(0);
#$MAIN_SBAR->Text("result of request: $request_result");
Win32::OLE->MessageLoop;
sub XAQueryLoadMyStocksEventsHandler {
my ($obj, $event, @args) = @_;
DELETE_ALL_STOCK_GRID(); # 모든 주식 그리드 삭제
my $my_stock_count = $XAQuery->GetBlockCount("t0424OutBlock1"); # 보유 주식 수
#$MAIN_SBAR->Text("No. of My Stocks : " . $my_stock_count );
for(my $i = 0;$i < $my_stock_count;$i++){
#$XAQuery->GetFieldData(szBlockName, szFieldName, nOccursIndex)
#$XAQuery->GetFieldData("t0424OutBlock1", "field", $i);
INSERT_ROW_TO_END_LINE(
$XAQuery->GetFieldData("t0424OutBlock1", "hname", $i),
format_picture($XAQuery->GetFieldData("t0424OutBlock1", "pamt", $i), '###,####'),
format_picture($XAQuery->GetFieldData("t0424OutBlock1", "price", $i), '###,####'),
$XAQuery->GetFieldData("t0424OutBlock1", "janqty", $i),
format_picture($XAQuery->GetFieldData("t0424OutBlock1", "appamt", $i), '###,####'),
format_picture($XAQuery->GetFieldData("t0424OutBlock1", "dtsunik", $i), '###,####'),
format_picture($XAQuery->GetFieldData("t0424OutBlock1", "sunikrt", $i), '###.## %')
);
}
$STOCK_LIST_GRID->AutoSize();
Win32::OLE->QuitMessageLoop;
}
}
⇒ 부엉이 님께서 2012-02-18 19:02:55 에 답글을 작성하셨습니다.
아직도 주식을 하십니까... -_-;;
지금은 형이 Perl 을 만지던 1999-2002년이 아니라서, 그때와 지금의 Perl 환경은 사실상 단절이라고 해도 좋을 정도로 많이 변했지. 내가 형 코드를 보고서 Perl 을 배웠으니 말이지만, 그때 짰던 코드들은 지금 생각해 보면 완벽하게 Legacy Code (그것도 Perl 4 시절의!) 입니다. -_-;;;
ActivePerl 은 지금도 컴파일러를 함께 지원을 안 하지만 MinGW 를 설치하면 되고, Strawberry Perl은 처음부터 gcc 를 포함해서 나온 것이라 따로 깔아줄 필요가 없지. 그리고 과거에는 ActivePerl 에서만 PPM 이 지원되었었지만, 지금은 Strawberry Perl 에도 PPM이 포함되어 있어. CPAN 이야 당연히 사용 가능한 거고.
Win32::GUI 는, 이게 기본적으로 MSVC 를 이용해서 컴파일한 거라, gcc 에서는 컴파일할 때 상당히 삐걱거리더라고. 아마 64비트 문제라기보단 이쪽의 문제거 다 있을 거라는 생각이 드네. PPM을 이용한 수동 설치 방법이 있으니까 한번 써 보는 것도 좋지. 단, 형이라면 Win32::GUI 보다는 다른 GUI 툴을 이용하는 게 더 좋지 않을까 싶은데. 네이버의 Perl Community 에 와 보면 관련된 이야기가 몇 개 있으니까 한번 와서 읽어봐...
그리고 저런 코드를 덧글에다가... 하아...
(C) 2000-2023, Owl-Networks. Powered by Perl. 이 페이지는 HTML 5 표준에 따라 작성되었습니다.