블로그 이미지
훅크선장

카테고리

분류 전체보기 (363)
사진이야기 (23)
펭귄컴퓨팅 (122)
컴퓨터보안 (84)
절름발이 프로그래머 (59)
하드웨어개조 (23)
멀알려줄까 (35)
잡다한것들 (15)
홈베이킹&홈쿠킹 (2)
Total
Today
Yesterday

달력

« » 2025.7
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

공지사항

태그목록

최근에 올라온 글

C언어에서는 당연하고 되는 것이지만,
델파이 즉, 오브젝티브 파스칼을 쓸 때는 한번쯤 생각해보게 되는 방법이다.

C언어에서는  타입 캐스팅으로 되는 것을
델파이에서는 다음과 같이 해야된다.

tmpbuffer: array[0..1023] of Byte;
ptr : ^aRecord;

    // 파일에서 데이터를 읽어온다.
    ZeroMemory(@tmpbuffer[0], sizeof(tmpbuffer));
    BlockRead(File, tmpbuffer, datasize, readbytes);
    ptr := @tmpbuffer; // 버퍼 내용을 레코드 형식으로 해석한다.

    ptr.a
이런 식으로 버퍼의 데이터를 레코드형식으로 받아서 사용할 수 있다.

Posted by 훅크선장
, |
http://delphi.about.com/od/windowsshellapi/a/executeprogram.htm
를 참고하였습니다.

델파이에서 별도의 프로그램, 즉 exe를 실행시키고 종료를 확인할 수 있습니다.
ShellExecuteEx 를 사용하는데, 
먼저 uses ShellApi; 를 포함합니다.

그리고,
procedure TForm1.Button2Click(Sender: TObject);
var
   SEInfo: TShellExecuteInfo;
   ExitCode: DWORD;
   ExecuteFile, ParamString, StartInString: string;
begin
   ExecuteFile:='C:\Windows\Notepad.exe'; // 실행하려는 프로그램의 경로 및 파일명 지정
   ParamString := 'C:\autoexec.bat'; // 프로그램 실행시 인자값을 문자열로 지정

   FillChar(SEInfo, SizeOf(SEInfo), 0) ;
   SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
   with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     lpParameters := PChar(ParamString) ;
 // lpDirectory := PChar(StartInString) ; // StartInString 문자열에 실행되고자 하는 디렉토리를 지정할 수 있음. 지정하지 않으면 현재 프로그램 실행 디렉토리가 디폴트로 사용됨
     nShow := SW_SHOWNORMAL; // 프로그램이 실행되는 윈도우 형태를 지정할 수 있습니다. ACTIVE, 최대화, 최소화 등등...
   end;
   if ShellExecuteEx(@SEInfo) then begin
     repeat
       Application.ProcessMessages;
       GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
     until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;
     ShowMessage('프로그램이 종료되었습니다.') ;
   end
   else ShowMessage('프로그램을 실행하지 못했습니다.') ;
end;
같이 코드를 작성하면 됩니다.
Posted by 훅크선장
, |
ipAddresses 라는 TStringList에 IP 주소 문자열이 있다고 가정할 때,
동일한 IP주소가 몇 개나 있는지 찾고, 그 결과를 출력하는 예제입니다.
꼭 IP 주소가 아닌, 일반 문자열이나 단어등에도 적용해 볼 수 있습니다.

AddObject로 문자열의 개수를 추가하는 방식이라서, 간단하게 결과를 볼 수 있습니다.
아래 펌글에 좀 더 빠른 방법이 제안되어 있습니다만, 대용량이 아니라면 이것만 가지고도 충분히 빠른 결과를 볼 수 있습니다.

procedure TForm1.Button1Click(Sender: TObject);
var
  ls : TStringList;
  ip : string;
  ipAddresses : TStringList;
  n : integer;
  I: Integer;
begin
  memo1.Lines.Clear;
  memo2.Lines.Clear;

  ipAddresses := TStringList.Create;
  ipAddresses.Add('192.168.10.1');
  ipAddresses.Add('192.168.1.10');
  ipAddresses.Add('192.168.1.1');
  ipAddresses.Add('192.168.10.1');
  ipAddresses.Add('192.168.1.1');
  ipAddresses.Add('192.168.1.10');
  ipAddresses.Add('192.168.1.1');
  ipAddresses.Add('192.168.1.10');

  ls := TStringList.Create;
  ls.Sorted := true;
  for ip in ipAddresses do begin
    n := ls.IndexOf(ip);
    if n = -1 then
      ls.AddObject(ip, TObject(1))
    else
      ls.Objects[n] := TObject(Integer(ls.Objects[n]) + 1);
  end;

  memo1.Lines := ls;
  for I := 0 to ls.Count - 1 do
  begin
    memo2.Lines.Add(IntToStr(Integer(ls.Objects[I])));
  end;

end;
Posted by 훅크선장
, |
http://www.matsgefvert.se/blog/archives/651
에서 가져온 글입니다.

StringList상에 있는 동일한 문자열 개수 세기 샘플 코드와
StringList의 검색속도를 증가시키는 방법이 나와있습니다.
----------------------------------------------------------------------------------

Speeding Up Delphi’s TStringList.IndexOf
1 June 2009, 15:33 ? Music, Software Development
Delphi’s TStringList is one of the objects I love the most. If it’s sorted (StringList.Sorted := true) then you can use it to parse huge chunks of data quickly.

For instance, looping through an enormous amount of IP addresses and keeping count of how many times they appeared, is easily done using the following code (not compiled or checked for syntax errors):

ls := TStringList.Create;
ls.Sorted := true;
for ip in ipAddresses do begin
  n := ls.IndexOf(ip);
  if n = -1 then
    ls.AddObject(ip, TObject(1))
  else
    ls.Objects[n] := TObject(Integer(ls.Objects[n]) + 1);
end;
It’s very efficient. Since TStringList.IndexOf always does a binary search, it operates in log2(n) time, and using Objects as integers allows us to keep track of count without messing with the string data.

But there are things we can do to speed it up. For instance, TStringList.IndexOf relies on TStringList.Find, which itself uses AnsiCompareStr, which is a slow Windows call, taking locale and its mother into consideration. Overriding this with our own method should be worthwhile. (The code below is adapted straight from the Classes unit.)

type
  TStringListEx = class(TStringList)
  public
    function Find(const S: string; var Index: Integer): Boolean; override;
  end;

function TStringListEx.Find(const S: string; var Index: Integer): Boolean;
var
  L, H, I, C: Integer;
begin
  Result := False;
  L := 0;
  H := Count - 1;
  while L <= H do
  begin
    I := (L + H) shr 1;
    C := CompareStr(Get(I), S);
    if C < 0 then L := I + 1 else
    begin
      H := I - 1;
      if C = 0 then
      begin
        Result := True;
        if Duplicates <> dupAccept then L := I;
      end;
    end;
  end;
  Index := L;
end;
We’ve replaced AnsiCompareStr with Delphi’s own CompareStr, which is a highly optimized FastCode routine. There are some drawbacks ? things will always be sorted in byte order and no case-sensitivity is done. But we don’t care about this ? it can always be done afterwards; right now, speed is the main importance.

And it turns out that using the above code, in pure examples, can slash execution time with up to about 80%. Dramatic savings, indeed. In my own example, where I analyze ftp log data, I managed to cut execution time on 122 MB of data down from 7 seconds down to 3.1 seconds.

Best of all, since TStringList.Find is declared virtual, we don’t need to change any types anywhere, just do a TStringListEx.Create instead of a TStringList.Create and you’re good to go.




Posted by 훅크선장
, |
http://www.delmadang.com/
델마당의 “강좌, 팁, 정보” 게시판에서 가져온 글입니다.

대웅
(klol)
2009-01-12 오후 11:39:47

이 쓰신 글입니다.
----------------------------------------------------------------------------------

DBGrid자료를 엑셀로 보내는 함수입니다.

uses
      dbgrids, ComObj, Excel2000, Clipbrd;
.....

