728x90
Delphi에서 StrToInt을 하는 경우 Exception 발생하는데, Debug 시에는 귀찮을 때가 있어
Tip을 올립니다.

SysUtil.pas의 StrToInt 내부를 보면,
Var 함수를 사용하고 있는데, 3번째 인자의 값이 0이 아니면 Exception을 발생하도록 되어 있습니다.

function StrToInt(const S: string): Integer;
var
  E: Integer;
begin
  Val(S, Result, E);
  if E <> 0 then ConvertErrorFmt(@SInvalidInteger, [S]);
end;

사용예)
아래의 예를 보시면 Result 값을 0으로 초기화 하고
Var의 3번째 인자의 값이 0이면 Result에 값에 담아서 반환하도록 했습니다.

function StrToInt2(const S: string): Integer;
var
  intTemp, E : Integer;
begin
  Result := 0;
  // 숫자 여부 확인
  Val(S, intTemp , E);
  if E=0 then
    Result := intTemp ;
end
728x90
728x90


uses
  StrUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  tmpDirStr : String;
  offset : integer;

  function GetFindStr(SubFindStr : String; var offset : integer):string;
  var
    offsetOld, offset2 : integer;
  begin
    Result := '';

    offset2 := 0;
    if SubFindStr[offset] = '/' then
      inc(offset2);

    offsetOld := offset;
    offset := PosEx('/', SubFindStr, offset + offset2);

    if offset>0 then begin
      Result := MidStr(SubFindStr, offsetOld + offset2, offset-offsetOld-offset2);
    end;
  end;

begin
  tmpDirStr := Edit1.Text;

  if (tmpDirStr[Length(tmpDirStr)]<>'/') then
    tmpDirStr := tmpDirStr + '/';

  offset := 1;

  while (offset > 0) do begin
    Memo1.Lines.Add(GetFindStr(tmpDirStr, offset));
  end;
end;

728x90
728x90

type
  TDatabaseType
    = (dbtMSSQL, dbtOracle, dbtCUBRID, dbtSybase, dbtNone);

  TDatabaseSet = set of TDatabaseType;

const
  StrDatabaseNames : array[TDatabaseType] of String
    = ('MSSQL', 'Oracle', 'CUBRID', 'Sybase', 'None');

 함수  내용
 Typeinfo  열거형의 형정보(TypeInfo)에 대한 포인터 반환
 GetEnumName  열거형의 각 멤버를 문자열로 반환
 GetEnumValue  
 Ord  
 Pred  
 Succ  
 Dec  
 Inc  
 Low  


procedure TForm1.Button1Click(Sender: TObject);
var
  DatabaseType : TDatabaseType;
begin
  // GetEnumValue : String to Enum
  DatabaseType := TDatabaseType(GetEnumValue(TypeInfo(TDatabaseType), 'dbtOracle'));

  // GetEnumName : Enum to String
  ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType))); // dbtOracle

  // Ord
  ShowMessage(IntToStr(Ord(dbtOracle))); // 1

  // Dec
  Dec(DatabaseType);
  ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType))); // dbtMSSQL

  // Inc
  Inc(DatabaseType);
  ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType))); // dbtOracle

  // Low, High / Loop
  for DatabaseType := Low(TDatabaseType) to High(TDatabaseType) do
    ShowMessage(GetEnumName(TypeInfo(TDatabaseType), Ord(DatabaseType)));
end;

Delphi Set배열

uses
  TypInfo;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : TDBObjectType;
begin
  for i in UniSQLObjectSet[DBVer_CUBRID] do begin
    Memo1.Lines.Add('i=' + GetEnumName ( TypeInfo ( TDBObjectType ), Ord(i) ) );
  end;

end;

- end -

728x90
728x90

원본 사이트 : http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_10231553.html

procedure TForm1.Button1Click(Sender: TObject);

  function GetLocale(ALcid: Integer): string;
  var s: string;
  begin
    Result := '[Unknown]';
    SetLength(s, 128);
    if GetLocaleInfo(ALcid, LOCALE_SENGLANGUAGE, PChar(s), 128) > 0 then
      begin
        Result := StrPas(PChar(s));
        if GetLocaleInfo(ALcid, LOCALE_SENGCOUNTRY, PChar(s), 128) > 0 then
          begin
            Result := Format('%s (%s)', [Result, StrPas(PChar(s))]);
          end;
      end;
  end;

begin
  showmessage(GetLocale(GetUserDefaultLangID));
end;


 

728x90
728x90

- Query 실행후 동적으로 컬럼 추가

(cxGridDBTableView1.DataController as IcxCustomGridDataController).DeleteAllItems;
(cxGridDBTableView1.DataController as IcxCustomGridDataController).CreateAllItems(true);
cxGridDBTableView1.ApplyBestFit();

