Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

Скроллинг в Мемо   Найти похожие ветки 

 
Rule ©   (2005-03-16 11:11) [0]

у меня выполняется консольное приложение и оно выдет результаты... я их перехватываю и записываю в мемо, но одна проблемма как мне сделать скроллинг, я после каждой порции записаной информации в мемо перехожу на последнюю строку в Мемо, но при следующем запуске Memo1.Lines.text:=Memo1.Lines.text+buffer; текст в Мемо листается опять на начало .... и естественно возникает неприятный эфект поргания, чего делать ??? подскажите, метод add  не помогает, так как он вставляет символ конца строки ... а эти символы уже есть в тексте который я вередаю ...

Помогите пожалуйста ...


 
Rule ©   (2005-03-16 11:13) [1]

собственно функция

function GetDosOutput(const CommandLine: string; var M:TMemo): string;
var
 SA: TSecurityAttributes;
 SI: TStartupInfo;
 PI: TProcessInformation;
 StdOutPipeRead, StdOutPipeWrite: THandle;
 WasOK: Boolean;
 Buffer: array[0..255] of Char;
 BytesRead: Cardinal;
 WorkDir, Line: string;
begin
 Application.ProcessMessages;
 with SA do
 begin
   nLength := SizeOf(SA);
   bInheritHandle := True;
   lpSecurityDescriptor := nil;
 end;
 // созда?м пайп для перенаправления стандартного вывода
 CreatePipe(StdOutPipeRead, // дескриптор чтения
   StdOutPipeWrite, // дескриптор записи
   @SA, // аттрибуты безопасности
   0 // количество байт принятых для пайпа - 0 по умолчанию
   );
 try
   // Созда?м дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
   // а так же проверяем, чтобы он не показывался на экране.
   with SI do
   begin
     FillChar(SI, SizeOf(SI), 0);
     cb := SizeOf(SI);
     dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
     wShowWindow := SW_HIDE;
     hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем
     hStdOutput := StdOutPipeWrite;
     hStdError := StdOutPipeWrite;
   end;

   // Запускаем компилятор из командной строки
   WorkDir := ExtractFilePath(CommandLine);
   WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, nil, SI, PI);

   // Теперь, когда дескриптор получен, для безопасности закрываем запись.
   // Нам не нужно, чтобы произошло случайное чтение или запись.
   CloseHandle(StdOutPipeWrite);
   // если процесс может быть создан, то дескриптор, это его вывод
   if not WasOK then
     raise Exception.Create("Could not execute command line!")
   else
   try
       // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено
     Line := "";
     M.Lines.Text:="";
     repeat
         // читаем блок символов (могут содержать возвраты каретки и переводы строки)
       WasOK := ReadFile(StdOutPipeRead, Buffer, 10, BytesRead, nil);

         // есть ли что-нибудь ещ? для чтения?
       if BytesRead > 0 then
       begin
           // завершаем буфер PChar-ом
         Buffer[BytesRead] := #0;
         OemToAnsi(Buffer, Buffer);
           // добавляем буфер в общий вывод
         Line := Line + Buffer;
         M.Lines.Text:=M.Lines.Text+Buffer;
         M.SelStart:=M.SelStart+10;
         with M do
           begin
             SelStart := Length(Text);
             Perform(EM_SCROLLCARET, 0, 0);
           end;                                
         //SendMessage(M.Handle, EM_SCROLL, SB_LINEDOWN, 0);
         Application.ProcessMessages;
       end;
     until not WasOK or (BytesRead = 0);
       // жд?м, пока завершится консольное приложение
     WaitForSingleObject(PI.hProcess, INFINITE);
   finally
       // Закрываем все оставшиеся дескрипторы
     CloseHandle(PI.hThread);
     CloseHandle(PI.hProcess);
   end;
 finally
   result := Line;
   CloseHandle(StdOutPipeRead);
 end;
end;


 
Rouse_ ©   (2005-03-16 11:35) [2]

M.Lises.BeginUpdate;
// добавляешь
SendMessage(M.Handle, WM_VSCROLL,SB_BOTTOM,0);
M.Lises.EndUpdate;


 
Rouse_ ©   (2005-03-16 11:36) [3]

> метод add  не помогает, так как он вставляет символ конца
> строки ... а эти символы уже есть в тексте который я вередаю

А еще проще - удалять #13#10 из строки пред Add


 
Rule ©   (2005-03-16 11:46) [4]

Rouse_ ©   (16.03.05 11:36) [3]
думал об этом ... както непрофессионально получается ... надо стремится к правильному коду :-) ... Спасибо Саня, первый вариант отлично работает :-)



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
1-1110215606
Viktop
2005-03-07 20:13
2005.03.27
Ресурсы и рисунки


3-1109500901
xman
2005-02-27 13:41
2005.03.27
Создание схемы в базе ORACLE


14-1110382866
bish0p
2005-03-09 18:41
2005.03.27
A4tech Anti-RSI Keyboard


8-1102973918
Ghost_1980
2004-12-14 00:38
2005.03.27
работа с BMP-файлом


3-1109097567
Nesterov
2005-02-22 21:39
2005.03.27
Доступ к БД по сети клиентского приложения