[Delphi]Assigned 함수 Delphi 2013. 11. 8. 13:36

Assigned(var P : Type) 함수는

P 가 참조하는 포인터 또는 프로시저가 할당되어 있는지 검사하는 함수이다.

 

function Assigned(var P : Type):Boolean;

P : 포인터 또는 프로시저 변수

 

nil 인 경우에는 False 를, 아니면 True 를 반환합니다.

다시 말하면,

체크하려는 변수가 할당되어 있으면 True, 할당되어 있지 않으면 False 를 반환합니다.

 

저 같은 경우는 동적으로 생성한 구조체가 할당되어 있는지 없는지 검사하기 위해 많이 씁니다.

할당되어 있으면 진행하고, 아니면 빠져나오도록 하는 경우에 많이 사용합니다.

 

 

디자인 길이와 실행시 내용이 다를때 자동 조정


var
    i, ItemWidth: Integer;
begin
    ItemWidth := 0;
    // 최대 pixel수를 구한다
    for i := 0 to (Sender as ComboBox).Items.Count - 1 do
    if GetTextWidth((Sender as ComboBox).Items[i]) > ItemWidth then
    ItemWidth := GetTextWidth((Sender as ComboBox).Items[i]) + 8;

// ComboBox 의 Drop-Down list 의 width를 변경하는 것은 단지
// pixel를 파라미터로 하여 CB_SETDROPPEDWIDTH 메시지를
// ComboBox 보내면 된다
(Sender as ComboBox).Perform(CB_SETDROPPEDWIDTH, ItemWidth, 0);


end;

< 델파이 단축키 모음 >

[찾기]

Ctrl + F Find

Ctrl + R Find and Replace

F3 Search Again


[화면이동]

F11 View Object Inspector

F12 Toggle Form/Unit

Alt + 0 View Window List

Ctrl + F12 View Unit

Shift + F12 View Form

Ctrl + PgUp/PgDown CodeEditor에서 현재페이지의 첫줄(PgUp), 마지막줄(PgDown)로 이동


[컴파일/실행]

Ctrl + F9 Compile

F9 Run

F7 Trace Into

F8 Trace Over

F5 Set Breakpoint

Ctrl + F5 Add Watch

Ctrl + F7 Evaluate/Modify


[블록관련]

Ctrl + Shift + U Unindent

Ctrl + Shift + I Indent

Ctrl + O, C Column Block Mode (또는 Alt키를 누른상태에서 Mouse를 드래그 해
도 컬럼블럭 설정이 가능, Shift + Alt + Arrow Key 를 사용해도 컬럼블럭 설정)

Ctrl + O, K Line Block Mode


[키 매크로]

Ctrl + Shift + R Record

* 키매크로 작성순서 : -> <원하는키> ->

Ctrl + Shift + P Play


[Object Inpector]

Ctrl + Down Object Inpector 상단의 Object List ComboBox 열기
이 상태에서 Component Name을 키보드로 치면 Incremental Search 기
능Tab Property 와 Property Value 부분을 전환가능하며,
Property 쪽에 Cursor 가 위치한 상태에서 키보드를 치면
Incremental Search


[Code Insight]

Ctrl + Space Code Completion 기능

Ctrl + J Code Template 기능

Ctrl + Shift + Up/Down Object 의 Member function/procedure 의 선언부와 구현부를 이동

Ctrl + Shift + C Object 의 Member function/procedure 의 선언부와 구현부중
의 한가지를 코딩 한후 누르게 되면 나머지 선언부 또는 구현부를 완성시켜줌


[기타]
Alt + F10 현재 위치에서 Popup-Menu 띄우기

Ctrl + Enter Code Editor 에서 현재위치의 단어로 File Open을 시도(기본 확장자
는 .pas) 하고 현재 Path 에서 그 파일을 찾지 못하면 File Open Dialog를 띄움.

Alt + { or } Find Matching Brace( ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[‘, ‘]’ )

#2에디터에서 Ctrl + E 를 하면 increment Search 가 됩니다. Ctrl+E 를 눌루고 문자열을 입력해 보세요
Ctrl+L 을 해도 다시 찾기 또는 다시 바꾸기를 할수 있습니다.

Alt+F11 은 유닛을 Uses 할때 사용하면 됩니다.

Ctrl+K+W 를 하면 선택한 블럭을 저장할수 있습니다.
Ctrl+K+R 을 하면 캐럿위치에 파일을 읽어서 붙일수 있습니다.