procedure ToExcle(vDBGrid: TDBGrid);
var
  XL: Variant;
  i,k: integer;
  sData: string;
begin
  try
    XL := CreateOLEObject('Excel.Application');
  except on E: Exception do
  begin
    ShowMessage('Excel OLE object를 오픈할 수 없습니다.'+E.Message);
    Exit;
  end; end;
  try
    XL.WorkBooks.Add; //새로운 페이지 생성
    XL.Visible := False;
    XL.Workbooks[XL.Workbooks.Count].WorkSheets[1].Name := 'Sheet1';
    sData := '';
    for i := 0 to vDBGrid.Columns.Count - 1 do
    begin
      sData := sData+vDBGrid.Columns[i].Title.Caption+#9;
      if vDBGrid.Columns[i].Field.DataType in [ftString,ftMemo,ftWideString] then
      begin
        XL.Workbooks[XL.Workbooks.Count].WorkSheets['Sheet1'].Columns[i+1].Select;
        XL.Selection.NumberFormatLocal := '@';
      end;
    end;
    sData := sData+#$D#$A;

    with vDBGrid do
    begin
      k := 0;
      DataSource.DataSet.First;
      while not DataSource.DataSet.Eof do
      begin
        inc(k);
        for i := 0 to Columns.Count - 1 do
          sData := sData+Columns[i].Field.AsString+#9;
        sData := sData+#$D#$A;
        DataSource.DataSet.Next;
      end;
    end;

    Clipboard.SetTextBuf(PChar(sData));
    XL.Cells[1,1].Pastespecial;
    XL.Range['A1', Chr(64+vDBGrid.Columns.Count)+IntToStr(k)].select;
    XL.Selection.Columns.AutoFit;
    XL.Range['A1', 'A1'].select;
    XL.Visible := True;
  except on E: Exception do
  begin
    ShowMessage('Excel로 자료를 보내는 중 오류가 발생했습니다.'+E.Message);
    XL.Visible := True;
    Exit;
  end; end;
end;

테스트결과 아주 잘 되는군요.

Posted by 훅크선장
, |
http://topopen.egloos.com/3211897 에서 가져왔습니다.

StringGrid를 아직 안 써봤지만, 앞으로 쓸 일이 있을 것 같습니다.

[Delphi] 델파이 excel export 소스

아래는 델마당 소스 발췌한 내용입니다.
---------------------------------------------------------------------
스트링그리드이 내용을 excel로 저장하는 델파이 소스입니다..

그런데, 제가 델은 잘 몰라서....변환을 할 수가 없군요..

소스는 한델에서 얻었구요... 빌더로 변환해 주세요..^^

소스는 아래와 같습니다..

1. StringGrid 예제
Uses절 ComObj 포함..

procedure TshGridX.run_excel;
var
  XL, XArr: Variant;
  i, j: Integer;
begin
  //데이타 처리변수
  XArr := VarArrayCreate([1, StringGrid1.ColCount], VarVariant);

  try
  //엑셀을 실행
    XL := CreateOLEObject('Excel.Application');
  except
    MessageDlg('Excel이 설치되어 있지 않습니다.', MtWarning, [mbok], 0);
    Exit;
  end;

  XL.WorkBooks.Add; //새로운 페이지 생성
  XL.Visible := True;
  
  for i := 0 to StringGrid1.RowCount - 1 do begin
    for j := 0 to StringGrid1.ColCount - 1 do begin
      XArr[j+1] := StringGrid1.Cells[j,i];
    end;
    //엑셀에 값을 넣는다.
    XL.Range['A' + IntToStr(i+1), CHR(64 + StringGrid1.ColCount) + IntToStr(i+1)].Value := XArr;
  end;

  //셀 크기 조정
  XL.Range['A1', CHR(64 + StringGrid1.ColCount) + IntToStr(i+1)].Select;
  XL.Selection.Columns.AutoFit;
  XL.Range['A1', 'A1'].Select;