- [Enter] 키로 Cell 이동

cxGrid1TableView1.OptionsBehavior.FocusCellOnCycle := true;
cxGrid1TableView1.OptionsBehavior.FocusCellOnTab := true;
cxGrid1TableView1.OptionsBehavior.FocusFirstCellOnNewRecord := true;
cxGrid1TableView1.OptionsBehavior.GoToNextCellOnEnter := true;

- 속성

속성명 자료형 설명
OptionsBehavior.CopyCaptionsToClipboard Boolean 클립보드에 복사할 때 캡션도 복사할지 여부
OptionsSelection.CellMultiSelect Boolean Cell 다중 선택 여부
OptionsSelection.CellSelect Boolean Cell별로 선택 가능 여부
OptionsSelection.MultiSelect Boolean Row 다중 선택 여부

- TcxCustomDataSource

TDatasetFieldModel=class(TcxCustomDataSource)
  private
    DatasetAnalyzer : TDatasetAnalyzer;
  protected
    function GetRecordCount: Integer; override;
    function GetValue(ARecordHandle: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle): Variant; override;
  public
    constructor Create;
    destructor Destroy; override;
  end;

implementation

{ TDatasetFieldModel }

constructor TDatasetFieldModel.Create;
begin
  inherited Create;
  DatasetAnalyzer := TDatasetAnalyzer.Create(TDatasetField);
end;

destructor TDatasetFieldModel.Destroy;
begin
  DatasetAnalyzer.Free;
  inherited Destroy;
end;

function TDatasetFieldModel.GetRecordCount: Integer;
begin
  Result := DatasetAnalyzer.Count;
end;

function TDatasetFieldModel.GetValue(ARecordHandle: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle): Variant;
var
  AColumnId: Integer;
  theField : TDatasetField;
begin
  result := Variants.Null;
  AColumnId := GetDefaultItemID(Integer(AItemHandle));

  if Integer(ARecordHandle) < Self.GetRecordCount then begin
    theField := (DatasetAnalyzer.Items[Integer(ARecordHandle)] as TDatasetField);
    if Assigned(theField) then begin
      case AColumnId of
        0 : Result := theField.FieldName;
        1 : Result := theField.DataTypeStr;
        2 : Result := theField.Size;
      end;
    end;
  end;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  DatasetFieldModel := TDatasetFieldModel.Create;
  cxGrid1TableView1.DataController.CustomDataSource := DatasetFieldModel;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  if ListBox1.ItemIndex >= 0 then begin
    Table1.Active := false;
    Table1.TableName := ListBox1.Items.Strings[ListBox1.ItemIndex];
    Table1.Active := true;

    DatasetFieldModel.DatasetAnalyzer.Analyzer(Table1);
    DatasetFieldModel.DataChanged;
  end;
end;

- 한글관련 버그 수정 (Delphi 2009 이상

사이트 : http://eaglesoft.tistory.com/162

- 옵션

cxGrid1TableView1.OptionsView.GroupByBox := false;
cxGrid1TableView1.OptionsData.Editing := false;  // 읽기전용

- ??

procedure TCreateTableFrm.Col1GetProperties(
  Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
  var AProperties: TcxCustomEditProperties);
var
  rowData : TRowObject;
begin
  rowData := TRowObject(CustomGridModel.RowDataList.Items[ARecord.Index]);


  ...
end;

- 수정중인 Cell 바로 적용

cxGrid1TableView1.DataController.PostEditingData;

- end - 

728x90
728x90
728x90
728x90

참조
http://delphigeist.blogspot.com/2009/11/saveload-controls-from-inifile-using.html

uses
  inifiles;

procedure TForm1.FormCreate(Sender: TObject);
var
  IniFile  : TiniFile;
begin
  //
  IniFile  := TiniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
  try
    isDEBUG := IniFile.ReadBool('INFO', 'DEBUG', false);
  finally
    IniFile.Free;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  IniFile  : TiniFile;
begin
  //
  IniFile  := TiniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
  try
    IniFile.WriteBool('INFO', 'DEBUG', isDEBUG);
  finally
    IniFile.Free;
  end;
end;

728x90
728x90

uses
  Dialogs;

function MessageDlg(const Msg: string; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; overload;

TMsgDlgType = (
  mtWarning,
  mtError,
  mtInformation,
  mtConfirmation,
  mtCustom
);

TMsgDlgBtn = (
  mbYes,
  mbNo,
  mbOK,
  mbCancel,
  mbAbort,
  mbRetry,
  mbIgnore,
  mbAll,
  mbNoToAll,
  mbYesToAll,
  mbHelp,
  mbClose
);

if MessageDlg('종료 할래?', mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then begin
  Close;
end;

728x90

+ Recent posts