Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
 Re: Дженерики: передача процедуры в качестве параметра  [new]
zinpub
Member

Откуда:
Сообщений: 272
Ну и TCustomEqualityComparer.Create -> указать
30 окт 18, 16:49    [21719235]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
не понял...
30 окт 18, 16:49    [21719236]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
Ну т.е. написать СВОИ методы?
30 окт 18, 16:50    [21719237]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
zinpub
Member

Откуда:
Сообщений: 272
X11,

Ну да, пишешь GetHashCode - с Upper вначале - и получаешь регистронезависимость
30 окт 18, 16:52    [21719239]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
zinpub
Member

Откуда:
Сообщений: 272
Откуда то со Стэка...

function TCustomEqualityComparer.Equals(const Left, Right: string): Boolean;
begin
  {$IFDEF UNICODE }
    Result := (Left.ToUpper = Right.ToUpper);
  {$ELSE }
    Result := SameText(Left, Right);
  {$ENDIF }
end;

function TCustomEqualityComparer.GetHashCode(const Value: string): Integer;
var s: string;
begin
  s := {$IFDEF UNICODE } Value.ToUpper {$ELSE } UpperCase(Value) {$ENDIF };
  Result := BobJenkinsHash(s[1], Length(s) * SizeOf(s[1]), 0);
end;
30 окт 18, 16:53    [21719244]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
Где-то я стормозил.
Пишу:

объявил
type
  TCustomEqualityComparer = class(TEqualityComparer<string>)
  public
    function Equals(const Left, Right: string): Boolean; override;
    function GetHashCode(const Value: string): Integer; override;
  end;



реализация
{ TCustomEqualityComparer }

function TCustomEqualityComparer.Equals(const Left, Right: string): Boolean;
begin
ставлю точку останова - сюда даже не заходит 
  Result := Left.ToLowerInvariant = Right.ToLowerInvariant;
end;

function TCustomEqualityComparer.GetHashCode(const Value: string): Integer;
begin
  Result := BobJenkinsHash(Value[1], Length(Value) * SizeOf(Value[1]), 0);
end;


Создаю словарь:
procedure TfmMainTelegramBot.RegisterCommands;
Var
  CustomEqualityComparer: TCustomEqualityComparer;
begin
  if Not Assigned(DicCmdRows) then
    DicCmdRows := TDictionary<string, TBotProcRef>.Create(CustomEqualityComparer)
  else
    DicCmdRows.Clear;

//добавление соответствия команды и процедуры, которая будет срабатывать
  DicCmdRows.Add('/start', PcmdStart);
  DicCmdRows.Add('/время', PcmdShowTime);

end;


/start выполняется
/Start - не выполняется
30 окт 18, 17:07    [21719269]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
zinpub
Member

Откуда:
Сообщений: 272
X11,

CustomEqualityComparer - а создать его?
30 окт 18, 17:12    [21719279]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
точно

но... вижу, что моя GetHashCode выполняется, а моя Equals - нет.
30 окт 18, 17:20    [21719291]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
zinpub
Member

Откуда:
Сообщений: 272
X11,

А нафига, он кстати при добавлении будет выполняться ?
30 окт 18, 17:22    [21719303]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
GetHashCode выполняется, когда в словарь добавляю
DicCmdRows.Add('/start', PcmdStart);
DicCmdRows.Add('/время', PcmdShowTime);


а потом ещё, когда приходит боту команда "/Start"
30 окт 18, 17:25    [21719312]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
zinpub
X11,

А нафига, он кстати при добавлении будет выполняться ?


а я откуда знаю? я ж его не заставляю, видать разработчики дельфи так захотели
30 окт 18, 17:26    [21719315]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
Пришлось переделать так:

function TCustomEqualityComparer.GetHashCode(const Value: string): Integer;
Var
  Value2: string;
begin
  Value2 := Value.ToLowerInvariant;
  Result := BobJenkinsHash(Value2[1], Length(Value2) * SizeOf(Value2[1]), 0);
end;


т.е. сперва приводим к нижнему регистру.

Теперь работает.

Так правильно?
30 окт 18, 17:28    [21719323]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
Пошарился, по сети, вижу, что я не одинок
http://www.devsuperpage.com/search/Articles.aspx?G=2&ArtID=28868