end;
Posted by 훅크선장
, |
정상적인 윈도우즈 운영체제에서 Excel 이 깔려있다면,
대부분의 그리드 형태나 리스트뷰 내용을 Excel로 바로 띄워 볼 수 있다.
바로 Excel이 지원하는 형태로 저장할 수 있다는 의미이다.

일단  uses ComObj;  를 추가하여야 엑셀 컴포넌트 기능을 사용할 수 있다.

다음과 같이 한다.

procedure TForm1.BtnExcelViewClick(Sender: TObject);
var
  XL, XArr: Variant;
  i, j: Integer;
begin
  //데이타 처리변수
  XArr := VarArrayCreate([1, ListView1.Columns.Count], VarVariant);

  try
    //엑셀을 실행
    XL := CreateOLEObject('Excel.Application');
  except
    MessageDlg('Excel이 설치되어 있지 않습니다.', MtWarning, [mbok], 0);
    Exit;
  end;

  XL.WorkBooks.Add; //새로운 페이지 생성
  XL.Visible := True;

  // 제목 행 생성
  XArr[1] := '첫번째열';
  XArr[2] := '두번째열';
  XArr[3] := '세번째열';
  XArr[4] := '네번째열';
  XArr[5] := '다섯번째열';
  XL.Range['A1', CHR(64 + ListView1.Columns.Count) +  IntToStr(1)].Value := XArr;

  for i := 0 to ListView1.Items.Count - 1 do begin
    for j := 0 to ListView1.Columns.Count - 1 do begin
      if j = 0 then XArr[j+1] := ListView1.Items.Item[i].Caption
      else XArr[j+1] := ListView1.Items.Item[i].SubItems[j-1];
    end;
    //엑셀에 값을 넣는다.
    XL.Range['A' + IntToStr(i+2), CHR(64 + ListView1.Columns.Count) +  IntToStr(i+2)].Value := XArr;
  end;

  //셀 크기 조정
  XL.Range['A1', CHR(64 + ListView1.Columns.Count) + IntToStr(i+1)].Select;
  XL.Selection.Columns.AutoFit;
  XL.Range['A1', 'A1'].Select;
end;


Posted by 훅크선장
, |

BackTrack 4 Pre 버전의 한글판을 1차 배포합니다.

BackTrack 4 Final 버전이 나옴과 동시에, 그에 대한 한글판도 제작되었습니다. 그 글로 가셔서 신청하시기 바랍니다.

배포방법은 본 블로그에 답글 또는 비밀글로 본인의 이메일 주소를 남겨주시면,
그 이메일 주소로 다운로드 링크를 보내드립니다.
(11월 12일까지 링크로 공개해 두었는데, 접속량이 너무 많아서, 서버에 부하가 걸립니다. 모든 BackTrack 관련 iso는 요청하시면, 다운로드 링크 드립니다. 약속은 지킵니다. )

제 서버에 하루 트래픽 제한이 있어서, 하루에 10분정도 다운로드받을 수 있습니다.
크기가 1.4 GB 정도 합니다.

오른쪽 방향키를 누르면, 한/영 변환이 된다는 몇 분이 계셔서, iso를 다시 만들었습니다. 기존에 쓰시면서 위 문제가 없던 분들은 다시 받을 실 필요가 전혀 없습니다. 이 문제는 리눅스상의 X-Window 에서 키보드별로 키맵이 다르기 때문에 생기는 문제입니다. 자신이 쓰는 일반 데스크탑용 리눅스면 설정해서 사용하는데 문제가 없지만, CD 부팅 리눅스에서는 환경을 통일해야 되서, 이 설정을 넣는 것이 문제가 있군요.

혹시 리눅스 ISO 배포 공간을 가지고 계시거나, 
무제한 다운로드 가능한 공간을 가지신 분은 연락 주세요~.
먼저 받으신 분들은 자유롭게 원하시는 분에게 나누어 주시면 됩니다.

Beta 버전까지 SLAX 기반이었다가, 
Pre 버전에서 Ubuntu 기반으로 바뀌면서 시간이 좀 걸렸습니다.

기존 배포되는 BackTrack 4 Pre 버전보다 추가된 것은 다음과 같습니다.

