Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[아티클][DelphiCon 요약] 델파이 코딩을 더 빠르게 하는 방법


Recommended Posts

<< DelphiCon 2020 목록으로 이동

DelphiCon 의 2020 시리즈 중, Code Faster in Delphi - Alister Christie 의 한글 요약본입니다.  

목차


코드 에디터 단축키

(비디오 보기)

아래 단축키 중 혹시 사용하고 있지 않는 것이 있는 지 보고 이제부터라도 사용해보자.

  • F12 (폼 디자이너와 코드 에디터 전환): 매주 자주하는 작업이다. 즉, 단축키를 쓰면 하루에도 엄청난 시간이 절약된다.
  • Ctrl+Space방향키 (키워드를 빠르고 정확하게 입력하기): 키워드 앞글자 몇 자만 타이핑하고 Ctrl+Space를 사용하면 해당 키워드 목록이 표시된다. 이때, 방향키를 이용하여 원하는 키워드를 선택하면 자동 완성된다.
  • Ctrl+왼쪽 방향키 (현재 줄에서 코드의 가장 앞쪽으로 커서를 이동)
  • Ctrl+Shift+v (지역 변수 선언): 일단 변수명 부터 타이핑한다. 그리고 나서 Ctrl+Shift+v를 사용하면, 변수 선언을 바로 할 수 있다.
  • Ctrl+y (현재 코드 줄을 한번에 삭제): 커서가 있는 곳의 코드 한 줄이 삭제된다.
  • Ctrl+j (for 루프 코드를 빠르게 작성): 일단 for를 타이핑한다. 그리고 나서 Ctrl+j를 사용한다.
  • Ctrl+Shift+c (구현부 코드 골격 자동 생성): 프로시저, 함수, 프로퍼티를 새로 만들 때는, 일단 선언부를 작성하고, Ctrl+Shift+c를 사용하면, 구현부 코드 골격이 자동 생성된다. 프로퍼티의 경우 선언된 Field와 Setter도 자동 생성된다.
  • Ctrl+Shift+Alt+p (매개변수 동기화): 프로시저, 함수, 프로퍼티에서 매개 변수를 선언부( 또는 구현부에서) 변경하고, 그 자리에서 Ctrl+Shift+Alt+p를 사용하면 대응되는 구현부 (또는 선언부)의 매개 변수에도 똑 같이 반영되어 일치하게 된다.
  • Ctrl+Shift+위/아래 방향키 (프로시저나 함수의 구현부와 선언부를 왔다갔다 하기)
  • Ctrl+프로시저(또는 함수) 이름 클릭 (해당 프로시저나 함수의 내용으로 이동) 
  • Alt+좌/우 방향키 (뒤로 가기와 앞으로 가기: 이전 작업 위치로 가기 또는 다시 원래 위치로 되돌아 오기) 
  • Ctrl+Shif+1˜9 (코드에 북마크를 달기): 커서가 있는 줄에 해당 숫자가 지정된 북마크가 생긴다. 원하는 북마크로 이동하려면, Ctrl+1˜9를 사용한다.
    참고: 겟잇 패키지 매니저에서 "bookmark"를 타이핑하고 검색하면, 보다 향상된 북마크를 설치할 수도 있다.
  • 화면에서 코드를 한줄이라도 더 볼 수 있다: 단축키에 익숙해지면 툴바에서 해당 단축 아이콘 빼자. 툴바가 차지하는 영역을 줄일 수 있다.
    • 예를 들어, 뒤로 가기와 앞으로 가기 아이콘을 드래그하여 툴바 바깥으로 꺼내면 툴바에서 없어진다
    • 자주 쓰는 단축 아이콘으로 툴바를 구성하려면, 툴바에서 오른쪽 클릭 Customize
  • Ctrl+Shift+좌/우 방향키(코드 블록 지정) 후 시작하는 괄호 (선택된 곳의 앞뒤를 괄호로 감싸기): 대/중/소 괄호 모두 적용된다.
    • 참고: 블록 선택 팁: And/Or 로 연결된 곳에서 Ctrl+w를 사용하면 선택되는 코드 블록이 한단위씩 늘어난다.
  • Ctrl+/ (주석 처리): 해당 줄 앞에 //가 추가되어 주석으로 처리된다. (이미 //가 있는 주석에서 사용하면, //가 제거되어, 일반 코드가 된다) 
    • 여러 줄을 한번에 주석으로 바꾸려면, 해당 줄을 모두 선택한 상태에서 { 를 사용하여 감싸도 된다. 하지만, 각 줄 앞에 // 두는 주석 처리 방식이 더 일반적이다
  • Ctrl+q+b (선택 영역의 가장 앞으로 커서 이동) 후 Shift+위방향키 (앞에 있는 코드도 선택 영역에 넣기)
    Ctrl+q+k (선택 영역의 가장 뒤로 커서 이동) 후 Shift+아래 방향키 (뒤에 있는 코드도 선택 영역에 넣기) 
  • Shift+위/아래 방향키 (각 줄의 처음부터 끝까지를 모두 선택)
    Shift+Alt+위/아래 방향키 (각 줄에서 한칸만 선택): 예를 들어 모든 줄에서 한자씩 왼쪽으로 당기고 싶으며, 이 방법으로 선택하고 Delete키를 누른다
  • Ctrl+o+k (시작점에서 커서까지 사각형으로 코드 영역을 선택하기와 해당 줄 전체 선택하기를 선택하는 토글): 사각형으로 선택하기로 설정된 경에서는 Shift+위/아래/좌/우 방향키를 사용하여 코드의 일부 영역을 사각형으로 선택할 수 있다.
  • 여러줄을 선택하고 Tab 또는 Shift+Tab (여러줄을 한번에 들여쓰기 또는 내어쓰기)
    Ctrl+Shift+I (또는 U)도 같은 기능
  • Ctrl+D (uses 절에 나열된 모든 유닛들을 한줄에 하나씩 배치)
    주의! 이 단축키를 사용하려면, 먼저 Tools > Options > Language > Formatter > Delphi > Line Breaks 에서 Line Breaks in Uses clauses를 Yes로 설정해야 한다.
    만약, Uses 절의 모든 유닛이 아니라, 일부 유닛 만 한 줄에 하나씩 배치하려면, 원하는 코드 영역을 선택한 후에 Ctrl+D를 사용한다.

폼 디자이너에서 빠르게 작업하기

(비디오 12분 15초부터 보기)

  • TMemo를 폼에 추가할 때 바로 크기를 설정하기
    • 툴 팔레트에서 TMemo를 클릭한다. 그리고 나서, 폼 위에서 TMemo가 위치할 왼쪽 위 지점에서 마우스 왼쪽 버튼을 누르고 그 상태에서 드래그하여 원하는 크기가 될 때까지 끌고 간 후에 마우스 버튼을 놓는다.
  • TEdit 여러개를 폼에 한번에 추가하기
    • 툴 팔레트에서 Shift+원하는 컴포넌트(TEdit)를 클릭하여 툴 팔레트에서 TEdit가 강조 표시되도록 한다. 그리고 나서, 폼 위에 원하는 갯수 만큼 마우스 왼쪽 버튼을 클릭한다. (툴 팔레트에 강조 표시된 컴포넌트를 풀려면, ESC를 클릭하거나 툴 팔레트에서 다른 컴포넌트를 선택한다.)
  • 툴 팔레트 검색창에서 원하는 컨트롤을 타이핑하고 엔터키를 쳐서 바로 폼 위에 추가하기
    • 툴 팔레트에서 Ctrl+Alt+p 설정을 한다  (툴 팔레트 > 오른쪽 클릭 > Properties > Persistent Search Filter 옵션을 활성화 하는 것과 같은 효과)
  • TEdit를 폼 위에 추가하면, 해당 오브젝트 명이 Text 프로퍼티에 자동으로 들어간다. 이것을 지우기
    • 해당 TEdit에서 오른쪽 클릭 > Clear Text (오브젝트 인스펙터에서 Text 프로퍼티를 찾아서 지우는 것과 같은 효과)
  • 컨트롤의 Name, Text, Align 등을 변경하기
    • 해당 컨트롤에서 오른쪽 클릭 > Quick Edit
  • 뒤쪽에 가려져서 마우스로 선택하기 힘든 컨트롤의 위치/크기를 변경하기
    • 스트럭처 창을 이용하여 해당 컨트롤을 선택
    • Ctrl+방향키 (위치 변경) 또는 Shift+방향키 (크기 변경)
    • 팁! 덮고 있는 컨트롤에서 마우스 왼쪽 버튼을 누른 상태에서 ESC키를 사용한다 (그러면, 아래에 가려진 컨트롤이 선택된다). 그 상태에서 마우스를 드래그하여 뒤에 있는 컨트롤을 이동할 수 있다.
  • 컨트롤 여러개의 위치를 한번에 정렬하기
    • 스트럭처 창 또는 폼 에서 Shift+클릭으로 여러 컨트롤을 동시 선택하고 나서, 기준이 될 컨트롤을 마지막으로 한번 더 클릭한다 (기준 컨트롤만 모서리가 검게 표시되고, 나머지는 모소리가 회색이다). 그 상태에서, 오른쪽 클릭 > Position > Align에서 원하는 정렬을 선택한다.
  • 컨트롤을 움직이지 않고 정렬션을 보기
    • 컨트롤을 마우스 왼쪽 버튼으로 누른 채로 잠깐 기다린다. (또는 Shift키를 누른다)
    • 참고로, VCL 폼 디자이너의 정렬선은,파랑색이 컨트롤 테두리 기준선이고, 핑크색은 컨트롤 안의 텍스트 기준선이다. 
  • 컨트롤을 다른 컨트롤 안에 넣기
    • 스트럭처 창에서 컨트롤을 드래그하여 컨테이너가 될 컨트롤 안에 끌어 넣는다.
    • 또는, 폼 위에서 컨트롤을 Ctrl+x하고 컨테이너가 될 컨트롤을 마우스로 선택한 후 Ctrl+v를 한다.
  • TSpeedButton을 사용해야하는데 "실수로" TButton을 사용했다면
    • 폼 화면에서 Alt+F12를 사용하여 폼 코드로 이동한다. (폼 디자니어 > 오른쪽 클릭 > View As Text 와 같은 효과)
    • 폼 코드에서 해당 컨트롤 이름을 검색한 후,  "TButton"을 "TSpeedButton"으로 변경한다. 경고 창이 나타나서 SpeedButtonTab Order 프로퍼티가 없다고 해도 Ignore 버튼을 클릭한다. 오브젝트 인스펙터를 보면 TButtonTSpeedButton으로 변경되었을 것이다.
    • 하지만, 소스 코드에는 여전히 TButton으로 남아 있다. 따라서 컴파일을 시도한다. 그러면, 오류 창이 뜨면서 바꿀 것인지를 묻는 창이 뜬다. 이때, Yes를 클릭하면 소스 코드 역시 TSpeedButton으로 변경되고 컴파일이 진행된다.
  • 이미 설정한 컨트롤을 기준으로 비슷한 것들을 추가하기
    • 폼 디자이너에서 원하는 컨트롤을 선택하고 Ctrl+c 한 후에 메모장에서 Ctrl+v를 하면 해당 컨트롤을 구현하는 코드가 메모장에 복사되어 붙는다.
      (예를 들어, TButtonTSpeedButton으로 변경하거나, Caption 프로퍼티의 값을 변경하는 등) 메모장에서 원하는 대로 코드를 바꾸고 나서, Ctrl+c 한다. 다시 폼 위에서 Ctrl+v를 하면 메모장에서 변경한 코드 대로 컨트롤이 추가된다. Ctrl+v를 3번 하면 해당 컨트롤 3개가 추가되므로,컨트롤 여러개를 추가할 때도 유용하다.
  • 컨트롤 여러개에 공통으로 있는 프로퍼티를 한번에 변경하기
    • 폼 디자이너에서 여러 컨트롤을 선택한 후 오브젝트 인스펙터의 검색창에서 원하는 프로퍼티를 타이핑하면, 해당하는 프로퍼티만 창에 표시되므로 해당는 프로퍼티의 값을 한번에 변경한다.
    • 프로퍼티가 여러개 나타나는 경우, 화살표를 이용하여 원하는 프로퍼티를 선택한다.

최신 RTL의 새 언어 기능을 이용하여, 오래된 코드를 현대화하기

(비디오 20분 27초부터 보기)

오래전 부터 사용하던 아래의 코드를 보다 간결 명확한 현대식 코드로 바꿔보자.

// 기존에 있던 코드 
procedure TForm1.btnGetFileClick(Sender: Object);
var
  F: TSearchRec;
begin
  if FindFirst(‘c:\temp\*.*’, faAnyFile - faDirectory, F) = 0 then
  repeat
    Listbox1.Items.Add(F.Name);
  until FindNext(F) <> 0;
end;

 

1단계: (TDirectory, TPath 등) System.IOUtils 유닛 을 사용하자. 보다 읽기 쉬운 코드가 된다

// [변경 1단계] IOUtils 유닛을 사용
// 개선된 점: 코드를 이해하기가 더 쉬워졌다 (더 짧아지지는 않았지만, 훨씬 읽기 쉬워졌다) 
uses
  System.IOUtils;
procedure TForm1.btnGetFileClick(Sender: Object);
var
  FilesNames: TArray;
  FilesName: string;
begin
  FileNames: TArray := TDirectory.GetFiles(‘c:\temp’);
  for FileName in FilesNames do
    Listbox1.Items.Add(TPath.GetFileName(FileName));
end;

 

2단계: 인라인 변수를 사용하자. 현대식 문법이며, 읽기도 쉽고, 실행 효율성도 더 높다.

// [변경 2단계] 인라인 변수를 사용
// 개선된 점1: 코드가 더 간결해졌다
// 개선된 점2: 인라인 변수는 해당 영역에서만 유효하다.
// (코드에서 변수의 범위는 작을수록 더 좋다. 아래의 새 코드에서는 FileName 변수가 for 루프 안에서만 유효하므로, 바깥에서 사용하면 컴파일러 오류 발생)
uses
  System.IOUtils;
procedure TForm1.btnGetFileClick(Sender: Object);
begin
  var FileNames: TArray<string> := TDirectory.GetFiles(‘c:\temp’);
  for var FileName: string in FilesNames do
    Listbox1.Items.Add(TPath.GetFileName(FileName));
end;

 

3단계: 타입 레퍼런스 기능(10.3버전에 추가됨)을 사용하자. 컴파일러가 이해할 수 있는 타입이라면, 이제 굳이 적지 않아도 된다.

// [변경 3단계] 인라인 변수 선언 시 타입 지정 생략
// 개선된 점: 코드가 더 간결해졌다
uses
  System.IOUtils;
procedure TForm1.btnGetFileClick(Sender: Object);
begin
  var FileNames := TDirectory.GetFiles(‘c:\temp’);
  for var FileName in FilesNames do
    Listbox1.Items.Add(TPath.GetFileName(FileName));
end;

 

정규식을 활용하여 웹페이지에 있는 모든 이미지의 url을 뽑아서 델파이로 가져오기

(비디오 24분 30초부터 보기)

웹페이지에서 jpg 이미지 100개를 가져오는 작업을 해야하는 상황이라면?
각 이미지 경로를 웹브라우저에서 일일이 찾아서 메모장에 붙이는 수작업을 하지 말자.
아래와 같이 짧은 코드를 만들어서 TListBox에 표시하면, 훨씬 빠르고 정확히 가져올 수 있고, 다음에 또 쓸 수도 있다.

// 아래의 버튼 클릭 이벤트 코드
// 단, 이 코드가 작동하려면, 먼저 NetHTTPRequest와 NetHTTPClient 컴포넌트를 폼 디자이너에 올리고 서로 연결을 해두어야 한다
uses
  System.RegularExpressions;
procedure TForm1.Button1Click(Sender: Object);
begin
  var Response := NetHTTPClient1.Get(‘….’); // ...에는 목표 웹페이지 주소 (예) https://www.trademe.co.nz/a/marketplace/gaming/nintendo-wii-u
  var WebText := Response.ContentAsString;
  var Matches := TRegEx.Matches(WebText, https://[ˆ/\s]+/\S+?\.jpg');
  for var Match in Matches do
    ListBox1.Items.Add(Match.Value);
end;

 

<< DelphiCon 2020 목록으로 이동


View full 엠바카데로 기술자료

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.