Как отмечается в комментариях, в одной из строк есть завершающие символы новой строки. Следовательно, они не равны.
Однако я бы не просто удалил новую строку. Всегда хорошая практика, если ваша логика это позволяет, нормализовать строки перед проверкой на равенство. Есть много вещей, которые вы можете сделать для нормализации:
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
Это - хороший вопрос. Можно позволить пользовательскому 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 панель, изменение, это - свойства и даже удаляет его, который Вы определенно не хотите. Извините я не мог придумать ответ, я буду все еще любить знать, разрабатываете ли Вы его.:)
Я не могу сказать от деталей, но Вы устанавливаете родителя маркировки Вам sub панель? Если во время проектирования, Вы, возможно, должны написать код в своем основном компоненте (например, контейнер, в котором находятся Ваши панели), для выяснения, какая подпанель принимает компонент и установила маркировки, порождает свойство к той подпанели.
Я вполне уверен, метод уведомления называют, когда компонент добавлен или удален из другого компонента, это должно помочь Вам разыскать, куда необходимо поместить код.