1. 네이버에서 자유롭게 배포하는 나눔폰트 (ttf-nanum_1.0-1_all.deb)
http://noneway.tistory.com/362
http://kldp.org/node/98701

2. 일본어 폰트 (ttf-kochi-mincho-naga10_1.0.20030809-4_all.deb)
Kochi Subst Gothic Japanese TrueType font with naga10 (non-free)
http://packages.ubuntu.com/ko/hardy/ttf-kochi-gothic-naga10

3. 중국어 폰트 (wqy-zenhei-0.8.38-1.deb)
WenQuanYi Zen Hei v0.8
http://wenq.org/enindex.cgi

4. scim 입력기 한글 확장팩 데비안 패키지
scim-hangul

5. 한글 관련 데비안 패키지들
language-pack-ko
language-pack-gnome-ko
language-pack-gnome-ko-base
kde-i18n-ko

6. KDE 한글 설정
KDE 기본 언어는 한글로 설정,
KDE 선택 언어는 한글과 영어 두개만 사용

몇 가지 더 했는지, 기억이 가물가물하군요.
X-Window, KDE 상에서 한글도 잘 보이고, 한글 입력도 되는데 
문제는 한영 전환키가 Ctrl+Space 라는 것입니다.
이 문제가 추가로 해결되면 더 좋겠군요. 시도중입니다.

----------------------------------------------------
제가 라이브씨디 빌드하면서 본 문서는 
입니다.

그외에 우분투 한국 사용자들의 많은 웹 문서를 참고로 하였습니다.
일일히 나열하지 못한 점에 사과드립니다.
우분투 한국 사용자 모임, 정말 좋고 참고할 자료 많았습니다.

------------------------------------------------------
BackTrack 만드는 애들은 여기 아시아쪽은 관심이 없나봅니다.
한국, 중국, 일본 쪽 설정은 아예 다 빼놨더군요.
미국,영국,이태리,프랑스... 몇몇 나라 언어만 지원하게끔 두고...
별수 있겠습니까?
그냥 한글화 하는 수밖에는...
SLAX 때보다 ISO 빌드할때 시간이 더 많이 걸립니다. - -;
Posted by 훅크선장
, |
BackTrack 3와 4 beta 버전의 기반이 되었던,

SLAX라고 하는 라이브씨디가 있었습니다.

Slackware 리눅스를 기반으로 하고 있는 것인데,
이전까지는 한글화 버전이 별도로 제작되어 나왔습니다.


그 한글화를 하신 분의 도움을 받아서, BackTrack 3 한글화를 할 수 있게 되었는데,
이 분이 바쁘신지 요즘 신 버전 한글화가 안 되더군요.
현재 위의 SLAX 한글화 사이트에서 제공하는 최종 버전은 5.1.8 입니다.
제가 iso 파일 다운로드를 위한 공간을 제공했었습니다. 지금도 동작은 하지만, 구 버전입니다.

그래서, 제가 직접 SLAX 최신버전 한글판을 만들어봤습니다.

다음 경로에서 받을 수 있습니다.
http://www.hsd.or.kr/~hook7346/ISO/slax-6.1.1-han.iso

많이 애용하시기 바랍니다.

리눅스가 대한민국 가정의 데스크탑 OS로 자리잡는 그날까지 화이팅~~~~!

----------------------------------------------------------------------------------------------------------------------
SLAX가 5버전에서는 모듈형식으로 mo를 사용했지만,
6버전부터는 모듈형식으로 lzm을 사용합니다.

개인적으로는 SLAX 6버전대의 한글화와 커스터마이징에 대한 문서를 쓰려고 합니다.
부지런하게 움직여야 될텐데....
Posted by 훅크선장
, |
http://alee.anj.kr/fonts/arita/

아리따 폰트를 구하다가 알게된 사이트입니다.
홈페이지가 없어서, 누구? 어느회사? 홈페이지인지 모르겠습니다.

아시는 분 있으면, 알려주세요~.


deb 패키지들과 기타 ttf 파일로 존재합니다.
Posted by 훅크선장
, |