Как я создаю пользовательский элемент управления с подпанелью, которая принимает другие средства управления во время проектирования? [дубликат]

Как отмечается в комментариях, в одной из строк есть завершающие символы новой строки. Следовательно, они не равны.

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

def normalize(string):
    string = string.strip()  # Remove any leading or trailing whitespaces
    string = string.lower()  # Make all letters lowercase 
    string = " ".join(string.split())  # If the user hit spacebar twice, for example, will remove the double space. Note can have side effects.
    return string 

Затем проверьте

if normalize(string1) == normalize(string2):
    do_something() 

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

Поэтому я рекомендую также взглянуть на библиотеку нечетких слов

from fuzzywuzzy import fuzz 

def similar(string1, string2):
    ratio = fuzz.ratio(string1, string2)
    return ratio >= 85  # number between 0 and 100. Higher means fewer differences are allowed

. Нечеткий язык очень мощный и простой в использовании. Для получения дополнительной информации: https://github.com/seatgeek/fuzzywuzzy

6
задан Thomas Mueller 18 December 2008 в 07:49
поделиться

2 ответа

Это - хороший вопрос. Можно позволить пользовательскому TWinControl отбрасывать другие средства управления на нем во время проектирования путем добавления csAcceptControls к свойству ControlStyle средств управления.

constructor TMyContainer.Create(AOwner: TComponent);
begin
  inherited;
  ControlStyle := ControlStyle + [csAcceptControls];
end;

Но в попытке разработать это, я имел мало успеха со способностью отбросить средства управления на sub панель в пользовательском элементе управления. Добавление csAcceptControls к ControlStyle sub панели не достаточно. Шкаф, который я получил, является взломом для убеждения sub панели, что это разрабатывается как так:

type
  TGiveMeProtected_Component = class(TComponent);

procedure TMyContainer.Create(AOwner: TComponent);
begin
  FSubPanel := TPanel.Create(Self);
  TGiveMeProtected_Component(FSubPanel).SetDesigning(True, True);
end;

С помощью того кода можно теперь отбросить средства управления на sub панель, но это означает, что можно также выбрать sub панель, изменение, это - свойства и даже удаляет его, который Вы определенно не хотите. Извините я не мог придумать ответ, я буду все еще любить знать, разрабатываете ли Вы его.:)

2
ответ дан 17 December 2019 в 18:20
поделиться

Я не могу сказать от деталей, но Вы устанавливаете родителя маркировки Вам sub панель? Если во время проектирования, Вы, возможно, должны написать код в своем основном компоненте (например, контейнер, в котором находятся Ваши панели), для выяснения, какая подпанель принимает компонент и установила маркировки, порождает свойство к той подпанели.

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

1
ответ дан 17 December 2019 в 18:20
поделиться
Другие вопросы по тегам:

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