프로그래밍/델파이 80

[javascript] private 변수에 대한 type hint 설정 방법

개요 자바스크립트에서 클래스 내에 private 변수를 지원하기 시작했습니다. 리터럴 변수일 경우에는 기본값을 설정하면서 변수형이 지정되는데, 클래스 내부에서 생성하여 초기화하는 객체인 경우에는 다음과 같이 "null"로 기본값을 설정하고 작성을 하게 됩니다. private 변수를 초기 기본값을 "null"로 설정하면 해당 객체의 내부 멤버 변수 및 메소드에 대한 VS Code 등에서 type hint가 나오지 않아 불편합니다. 간단한 주석으로 type hint가 나오도록 하는 방법을 알아보도록 하겠습니다. 해결 방안 class MyClass { /** no type hint Image object */ #imageNoHint = null; /** @type {Image} has type hint Ima..

[Pascal] 외부 프로그램을 실행하고, 실행한 프로램의 메인 윈도우 핸들 얻기

개요 외부 프로그램을 실행하고, 실행한 프로그램의 메인 윈도우 핸들을 얻는 방법을 설명합니다. 구현 방법 외부 프로그램을 실행하기 위하여 CreateProcess() 함수를 이용합니다. 외부 프로그램이 정상적으로 실행된다면 해당 프로그램의 Process ID를 얻을 수 있고, Process ID를 이용하여 메인 윈도우 핸들을 구할 수 있습니다. 먼저 CreateProcess() 함수를 이용하여 다음과 같이 메모장을 실행할 수 있습니다. uses Windows; procedure TForm1.btnExecuteNotepadClick(Sender: TObject); var // StdInPipeR, StdInPipeW : THandle; // StdOutPipeR, StdOutPipeW : THandle; ..

[Delphi] Cannot allocate socket on Windows 95

문제점 및 증상 Delphi 7 + Indy9으로 개발한 TCP Server 프로그램을 Windows 95에서 실행하면 다음과 같은 오류가 발생하였습니다. 참고로 동일한 프로그램이 Windows 98에서는 잘 동작하였습니다. 원인 분석 참고글에서 유사한 환경에서 오류가 발생하였을 때, Windows 95의 WinSock2를 패치하라는 답변에 따라 Windows 95의 WinSock2를 패치하는 파일을 검색해 보았으나 실제 패치할 수 있는 파일을 찾기가 힘들었습니다. 이미 20년도 더 지난 과거의 OS에 대한 자료이다 보니 관련 내용은 찾을 수 있었으나, 정작 패치 파일을 구할 수가 없었습니다. 해결 방법 Windows 95의 WinSock2를 패치하는 파일을 찾기가 힘들었는데, 다음 사이트에서 "w95w..

[Delphi] Windows 95에서 Comctl32.dll로 인한 실행 문제

## 문제점 및 증상 Delphi 7으로 개발한 일반 프로그램을 Windows 95에서 실행하였을 때, 다음과 같은 오류창들이 나타나며 실행이 안되는 문제가 발생하였습니다. 개발은 Delphi 7의 기본 컴포넌트만으로 개발하였고 Windows 98에서는 정상적으로 동작을 하였으나, Windows 95에서 위와 같은 오류가 발생합니다. 원인 분석 Comctl32 Library 관련 문서를 보면 Windows 95에는 버전이 너무 낮아 지원되지 않는 기능들이 있어서 발생한 오류였습니다. 위 오류창의 메시지로 보면 ImageList 기능이 Windows 95 기본 Comctl32.dll에서는 제공되지 않아서 발생한 문제입니다. Comctl32 Library versions : https://www.geoffc..

[pascal] in 연산자의 "Constant expression violates subrange bounds" 오류

문제점 및 증상 다음과 같이 작성 후, 컴파일 시 오류가 발생합니다. const // SMA 관련 상수 모음; SMA_CMD_ID_INIT_IDLE_STATE = $1100; SMA_CMD_ID_PRE_FLIGHT = $0101; SMA_CMD_ID_PERFORM_BIT = $0102; SMA_CMD_ID_SEND_BIT_RESULTS = $0103; // ... if (nIndex in [SMA_CMD_ID_INIT_IDLE_STATE, SMA_CMD_ID_PRE_FLIGHT ])) then 발생한 오류는 다음과 같습니다. [Error] SmaClientThreadUnit.pas(168): Constant expression violates subrange bounds 보통 위와 같은 오류는 enum ..

CCITT CRC16() 함수

pascal에 적용 할 수 있는 CCITT CRC16 함수를 소개해 드립니다. unit crc16Unit; interface uses Classes, SysUtils; const CCITT16_INITIAL = $FFFF; CCITT16_POLYNOMINAL = $1021; {** CCITT CRC16 값을 계산하여 반환합니다. @param pBuffer CRC16 값을 계산할 데이터가 들어 있는 포인터 @param nLen CRC16 값을 계산할 데이터의 길이 @result 입력한 데이터에 대한 CCITT CRC16 값 ( 검증 : https://crccalc.com/ ) *} function crc16(pBuffer: PByte; nLen: word): word; overload; function c..

[pascal] 라디오 버튼 선택 동작

라디오 버튼 선택 메시지 개요 MFC 등으로 만들어진 외부 프로그램을 간접적으로 제어하거나, Window Control을 직접 생성하여 이용하는 경우, 라디오 버튼을 메시지를 통하여 선택하고, 해제하는 방법을 정리해 둡니다. 라디오 버튼 컨트롤에 BM_SETCHECK 메시지를 이용하면, 라디오 버튼의 선택 여부를 설정할 수 있습니다. SendMessage(hwnd, BM_SETCHECK, wParam, 0); wParam에 다음의 라디오 버튼 상태정보를 전달하여, 선택하거나 해제할 수 있습니다. Value Meaning BST_CHECKED Sets the button state to checked. BST_INDETERMINATE Sets the button state to grayed, indicat..

[pascal] 16진, 10진 숫자 문자열을 정수형으로 변환하기 (StrToInt)

숫자 문자열를 정수형으로 변환하기 위하여 StrToInt(), StrToInt64() 함수를 주로 이용합니다. 숫자 문자열을 다루는 함수들의 원형은 다음과 같습니다. { StrToInt converts the given string to an integer value. If the string doesn't contain a valid value, an EConvertError exception is raised. } function StrToInt(const S: string): Integer; function StrToIntDef(const S: string; Default: Integer): Integer; function TryStrToInt(const S: string; out Value: In..

Lazarus 크로스 컴파일을 통한 Windows 95용 어플 만들기 실패의 기록

개요 우여곡절 끝에 Windows 95용 어플을 만들일이 있어서, 여러 윈도우 어플 개발 도구를 조사하던 중에, 오픈 소스인 Lazarus가 끌려서 Lazarus의 크로스 컴파일링을 통하여 Windows 95용 어플 제작에 실패한 기록을 남겨 둡니다. 부디 저와 같은 실패를 오래 겪지 않았으면 합니다. ^^; Lazarus 크로스 컴파일 Lazarus는 공식 사이트 (https://www.lazarus-ide.org/)에서 손쉽게 다운로드 받아서 설치할 수 있습니다. 대부분 기본적으로 사용하는 OS가 64bit 여서 Lazarus도 64bit 버전을 다운로드 받아서 설치하게 됩니다. 간단한 폼을 보여주는 예제 프로그램을 만들어서 아래와 같이 프로젝트 환경설정 (Ctrl + Shift + F11)에서 "C..

[pascal] FindWindow / FindWindowEx

FindWindow 윈도우 핸들 (HWND)을 구하기 위하여 FindWindow() 함수를 많이 이용하게 되는데, 이 함수의 원형은 다음과 같습니다. function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall; 주로 다음과 같은 형식으로 FindWindow() 함수를 이용합니다. uses Windows; var hwnd: THandle; begin // 윈도우 이름으로 메모장 핸들 찾기 hwnd := FindWindow(nil, '제목 없음 - Window 메모장'); // 클래스 이름으로 메모장 핸들 찾기 hwnd := FindWindow('Notepad', nil); // 여러 개의 메모장에서 특정 윈도우 이름의 메모장 찾기 hwnd :..

728x90