Перечисления по сравнению с Константой по сравнению с Константой Класса в программировании Delphi

Похоже, ваш запрос написан неправильно. Похоже, вы используете hibernate для получения списка объектов с помощью id деления. Попробуйте написать запрос следующим образом:

FROM District a WHERE a.division.id =:division

ID должен иметь тип Long.

query.setParameter("division", Long.parseLong(division));

Он должен работать именно так, как вы хотите.

14
задан Ned Batchelder 16 July 2010 в 19:36
поделиться

5 ответов

Я не сказал бы, что класс consts не является Delphi путь. Это просто, они были представлены Delphi совсем недавно и большому количеству книг и статей, которые Вы найдете в Интернете, были записаны перед их введением, и таким образом Вы не будете видеть их широко используемый. Многие разработчики Delphi (я сказал бы, что большинство), начнет использовать Delphi, прежде чем они были сделаны доступными, и таким образом они не первая вещь, о которой каждый думает.

11
ответ дан 1 December 2019 в 09:13
поделиться

Объявление:

type
  TMyValues = class
    type TMyEnum = (myValue1, myValue2, myValue3, myValue4);
    const MyStrVals: array [TMyEnum] of string =
      ('One', 'Two', 'Three', 'Four');
    const MyIntVals: array [TMyEnum] of integer =
      (1, 2, 3, 4);
  end;

Использование:

if ClientDataSet_Field.AsInteger = TMyValues.MyIntVals[myValue1] then

Бросок обычно был бы моим последним выбором.

12
ответ дан 1 December 2019 в 09:13
поделиться

Одной вещью рассмотреть является назад совместимость - константы класса относительно в новинку для Delphi поэтому, если Ваш код должен быть с обеспечением совместного доступа с предыдущими версиями, чем они отсутствуют.

Я обычно использую перечислимые типы, с различием от Вашего то, что мое первое перечисление обычно является 'неопределенным' объектом для представления ПУСТОГО УКАЗАТЕЛЯ или 0 в международном поле.

TmyValues = (myvUndefined, myvDescription1, myvDescription2)

if ClientDataSet_Field.AsInteger = Ord(myvDescription1) then...

Для использования определенного ответа Jim McKeeth - если необходимо отобразить пользователю текст видимая версия, или если необходимо преобразовать их выделенный текст в перечислимый тип затем массив пригождается в conjuction с типом:

const MYVALS: array [TmyValues ] of string = ('', 'Description1', 'Description2');

У Вас могут затем быть служебные функции для устанавливания/получения перечислимого типа на строку:

Function MyValString(const pMyVal:TmyValues):string;
begin
  result := MYVALS[Ord(pMyVal)];
end;

Function StringToMyVal(const pMyVal:String):TMyValues;
var i:Integer;
begin
  result := myvUndefined;
  for i := Low(MYVALS) to High(MYVALS) do
  begin
    if SameText(pMyVal, MYVALS[i]) then
    begin
      result := TMyValues(i);
      break;
    end;
  end;
end;

Продвижение... у Вас может быть точечная стандартная программа для установки комбинации/поля списка:

Procedure SetList(const DestList:TStrings);
begin
  DestList.Clear;
  for i := Low(MYVALS) to High(MYVALS) do
  begin
    DestList.Insert(MYVALS[i]);
  end;
end;

В коде: SetList (Combo1. Объекты) или SetList (ListBox1. Объекты)..

Затем, если Вы видите шаблон здесь... полезные служебные функции, окружающие Ваше перечисление, затем Вы добавляете все к своему собственному классу и помещаете этот класс в свою собственную единицу под названием MyValueEnumeration или whaterver. Вы заканчиваете со всем кодом, окружающим это перечисление в одном месте, и продолжаете добавлять служебные функции, поскольку Вам нужны они. Если Вы содержите единицу в чистоте - не смешиваются в другой несвязанной функциональности затем, это останется очень удобным для всех проектов, связанных с тем перечислением.

Вы будете видеть больше шаблонов с течением времени, и Вы используете ту же функциональность много раз, и Вы создадите лучшую мышеловку снова.

4
ответ дан 1 December 2019 в 09:13
поделиться

столько опций! :-) я предпочитаю перечисления и обычно использую их, как Вы описываете. одной из первых частей нравится, то, что я могу использовать их с "для" цикла. я действительно использую константы класса также, но предпочитаю перечисления (даже частные перечисления) в зависимости от того, чего я пытаюсь достигнуть.

TMyType=class
private const    // d2007 & later i think
  iMaxItems=1;   // d2007 & later i think
private type     // d2007 & later i think
  TMyValues = (mvValue1 = 1, mvValue2 = 2);     // d2007 & later i think
private
public
end;
1
ответ дан 1 December 2019 в 09:13
поделиться

Опция, о которой Вы не думали, состоит в том, чтобы использовать справочную таблицу в базе данных, и затем можно проверить по строке в базе данных.

например.

 Select value, Description from tbl_values inner join tbl_lookup_values where tbl_values.Value = tbl_lookup_values.value

if ClientDataSet_Field.AsString = 'ValueIwant' then
0
ответ дан 1 December 2019 в 09:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: