::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-06 21:34:53, Hit : 4088, Vote : 1111
 특정 폼의 현재 편집중인 DB Field 구하기

// 소스를 실행하려면 DBGrid1, DBEdit1, DBEdit2, DBEdit3 은 전부
// DataSource1 에 연결시켜야 하며 DBEdit1, DBEdit2, DBEdit3는
// 임의의 DataField를 가지고 있어야 테스트가 됩니다
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  TypInfo, StdCtrls, Db, DBTables, Grids, DBGrids, Mask, DBCtrls, Buttons;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    Table1: TTable;
    DataSource1: TDataSource;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    SpeedButton1: TSpeedButton;
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.DFM}

// 주어진 Control이 data aware control 인지 검사하는 함수
// 검사 방법은 data aware control 은 전부 DataSource 프로퍼티를 가지고 있는데
// property 정보를 검사하여 DataSource 프로퍼티의 존재여부를 검사한다
function IsDBControl(AC: TControl; var Datasource: TDataSource): Boolean;
var
  ptrPropInfo: PPropInfo;
begin
  Result := False;
  if AC <> nil then
  begin
    // control의 프로퍼티들중 DataSource 프로퍼티 정보를 읽는다(없으면 nil)
    ptrPropInfo := GetPropInfo(AC.ClassInfo, 'DataSource');
    if Assigned(ptrPropInfo) and (ptrPropInfo^.PropType^.Kind = tkClass) then
    begin
      DataSource := Pointer(GetOrdProp(AC , ptrPropInfo));
      Result := Assigned(DataSource);
    end;
  end;
end;

// 주어진 Form의 현재 편집중인 Field를 구한다
// 구하는 방법은 먼저 주어진 폼의 Active된 Control이 data aware control인지
// 검사하고 그것이 DBGrid이면 선택된 필드를 리턴하고 그렇지 않은 Control이면
// DataField 프로퍼티를 가지고 있으면 그 필드를 리턴한다
function GetActiveField(Form: TForm): TField;
var
  Datasource: TDatasource;
  ptrPropInfo: PPropInfo;
  AC: TControl;
begin
  Result := nil;
  if Form <> nil then
  begin
    AC := Form.ActiveControl; // 폼의 포커스가 있는 control 을 구한다
    if IsDBControl(AC, DataSource) and // AC가 data aware control 인지 검사
      (Datasource <> nil) and
      (Datasource.DataSet <> nil) then
    begin
      if AC is TCustomDBGrid then // AC가 DBGrid이면 선택된 필드를
        Result := (AC as tCustomDBGrid).SelectedField
      else
      begin
        // control의 프로퍼티들중 DataField 프로퍼티 정보를 읽는다(없으면 nil)
        ptrPropInfo := GetPropInfo(AC.ClassInfo, 'DataField');
        if Assigned(ptrPropInfo) and (ptrPropInfo^.PropType^.Kind = tkLString) then
          Result := Datasource.Dataset.FindField(GetStrProp(AC, ptrPropInfo));
      end;
    end;
  end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  cField: TField;
begin
  // Active된 폼의 현재 편집중인 Field를 구한다
  cField := GetActiveField(Screen.ActiveForm);
  if cField <> nil then
    ShowMessage(cField.FieldName);
end;

end.





