2015-12-13 2 views
0

Я строй инструмента, который посылает запрос, кроме моего запроса браузера, используя TIdMappedPortTCP от Indy 9.Memo Line Breaks

Я хочу использовать строку #$d#$A (разрывы строк), написав его в записке, как %0D%0A , но это не работает нормально, как вы можете видеть на изображении.

Каков правильный код, который я должен использовать, чтобы сделать эту работу?

procedure TForm1.IdMappedPortTCP1Execute(AThread: TIdMappedPortThread); 
var 
    memo:string; 
begin 
    memo:= Memo1.text; 
    if Combobox4.text='Back' then begin 
    AThread.NetData := AThread.NetData +memo ; 
    form2.Memo1.Lines.Add(AThread.NetData); 

IdMappedPortTCP request & log

ответ

2

TIdMappedPortTCP является многопоточной компонентом. Событие OnExecute запускается в контексте рабочего потока. Вы НЕ МОЖЕТЕ получить доступ к своим TMemo и TComboBox элементам управления, как показано на рисунке. Вы ДОЛЖНЫ синхронизироваться с потоком пользовательского интерфейса для безопасного и правильного доступа к ним.

Попробуйте что-то больше, как это:

uses 
    ..., IdSync; 

type 
    TGetForm1BackMemoTextSync = class(TIdSync) 
    protected 
    FText: string; 
    procedure DoSynchronize; override; 
    public 
    class function GetText: string; 
    end; 

    TAddToForm2MemoSync = class(TIdSync) 
    protected 
    FText: string; 
    procedure DoSynchronize; override; 
    public 
    class procedure AddToMemo(const S: string); 
    end; 

procedure TGetForm1BackMemoTextSync.DoSynchronize; 
begin 
    if Form1.ComboBox4.Text = 'Back' then 
    FText := Form1.Memo1.Text; 
end; 

class function TGetForm1BackMemoTextSync.GetText: string; 
begin 
    with Create do 
    try 
    Synchronize; 
    Result := FText; 
    finally 
    Free; 
    end; 
end; 

procedure TAddToForm2MemoSync.DoSynchronize; 
begin 
    Form2.Memo1.Lines.Add(FText); 
end; 

class procedure TAddToForm2MemoSync.AddToMemo(const S: string); 
begin 
    with Create do 
    try 
    FText := S; 
    Synchronize; 
    finally 
    Free; 
    end; 
end; 

//... 

procedure TForm1.IdMappedPortTCP1Execute(AThread: TIdMappedPortThread); 
var 
    memo: string; 
begin 
    memo := TGetMemoBackTextSync.GetText; 
    if memo <> '' then begin 
    AThread.NetData := AThread.NetData + memo; 
    TAddToForm2MemoSync.AddToMemo(AThread.NetData); 
    //... 
end; 

С учетом сказанного, вы не должны помещать %0D%0A в тексте Memo на всех. Каждая строка в заметке уже разделяется разрывом строки. Чтение свойства Memo.Text возвращает строку, в которой каждая строка разделяется значением константы RTL sLineBreak (которая определена как #13#10 для Windows). Поэтому просто опустите %0D%0A из вашего текста и введите вместо этого естественные разрывы строк, и пусть RTL обрабатывает остальное для вас.

Если вы абсолютно необходимо держать %0D%0A в тексте, вам придется сдирать родные разрывы строк, а затем преобразовать %0D%0A в родной линии ломает вручную, например:

procedure TGetForm1BackMemoTextSync.DoSynchronize; 
begin 
    if Form1.ComboBox4.Text = 'Back' then 
    begin 
    FText := StringReplace(Form1.Memo1.Text, sLineBreak, '', [rfReplaceAll]); 
    FText := StringReplace(FText, '%0D%0A', #13#10, [rfReplaceAll]); 
    end; 
end;