Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как определить чему равна переменная с набором set


Автор: codexby 12.12.2008, 15:20
приветствую!

в компоненте EWB функция SearchNextText возращает значение типа TSearchResults, где
TSearchResult = (srNotFound, srEndOf, srFound);
TSearchResults = set of TSearchResult;

как узнать какое значение вернула функция?

спасибо

Автор: Rrader 12.12.2008, 16:01
Есть такой оператор in

Код

type
  TSearchResult = (srNotFound, srEndOf, srFound);
  TSearchResults = set of TSearchResult;

implementation

function GetSearchResults: TSearchResults;
begin
  Result := [srEndOf, srFound];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Res: TSearchResults;
begin
  Res := GetSearchResults;
  if srNotFound in Res then 
    ShowMessage('srNotFound');
  if srEndOf in Res then 
    ShowMessage('srEndOf');
  if srFound in Res then 
    ShowMessage('srFound');
end;


Добавлено через 43 секунды
Будут показаны два последних сообщения

Автор: Akella 12.12.2008, 16:29
Rrader, может Case?

Автор: Rrader 12.12.2008, 16:37
Akella, мог бы и проверить smile 

Автор: Christoph 12.12.2008, 23:49
А Case работает помоему только с целім типом, или я ошибаюсь?

Автор: Rrader 13.12.2008, 06:27
Christoph, не только с целыми. С ординальными типами вообще:

Цитата(Lingvo)

Ordinal type

К таким типам относятся данные, у которых каждое значение, кроме первого, имеет уникального предшественника, а каждое значение, кроме последнего, имеет уникального преемника, в частности, этот тип может описывать и беззнаковые целые числа.

Т.е. помимо целых чисел, можно выбирать и из перечислений (Enum), и из символов (Char).

Автор: Akella 13.12.2008, 11:35
Цитата(Christoph @  12.12.2008,  23:49 Найти цитируемый пост)
А Case работает помоему только с целім типом, или я ошибаюсь? 

не совсем так, нужен перечислимый тип, так сказать

Автор: mutex 14.12.2008, 18:40
Если EWB - компонент и есть опубликованное (published) свойство типа TSearchResults, можно использовать RTTI - инфо о типах времени выполнения. Достаточно одного вызова:
Label1.Caption := GetSetProp(EWB, GetPropInfo(EWB, 'SearchResults', [tkSet]), True);
И результат увидите в виде: [srEndOf,srFound].

Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    Button1: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure CheckBoxClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

type
  TSearchResult = (srNotFound, srEndOf, srFound);
  TSearchResults = set of TSearchResult;

  TEWB = class(TComponent)
  private
    FSearchResults: TSearchResults;
  published
    property SearchResults: TSearchResults
      read FSearchResults write FSearchResults;
  end;

var
  EWB: TEWB;

implementation

{$R *.dfm}

uses
  TypInfo;
  
procedure TForm1.FormCreate(Sender: TObject);
begin
  EWB := TEWB.Create(nil);
  CheckBoxClick(CheckBox1);
  CheckBoxClick(CheckBox2);
  CheckBoxClick(CheckBox3);
  Button1Click(nil);
end;

procedure TForm1.CheckBoxClick(Sender: TObject);
begin
  with EWB do
    if TCheckBox(Sender).Checked then
      case TCheckBox(Sender).Tag of
        0: SearchResults := SearchResults + [srNotFound];
        1: SearchResults := SearchResults + [srEndOf];
        2: SearchResults := SearchResults + [srFound];
      end
    else
      case TCheckBox(Sender).Tag of
        0: SearchResults := SearchResults - [srNotFound];
        1: SearchResults := SearchResults - [srEndOf];
        2: SearchResults := SearchResults - [srFound];
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := GetSetProp(EWB,
    GetPropInfo(EWB, 'SearchResults', [tkSet]), True);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  EWB.Free;
end;

end.


Приложение: проект на 7-м Дельфи.
PS. Обработчик CheckBoxClick является общим для трех флажков.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)