Ctrl+Alt+B 를 하면 현재 프로젝트에 설정된 BreakPoint 를 편집할수 있구 그 라인으로 이동할수 있습니다.


다시찾기 단축키
ctrl+f로 찾은후, F3을 누르면 다시 찾기가 됩니다.

 

토큰으로 찾기 단축키
커서가 토큰에 위치시키고는 ctrl + alt + 화살표 위로 또는
아래로 하면 커서위치의 토큰과 가장 가까이에 있는 토큰을 찾아갑니다.

ctrl + 마우스 왼쪽 클릭 단축키
ctrl + 화살표 위메소드 선언부바로가기
메소드선언부에서 ctrl+shift+화살표아래

 

메소드 구현부바로가기

메소드구현부에서 ctrl+shift+화살표위

 

컬럼블럭 선택 해제
선택: shift + alt + 화살표키하시면 컬럼열을 복사하실 수 있습니다.
해제: 그냥 편집창에서 마우스를 클릭하시면 해제됩니다.
또는 Ctrl+O+K를 하시면 해제됩니다.(이건 많은 분들이 모르시고 있더군요)

컴포넌트 이름은 알고 어떤 팔레트에 있는지 모를때
Alt + V + C를 하시고 컴포넌트 이름을 입력하셔서 찾으시면 됩니다.

델파이환경에서 unit을 제거했는데 dcu를 찾지 못할때..
델파이는 보통 컴파일시 변경된 파일만 체크하기 때문에 이런 문제가 나타날 수 있습니다.
그때는 Alt + P + B를 하시면 모두 빌드해서 에러를 잡으세요.

Project Group에서 여러 프로젝트를 한번에 빌드하기.
하나하나씩 컴파일 하지 마시고, Alt + P + E를 하시면 프로젝트 그룹내의 모든 프로젝트를 빌드하게 됩니다.

 


폼 디자이너
Ctrl + 방향키(←↑→↓) : 컴포넌트 위치 이동
Shift + Ctrl + 방향키(←↑→↓) : 컴포넌트 위치 이동(빠르게)
Shift + 방향키(←↑→↓) : 컴포넌트 크기 변경
선택 후 ESC : Parent컴포넌트로 이동

오브젝트 인스펙터
Ctrl + ↓ : 컴포넌트 선택기 팝업
(팝업 후 알파벳 문자 입력하여 해당 컴포넌트로 이동 가능)
Alt + ↓ : Property Combo 선택기 팝업
(팝업 후 알파벳 문자 입력하여 해당 컴포넌트로 이동 가능)
Ctrl + Enter : 열거형 Property값을 다음 값으로 변경
+선택 후, ←,→ : 하위 Property펼치기,접기
Ctrl + Tab : Properties,Events탭 전환
..선택 + Ctrl + Enter : Property Editor 열기
Tab : Property Name/Value토글

 

소스코드 에디터
Ctrl + Enter : 현재위치의 단어로 File Open 시도
현재 Path 에서 찾지 못하면 Dialog
Ctrl + S : 파일 저장
Ctrl + F4 : 파일 닫기
Ctrl + Shift + C : Method/Procedure/Property자동생성
Ctrl + Shift + ↑(↓) : 선언부,구현부 상호간 이동
Ctrl + Shift + R : 키 매크로 레코딩
Ctrl + Shift + P : 키 매크로 실행
Ctrl + ←,→ : 이전 단어, 다음 단어
Ctrl + Shift + ←,→ : 이전 단어, 다음 단어까지 블럭
Ctrl + Home : 소스코드 맨 앞으로 이동
Ctrl + End : 소스코드 맨 뒤로 이동
Shift + Home : 현재 라인 맨 앞까지 블럭
Shift + End : 현재 라인 맨 뒤까지 블럭
Ctrl + PageUp : 현재 화면의 맨 윗줄로 이동
Ctrl + PageDown : 현재 화면의 맨 아랫줄로 이동
Ctrl + Shift + I(U) : 현재 라인에 들여쓰기(내어쓰기)
Shift + Alt + 방향키(←↑→↓) : 블록 사각형 지정         -> Ctrl + Backspace : 해제
Ctrl + KL : 캐럿이 Line Home에 있을 때, Line 블럭
Ctrl + T : 현재 위치에서 마지막 단어까지 삭제
Ctrl + I : 블럭 지정된 문자를 공백으로 변환
Alt + {, } : '{'괄호 앞,뒤에서 사용. 짝 찾기.
Ctrl + N : 다음 Line 맨 앞으로 줄바꿈
Ctrl + M : 줄바꿈
Alt + BackSpace : 실행 취소
Ctrl + E : 한 글자 찾기
Ctrl + ↑(↓) : 캐럿 고정 스크롤
Ctrl + F : 찾기
Ctrl + R : 바꾸기

 