611   [데이터베이스] DB에 저장된 JPEG(JPG)를 DBGrid에 출력하기  김영대 2003/03/06 5247 1255
610   [데이터베이스] 동적으로 인덱스 만들기  김영대 2003/03/06 4467 1130
609   [데이터베이스] Excel ODBC를 사용하여 xls를 테이블로 사용하기  김영대 2003/03/06 6868 1604
608   [데이터베이스] DB alias중 ORACLE alias 명 구하기  김영대 2003/03/06 4011 973
607   [일반/컴포넌트] QuickReport에서 프린터 바꾸어서 출력하기  김영대 2003/03/06 6244 1547
606   [일반/컴포넌트] RichEdit 의 내용을 Bitmap 으로 만들기  김영대 2003/03/06 3356 876
605   [일반/컴포넌트] RichEdit 에서 문자(열)를 찾아 글자속성 바꾸기  김영대 2003/03/06 4746 1212
604   [일반/컴포넌트] RichEdit 에서 커서를 처음, 마지막으로 보내기  김영대 2003/03/06 6891 1480
603   [윈도우즈 API] 실행중인 모든 프로그램 Minimized 시키기  김영대 2003/03/06 4661 1237
602   [시스템] 델파이로 DOS 프로그램(Console application) 만들기  김영대 2003/03/06 17061 7528
601   [COM/OLE] Registering *.tlb files without Delphi  김영대 2003/03/06 5001 1133
600   [네트웍/인터넷] How to bring a network down - "Win Nuke"  김영대 2003/03/06 7309 1994
599   [윈도우즈 API] 폴더나 파일의 윈도우즈 등록정보 dialog 띄우기  김영대 2003/03/06 5097 1475
598   [일반/컴포넌트] 이미지를 마우스로 drag 해서 zoom 하기  김영대 2003/03/06 3605 1023
597   [윈도우즈 API] 외부 프로그램을 최상위로 설정하기  김영대 2003/03/06 5225 1234
596   [일반/컴포넌트] TObject의 프로퍼티를 문자열로 참조하기  김영대 2003/03/06 5227 1594
595   [윈도우즈 API] 프로그램으로 Screensaver 등록하는 두가지 방법  김영대 2003/03/06 4501 1268
  [데이터베이스] 특정 폼의 현재 편집중인 DB Field 구하기  김영대 2003/03/06 4088 1111
593   [윈도우즈 API] KeyDown의 Beep음을 없애자...  김영대 2003/03/06 4632 1211
592   [시스템] How do I use SetWindowsHookEx ?  김영대 2003/03/06 6839 957
591   [시스템] Redirecting DOS Application Output  김영대 2003/03/06 4642 1207
590   [일반/컴포넌트] 두개의 RichEdit 사이에 내용 복사하기  김영대 2003/03/06 5859 1364
589   [일반/컴포넌트] 특정 Color의 Invert Color 구하기  김영대 2003/03/06 4313 1315
588   [일반/컴포넌트] 문자열 수식문장(expression)의 결과 구하기  김영대 2003/03/06 3378 878
587   [시스템] 오디오 CD의 볼륨 조절하기  김영대 2003/03/06 3616 1026
586   [일반/컴포넌트] 윈도우즈 "날짜/시간" 설정화면 띄우기  김영대 2003/03/06 6207 1822
585   [시스템] 마이크 볼륨 조절하기  김영대 2003/03/06 4651 1285
584   [멀티미디어] JPEG, WAVE 를 resource 파일에 넣고 읽어오기  김영대 2003/03/06 5261 1224
583   [일반/컴포넌트] desktop 배경화면을 폼의 배경화면으로 그리기  김영대 2003/03/06 3676 1037
582   [윈도우즈 API] 레지스트리의 변경여부 알리는 2가지 방법  김영대 2003/03/06 4759 1282
581   [일반/컴포넌트] StringGrid 의 내용을 클립보드로 복사하기  김영대 2003/03/06 4466 1060
580   [데이터베이스] Save DBGrid To Excel  김영대 2003/03/06 6992 1849
579   [COM/OLE] Delphi의 OCX를 InstallShield로 배포하는 방법  김영대 2003/03/06 8333 5623
578   [일반/컴포넌트] ASCII printing  김영대 2003/03/06 5282 1213
577   [일반/컴포넌트] OEM conversion  김영대 2003/03/06 4321 1265
576   [일반/컴포넌트] Memo의 행의 문자수를 제한하고 WordWrap시키기  김영대 2003/03/06 5231 1314
575   [윈도우즈 API] DDE 쓰지 않고 IE의 현재 URL 가져오기  김영대 2003/03/06 5986 1676
574   [윈도우즈 API] RichEdit에 입력한 문장의 실제 높이 구하기  김영대 2003/03/06 5045 1429
573   [일반/컴포넌트] StringGrid 의 선택영역만 클립보드로 복사하기  김영대 2003/03/06 4863 1077
572   [일반/컴포넌트] StringGrid 에서 프로그램으로 MultiSelect 시키기  김영대 2003/03/06 5410 1187

[1][2][3][4][5][6][7][8][9] 10 ..[25] [다음 10개]
 

Copyright 1999-2022 Zeroboard / skin by zero