Каков самый быстрый способ разделить не алфавитно-цифровые символы от строки в Delphi7?

Я предполагаю, что вы можете использовать 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"

В общем, когда у вас есть такие проблемы, вы пытаетесь извлечь данные из ваших наблюдаемых слишком рано. У вас может быть лучшее решение с некоторым рефакторингом, где вы бы избежали подписки. Но без полного кода трудно сказать, как ...

5
задан David Segonds 22 February 2009 в 09:53
поделиться

4 ответа

uses JclStrings;

  S := StrKeepChars('mystring', ['A'..'Z', 'a'..'z', '0'..'9']);
10
ответ дан 18 December 2019 в 06:36
поделиться

Если я понимаю Вас правильно, Вы могли бы использовать функцию как это:

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, у кого-либо есть идея, как отформатировать это способом что выделяющиеся работы правильно?

10
ответ дан 18 December 2019 в 06:36
поделиться

Событие OnKeypress

начните если не (ключ ['A'.. 'Z', 'a'.. 'z', '0'.. '9']) затем Ключ: = № 0; конец;

1
ответ дан 18 December 2019 в 06:36
поделиться

Только добавить комментарий.

Решение с помощью набора прекрасно в 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 в нескольких местоположениях и если он должен быть изменен, только необходимо изменить его однажды.

3
ответ дан 18 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

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