powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дженерики: передача процедуры в качестве параметра
25 сообщений из 108, страница 2 из 5
Дженерики: передача процедуры в качестве параметра
    #39725088
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и TCustomEqualityComparer.Create -> указать
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725089
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понял...
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725090
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну т.е. написать СВОИ методы?
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725092
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

Ну да, пишешь GetHashCode - с Upper вначале - и получаешь регистронезависимость
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725095
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Откуда то со Стэка...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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;
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725112
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то я стормозил.
Пишу:

объявил
Код: pascal
1.
2.
3.
4.
5.
6.
type
  TCustomEqualityComparer = class(TEqualityComparer<string>)
  public
    function Equals(const Left, Right: string): Boolean; override;
    function GetHashCode(const Value: string): Integer; override;
  end;




реализация
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
{ 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;



Создаю словарь:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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 - не выполняется
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725120
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

CustomEqualityComparer - а создать его?
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725126
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точно

но... вижу, что моя GetHashCode выполняется, а моя Equals - нет.
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725131
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

А нафига, он кстати при добавлении будет выполняться ?
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725136
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GetHashCode выполняется, когда в словарь добавляю
Код: pascal
1.
2.
DicCmdRows.Add('/start', PcmdStart);
DicCmdRows.Add('/время', PcmdShowTime);



а потом ещё, когда приходит боту команда "/ S tart"
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725138
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubX11,

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

а я откуда знаю? я ж его не заставляю, видать разработчики дельфи так захотели
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725144
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пришлось переделать так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
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;



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

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

Так правильно?
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725145
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пошарился, по сети, вижу, что я не одинок
http://www.devsuperpage.com/search/Articles.aspx?G=2&ArtID=28868

тоже кто-то переделал GetHashCode
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725147
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

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

Единственное хэш, как-то по другому надо теперь получать THash.BobJenkins.GetHash - как-то так...
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725148
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, что разработчики Delphi не сделали это сами, заранее.
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725149
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubX11,

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

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

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

'BobJenkinsHash' is deprecated: 'Use System.Hash.THashBobJenkins.GetHashValue'
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725151
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Всё проще -- AnsiLowerCase перед добавлением/проверкой...
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725153
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiX11,

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

Настоящие герои всегда идут в обход
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725154
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Странно, что разработчики Delphi не сделали это сами, заранее.
А не стоит ли задуматься, что если ради какой-то своей фичи приходится ТАК извращаться и лезть в самые дебри -- то что-то пошло не так и надо пересмотреть подход к решению своей проблемы?
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725155
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDi,

Это если не надо хранить оригинал
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725163
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делаю примерно так же, как и пример у Jadi +-
Только пример с формами (TForm).
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
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.


...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725166
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Не смог найти.
Поэтому вопрос.
А есть ли у Delphi встроенный способ создать словарь с регистронезависимым (case-insensitive) поиском по ключам?
Или нужно самому пилить?

Код: pascal
1.
 FClassesList := TDictionary<string, TForm>.Create(TIStringComparer.Ordinal);
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725229
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BX11Не смог найти.
Поэтому вопрос.
А есть ли у Delphi встроенный способ создать словарь с регистронезависимым (case-insensitive) поиском по ключам?
Или нужно самому пилить?

Код: pascal
1.
 FClassesList := TDictionary<string, TForm>.Create(TIStringComparer.Ordinal);



я пробовал Ordinal - он регистразависим
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725253
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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'];
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39725287
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,
смотри создание TPersistentClassDictionary в System.Classes.pas
или как тебе Valery_B посоветовал
...
Рейтинг: 0 / 0
25 сообщений из 108, страница 2 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дженерики: передача процедуры в качестве параметра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]