코드탐색기
F2 : 이름 변경하기(Uses제외)
DoubleClick : 소스코드 탐색기의 해당 코드로 이동
Ctrl + Shift + E : 탐색기<->에디터 창 이동

코드 인사이트(Code Insight)
Ctrl + Space : 코드완성 마법사
Ctrl + Shift : 메소드 파라미터 팁
Ctrl + J : 코드 템플릿 사용

 

기타 기능
Alt + F10 : 현재 위치에서 Popup-Menu 띄우기
F11 : View Object Inspector
F12 : Toggle Form/Unit
Alt + 0 : View Window List
Ctrl + F12 : View Unit
Shift + F12 : View Form 
 

출처 : 델마당 홍환민 님의 글!

 

저는 메신저를 만들어 볼떄 프로토콜을 만들면서 사용해 보았습니다. COPY DELETE보다 편한것같아서 참고하세요

 

문자열을 특정 구분자를 기준으로 나눠서 가져와야 할 일이 있을 겁니다.

예를 들어 "가을 운동회" 에서 저걸 가을, 운동회 라는 두개로 나눠서 가져오고 싶다고 합시다.

TStringList의 Delimiter와 DelimitedText 속성을 이용하는 방법도 있는데 구분자외에 특수문자인가

 

하는 것도 있어서 그 특수문자를 만나면 자동으로 짤려 버리는 문제가 있는 것으로 기억합니다.

ParsedList := TStringList.Create;
try
ExtractStrings([' '], [], PChar(FullStr), ParsedList);
finally
ParsedList.Free;
end;


위와 같이 TStringList를 하나 생성하셔서 ExtractStrings 함수에 넣어주면 원본 문자열

 

(위의 예에서는 FullStr) 을 주어진 구분자로 나누어서 ParsedList에 넣어줍니다.

ParsedList.Count, Strings[0]..[1].. 이런 속성을 이용해서 접근하시면 됩니다.

Q를 실습해 봤습니다.

실습 내용은 은행의 창구와 대기표를 구현했습니다.

공부는 류종택님의 동영상 강의를 보면서 했습니다. 유용한 강의라 좋습니다.

 

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,TicketQueue ;

.

.

.


  private
    { Private declarations }
    FTicketQueue : TTicketQueue;
    procedure m_Display;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnaddClick(Sender: TObject);
begin
   FTicketQueue.AddWaittingList;
   m_Display;
end;

procedure TfrmMain.btnTurn1Click(Sender: TObject);
var
   CurrNo : Integer;
begin
    if FTicketQueue.Empty then
    begin
       showMessage('대기하고 있는 손님이 없습니다.');
       exit;
    end;
   CurrNo := FTicketQueue.pop;
   memoDisplay.Lines.Values['[1번 창구]'] :=Format('  %d번 손님 창구로 오세요.',[CurrNo]);
   lblOne.Caption := IntToStr(CurrNo);
   m_Display;
end;

procedure TfrmMain.btnTurn2Click(Sender: TObject);
var
   CurrNo : Integer;
begin
    if FTicketQueue.Empty then
    begin
        showMessage('대기하고 있는 손님이 없습니다.');
        exit;
    end;
   CurrNo := FTicketQueue.pop;
   memoDisplay.Lines.Values['[2번 창구]'] :=Format('  %d번 손님 창구로 오세요.',[CurrNo]);
   lblTwo.Caption := IntToStr(CurrNo);
   m_Display;
end;

procedure TfrmMain.btnTurn3Click(Sender: TObject);
var
   CurrNo : Integer;
begin
    if FTicketQueue.Empty then
    begin
        showMessage('대기하고 있는 손님이 없습니다.');
       exit;
    end;
   CurrNo := FTicketQueue.pop;
   memoDisplay.Lines.Values['[3번 창구]'] :=Format('  %d번 손님 창구로 오세요.',[CurrNo]);
   lblThr.Caption := IntToStr(CurrNo);
   m_Display

end;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
   FTicketQueue.Clear;
   memoDisplay.Lines.Clear;
   lblOne.Caption := '00';
   lblTwo.Caption := '00';
   lblThr.Caption := '00';
   m_Display;
end;

procedure TfrmMain.m_Display;
begin
    memoDisplay.Lines.Values['전체 대기자']:=IntToStr(FTicketQueue.Count);
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
    FTicketQueue := TTicketQueue.create;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
    FTicketQueue.free;
end;

end.

 

 

unit TicketQueue;

interface
uses
   Classes, SysUtils;
  
type
   TTicketQueueNode = class
   private
   public
      Next : TTicketQueueNode;
      No : Integer;
   end;

   TTicketQueue = class
   private
      FHead, FTail   : TTicketQueueNode;
      FCurrentNo     : Integer;
      FCount         : Integer;
      function  GetEmpty : boolean;
   public
      procedure Clear;
      procedure AddWaittingList;
      function  pop:integer;
   published
      property Empty : Boolean read GetEmpty;
      property Count : Integer read FCount;
end;

implementation

procedure TTicketQueue.AddWaittingList;
var
   Item : TTicketQueueNode;
begin
   FCurrentNo  := FCurrentNo +1;
   FCount      := FCount + 1;

   Item := TTicketQueueNode.Create;
   Item.No := FCurrentNo;

   if FHead = nil then FHead := Item;

   if FTail <> nil then FTail.Next:= Item;
   FTail := Item;
   FTail.Next := nil;
end;

procedure TTicketQueue.Clear;
begin
   while Empty = False do pop;

   FCurrentNo  := 0;
   FCount      := 0;
end;


function TTicketQueue.GetEmpty:Boolean;
begin
   Result := FHead = nil;
end;

function TTicketQueue.pop: integer;
var
   item : TTicketQueueNode;
begin
   if Empty then raise Exception.Create('TicketQueue가 비어있습니다.');

   FCount  := FCount -1;
   item := FHead;
   FHead := FHead.Next;

   Result := item.No;

   FreeAndNil(item);
end;

end.

 

 

마우스 좌표를 구하는 두가지 방식입니다.

 

첫번째 윈도우 상에서의 마우스 좌표

 

procedure TForm1.Image1Click(Sender: TObject);
var
   fpint : TPoint;                                        //Tpoint 타입
begin
   Windows.GetCursorPos(fpint);                //윈도우상에서의 무우스 좌표
      StartX := fpint.X                                  // X좌표 추출
      StartY := fpint.Y                                  // Y좌표 추출
      lblView.Caption := 'X : '+IntToStr(StartX)+'  Y : '+IntToStr(StartY);
   end ;
end;

위에서 보듯 이벤트 자체가 마우스 클릭 이벤트입니다.

 

 

두번째 이미지 캔버스 안에서 만의 마우스 좌표

 

procedure TfrmMain.imgMainMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   lblView.Caption := 'X : '+IntToStr(X)+' Y : '+IntToStr(Y);

end;

이번에는 마우스 다운 이벤트로 이 프로시져 자체가 x,y좌표를 인수로 갖는다. 그냥 활용만 하면 됩니다.

OnSelectCell 이벤트에서 변경.

 


procedure SelectCell(Sender: TObject; ACol, ARow: Integer; var FSelect: Boolean);
begin
    if (ACol = Col) and (ARow = Row) then
begin
    {컬럼에서 수정모드 막음}
    TStringGrid(Sender).Options := TStringGrid(Sender).Options - [goEditing];
end
else
    TStringGrid(Sender).Options := TStringGrid(Sender).Options + [goEditing];
end;

 

 

델파이에 사용되는 VCL 레퍼런스입니다.

출처는 김상형 저 델파이정복 4.0 의 부록 내용입니다.

알파벳 순으로 되어있고요 그리 많은 양은 아니니 참고용으로 사용하세요

 

델파이_VCL_레퍼런스.PDF

 

델파이에 사용되는 함수들의 레퍼런스입니다.

 

출처는 김상형 저 델파이정복 4.0 의 부록 내용입니다.

 

알파벳 순으로 되어있고요  그리 많은 양은 아니니 참고용으로 사용하세요

 

델파이_함수_레퍼런스.PDF

TstringList 중에 입력받는 값중 중복값에 대한 제거....정확하게는 무시하는 기능이 있습니다.

 

FStrList 는 제가 선언한 TstringList 입니다.

FStrList.Duplicates := dupIgnore; //중복 제거
FStrList.Sorted := True; //정렬을 안 할 경우 적용안됨.

 위에도 기재 하였지만 정렬을 안할경우 결과값에 적용이 안됩니다.