Я предполагаю, что вы можете использовать BehaviorSubject
здесь:
showContent = new BehaviorSubject(false)
...
this.httpDataHandler.get<...>(...).subscribe(response => {
// lots of stuff
showContent.next(true);
});
...
*ngIf="showContent | async"
или использовать ChangeDetectorRef
constructor(private cdr: ChangeDetectorRef) {}
...
this.httpDataHandler.get<...>(...).subscribe(response => {
// lots of stuff
showContent = true;
this.cdr.markForCheck();
});
...
*ngIf="showContent"
В общем, когда у вас есть такие проблемы, вы пытаетесь извлечь данные из ваших наблюдаемых слишком рано. У вас может быть лучшее решение с некоторым рефакторингом, где вы бы избежали подписки. Но без полного кода трудно сказать, как ...
uses JclStrings;
S := StrKeepChars('mystring', ['A'..'Z', 'a'..'z', '0'..'9']);
Если я понимаю Вас правильно, Вы могли бы использовать функцию как это:
function StripNonAlphaNumeric(const AValue: string): string;
var
SrcPtr, DestPtr: PChar;
begin
SrcPtr := PChar(AValue);
SetLength(Result, Length(AValue));
DestPtr := PChar(Result);
while SrcPtr <> #0 do begin
if SrcPtr[0] in ['a'..'z', 'A'..'Z', '0'..'9'] then begin
DestPtr[0] := SrcPtr[0];
Inc(DestPtr);
end;
Inc(SrcPtr);
end;
SetLength(Result, DestPtr - PChar(Result));
end;
Это будет использовать PChar для самой высокой скорости (за счет меньшего количества readibility).
Править: Ре комментарий gabr об использовании DestPtr[0] вместо DestPtr^: Это должно скомпилировать в те же байты так или иначе, но существуют хорошие приложения в подобном коде, где необходимо смотреть вперед. Предположим, что Вы хотели бы заменить новые строки, затем Вы могли сделать что-то как
function ReplaceNewlines(const AValue: string): string;
var
SrcPtr, DestPtr: PChar;
begin
SrcPtr := PChar(AValue);
SetLength(Result, Length(AValue));
DestPtr := PChar(Result);
while SrcPtr <> #0 do begin
if (SrcPtr[0] = #13) and (SrcPtr[1] = #10) then begin
DestPtr[0] := '\';
DestPtr[1] := 't';
Inc(SrcPtr);
Inc(DestPtr);
end else
DestPtr[0] := SrcPtr[0];
Inc(SrcPtr);
Inc(DestPtr);
end;
SetLength(Result, DestPtr - PChar(Result));
end;
и поэтому я обычно не использую ^.
BTW, у кого-либо есть идея, как отформатировать это способом что выделяющиеся работы правильно?
Событие OnKeypress
начните если не (ключ ['A'.. 'Z', 'a'.. 'z', '0'.. '9']) затем Ключ: = № 0; конец;
Только добавить комментарий.
Решение с помощью набора прекрасно в Delphi 7, но это может вызвать некоторые проблемы в Delphi 2009, потому что наборы не могут иметь символа (они преобразовываются в ansichar).
Решение, которое можно использовать:
case key of
'A'..'Z', 'a'..'z', '0'..'9' : begin end; // No action
else
Key := #0;
end;
Но самый универсальный путь, конечно:
if not ValidChar(key) then
Key := #0;
В этом случае можно использовать ValidChar в нескольких местоположениях и если он должен быть изменен, только необходимо изменить его однажды.