тоже кто-то переделал GetHashCode
30 окт 18, 17:29    [21719324]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
zinpub
Member

Откуда:
Сообщений: 272
X11,

Ну как-то так...

Единственное хэш, как-то по другому надо теперь получать THash.BobJenkins.GetHash - как-то так...
30 окт 18, 17:29    [21719326]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
Странно, что разработчики Delphi не сделали это сами, заранее.
30 окт 18, 17:30    [21719327]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
zinpub
X11,

Ну как-то так...

Единственное хэш, как-то по другому надо теперь получать THash.BobJenkins.GetHash - как-то так...


Да, за такие подсказки разработчикам спасибо.

'BobJenkinsHash' is deprecated: 'Use System.Hash.THashBobJenkins.GetHashValue'
30 окт 18, 17:32    [21719328]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3845
X11,

Всё проще -- AnsiLowerCase перед добавлением/проверкой...
30 окт 18, 17:34    [21719333]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
JaDi
X11,

Всё проще -- AnsiLowerCase перед добавлением/проверкой...


Настоящие герои всегда идут в обход
30 окт 18, 17:36    [21719341]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3845
X11
Странно, что разработчики Delphi не сделали это сами, заранее.

А не стоит ли задуматься, что если ради какой-то своей фичи приходится ТАК извращаться и лезть в самые дебри -- то что-то пошло не так и надо пересмотреть подход к решению своей проблемы?
30 окт 18, 17:37    [21719342]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
zinpub
Member

Откуда:
Сообщений: 272
JaDi,

Это если не надо хранить оригинал
30 окт 18, 17:37    [21719343]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1807
Я делаю примерно так же, как и пример у Jadi +-
Только пример с формами (TForm).
+
type

TModalForm = class(TForm)
 public
  procedure Initialize;virtual;
  function Execute:Boolean; virtual;
end;
  
TModalFormClass = class of TModalForm;

TDialogManager  =  class
 public
  function ShowDialog(const Name:String):Boolean;
  class procedure RegisterDialog(const DialogName:string; AClass:TModalFormClass); 
end;

implementation
var
  FClassesList = TDictionary <string, TModalFormClass>

class procedure RegisterDialog(const DialogName:string; AClass:TModalFormClass); 
begin
 if not Assigned(FClassesList) then 
  FClassesList:=TDictionary <string, TModalFormClass>;
  FClassesList.Add(Name,AClass);
end;

function TDialogManager.ShowDialog(const Name:String):Boolean;
var
 Dlg:TModalForm;
begin
 Dlg:=FClassesList[Name].Create(nil);
  try
    Dlg.Initialize;
    Result:=Dlg.Execute;
  finally
    Dlg.Free;
 end;
end;

initialization

finalization
 FClassesList.Free;
end.

30 окт 18, 17:46    [21719358]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1807
X11
Не смог найти.
Поэтому вопрос.
А есть ли у Delphi встроенный способ создать словарь с регистронезависимым (case-insensitive) поиском по ключам?
Или нужно самому пилить?


 FClassesList := TDictionary<string, TForm>.Create(TIStringComparer.Ordinal);
30 окт 18, 17:52    [21719368]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
Valery_B
X11
Не смог найти.
Поэтому вопрос.
А есть ли у Delphi встроенный способ создать словарь с регистронезависимым (case-insensitive) поиском по ключам?
Или нужно самому пилить?


 FClassesList := TDictionary<string, TForm>.Create(TIStringComparer.Ordinal);


я пробовал Ordinal - он регистразависим
30 окт 18, 19:41    [21719463]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1161
var
  A: TDictionary<string, Int32>;
begin
  A := TDictionary<string, Int32>.Create(
    TEqualityComparer<string>.Construct(
      function(const aLeft, aRight: string): Boolean
      begin
        Exit(aLeft.ToUpper().Equals(aRight.ToUpper()));
      end,
      function(const aValue: string): Integer
      begin
        Exit(THashBobJenkins.GetHashValue(aValue.ToUpper()));
      end
    )
  );
  A.Add('k', 50);
  A.Items['K'];
30 окт 18, 20:29    [21719501]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1928
X11,
смотри создание TPersistentClassDictionary в System.Classes.pas
или как тебе Valery_B посоветовал
30 окт 18, 21:21    [21719542]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
Все форумы / Delphi Ответить